diff --git a/README.md b/README.md index 1f4b447..abdc4b8 100644 --- a/README.md +++ b/README.md @@ -1889,7 +1889,22 @@ Ausstellung scheitern. Darauf weist der Bericht hin. In der Oberfläche steckt derselbe Bericht unter **Firewall prüfen**, samt Rückfrage, ob die fehlenden Freigaben gleich gesetzt werden sollen. Die -Schalter dazu liegen unter **Einstellungen → Firewall: was offen sein muss**. +Schalter liegen unter **Einstellungen → Firewall: was offen sein muss**, und +dort stehen auch zwei Aktionen: + +| Menüpunkt | was er tut | +|---|---| +| `>> Firewall jetzt prüfen` | derselbe Bericht wie `firewall check` | +| `>> Firewall-Regeln übernehmen (Ports öffnen)` | fragt erst nach einem Quellnetz, zeigt **danach** die Kommandos, die genau so ausgeführt werden, und setzt sie nach Bestätigung | + +Die Reihenfolge ist Absicht: das Quellnetz ändert die Kommandos, deshalb wird +es vor der Anzeige erfragt – was im Fenster steht, wird auch ausgeführt. Ohne +`root` wird über `sudo` neu aufgerufen. Zum Schluss zeigt die Oberfläche den +Stand danach, damit man nicht raten muss, ob es gewirkt hat. + +> Sind die `FW_*`-Schlüssel in einer älteren `.env` noch nicht vorhanden, steht +> im Menü `` – es gelten dann die Vorgaben (`single`, alles aus). Sobald +> ein Wert gesetzt wird, landet der Schlüssel in der `.env`. ### Von Hand diff --git a/README_en.md b/README_en.md index 258e4e8..67336bd 100644 --- a/README_en.md +++ b/README_en.md @@ -1882,7 +1882,21 @@ restriction makes issuance fail. The report points this out. The GUI offers the same report under **Firewall prüfen**, including a prompt to set the missing rules right away. The switches live under **Einstellungen → -Firewall: was offen sein muss**. +Firewall: was offen sein muss**, which also holds two actions: + +| Menu entry | what it does | +|---|---| +| `>> Firewall jetzt pruefen` | the same report as `firewall check` | +| `>> Firewall-Regeln uebernehmen (Ports oeffnen)` | asks for a source network first, **then** shows the commands that will run verbatim, and applies them after confirmation | + +The order is deliberate: the source network changes the commands, so it is +asked before they are shown – what you see in the window is what runs. Without +`root` the call is repeated through `sudo`. Afterwards the GUI shows the state +that resulted, so you do not have to guess whether it worked. + +> If an older `.env` does not have the `FW_*` keys yet, the menu shows +> `` – the defaults apply then (`single`, everything off). As soon as a +> value is set, the key is written to `.env`. ### By hand diff --git a/scripts/cmk-manage.sh b/scripts/cmk-manage.sh index 4600b9b..ea5e2ef 100755 --- a/scripts/cmk-manage.sh +++ b/scripts/cmk-manage.sh @@ -2966,11 +2966,11 @@ cert|CERT_DOMAIN|text|FQDN fuer selbstsignierte Zertifikate|| cert|CERT_DAYS|int|Gueltigkeit in Tagen|| cert|CERT_COUNTRY|text|Laenderkuerzel|| cert|CERT_ORG|text|Organisation|| -firewall|FW_ROLE|choice|Rolle im verteilten Monitoring|single:central:remote| -firewall|FW_EC_SYSLOG|choice|Event Console: Syslog annehmen (514)|off:udp:tcp:beide| -firewall|FW_EC_SNMPTRAP|choice|Event Console: SNMP-Traps (162/udp)|off:on| -firewall|FW_EC_TCP|choice|Event Console: Status ueber TCP (6558)|off:on| -firewall|FW_AGENT|choice|Checkmk-Agent auf diesem Host (6556)|off:on| +firewall|FW_ROLE|choice|Rolle im verteilten Monitoring (leer = single)|single:central:remote|1 +firewall|FW_EC_SYSLOG|choice|Event Console: Syslog 514 (leer = aus)|off:udp:tcp:beide|1 +firewall|FW_EC_SNMPTRAP|choice|Event Console: SNMP-Traps 162/udp (leer = aus)|off:on|1 +firewall|FW_EC_TCP|choice|Event Console: Status ueber TCP 6558 (leer = aus)|off:on|1 +firewall|FW_AGENT|choice|Checkmk-Agent dieses Hosts 6556 (leer = aus)|off:on|1 firewall|FW_EXTRA_PORTS|text|Weitere Ports (3000/tcp=Grafana,...)||1 EOF } @@ -4784,6 +4784,8 @@ gui_settings_category() { items+=("__npm__" ">> Proxy Manager: Stand und Admin-Port anzeigen") items+=("__npmrst__" ">> Datenbank zuruecksetzen (Konto neu anlegen lassen)") ;; backup) items+=("__jobs__" ">> Backup-Jobs verwalten") ;; + firewall) items+=("__fwcheck__" ">> Firewall jetzt pruefen") + items+=("__fwapply__" ">> Firewall-Regeln uebernehmen (Ports oeffnen)") ;; esac items+=("back" "zurueck") local sel @@ -4796,6 +4798,8 @@ gui_settings_category() { __npmrst__) gui_npm_reset || true; continue ;; __test__) gui_image_test || true; continue ;; __jobs__) gui_jobs_menu || true; continue ;; + __fwcheck__) gui_firewall || true; continue ;; + __fwapply__) gui_firewall_apply || true; continue ;; __npm__) local f; f="$(mktemp)" { NO_COLOR=1 cmd_npm_enable; NO_COLOR=1 cmd_npm_port; } >"$f" 2>&1 || true ui_text "NGINX Proxy Manager" "$f"; rm -f "$f"; continue ;; @@ -5118,6 +5122,7 @@ gui_cert() { ui_run "Zertifikat erzeugen" bash -c "cd '$PROJECT_DIR' && '$SELF' cert --domain '$domain' --days '$days' ${a[*]+${a[*]}}" } +# Bericht anzeigen; fehlt etwas, das Uebernehmen anbieten gui_firewall() { local tmp rc=0 tmp="$(mktemp)" @@ -5131,27 +5136,54 @@ gui_firewall() { ui_yesno "Firewall" "Es fehlen Freigaben. -Sollen die benoetigten Ports jetzt geoeffnet werden? -Die Regeln werden dauerhaft gesetzt." || return 0 +Die benoetigten Ports jetzt oeffnen?" || return 0 + gui_firewall_apply +} - local src="" - if ui_yesno "Firewall" "Nur fuer ein bestimmtes Quellnetz freigeben? +# Regeln uebernehmen. Erst wird gefragt, ob auf ein Quellnetz begrenzt +# werden soll - denn davon haengen die Kommandos ab, die danach zur +# Bestaetigung angezeigt werden. Was dort steht, wird auch ausgefuehrt. +gui_firewall_apply() { + local src="" tmp rc=0 + if ui_yesno "Firewall-Regeln uebernehmen" "Nur fuer ein bestimmtes Quellnetz freigeben? Ja = nur dieses Netz darf zugreifen Nein = Freigabe fuer alle Quellen"; then - src="$(ui_input "Firewall" "Quellnetz in CIDR-Schreibweise:" "$(primary_ip | sed 's/\.[0-9]*$/.0\/24/')")" || src="" + src="$(ui_input "Firewall-Regeln uebernehmen" "Quellnetz in CIDR-Schreibweise:" \ + "$(primary_ip | sed 's/\.[0-9]*$/.0\/24/')")" || return 0 + [ -n "$src" ] || return 0 fi - local -a a=(firewall open --apply --yes) - if [ -n "$src" ]; then a+=(--source "$src"); fi + local -a opt=(open) + if [ -n "$src" ]; then opt+=(--source "$src"); fi + + tmp="$(mktemp)" + cmd_firewall "${opt[@]}" >"$tmp" 2>&1 || rc=$? + if [ "$rc" -eq 0 ]; then + ui_text "Firewall - nichts zu tun" "$tmp" + rm -f "$tmp"; return 0 + fi + ui_text "Firewall - diese Regeln werden gesetzt" "$tmp" + rm -f "$tmp" + + ui_yesno "Firewall-Regeln uebernehmen" "Die angezeigten Regeln jetzt dauerhaft setzen?" || return 0 + + local -a a=(firewall "${opt[@]}" --apply --yes) if [ "$(id -u)" -eq 0 ]; then - ui_run "Firewall freigeben" "$SELF" "${a[@]}" || true + ui_run "Firewall-Regeln uebernehmen" "$SELF" "${a[@]}" || true elif command -v sudo >/dev/null 2>&1; then gui_run_interactive sudo -- "$SELF" "${a[@]}" else ui_msg "Firewall" "Dafuer werden root-Rechte benoetigt. Bitte als root erneut aufrufen." + return 0 fi + + # Zeigen, was dabei herausgekommen ist + tmp="$(mktemp)" + cmd_firewall check >"$tmp" 2>&1 || true + ui_text "Firewall - Stand danach" "$tmp" + rm -f "$tmp" return 0 } @@ -5317,10 +5349,12 @@ fw_detect() { # sie oft in verschiedenen Zonen - dann sagt die Standardzone allein # nichts darueber aus, ob ein Port erreichbar ist. fw_zones() { + if [ -n "${_FW_ZONES:-}" ]; then printf '%s\n' "$_FW_ZONES"; return 0; fi local z z="$(firewall-cmd --get-active-zones 2>/dev/null | grep -v '^[[:space:]]' || true)" if [ -z "$z" ]; then z="$(firewall-cmd --get-default-zone 2>/dev/null || true)"; fi - printf '%s\n' "$z" | sed '/^$/d' + _FW_ZONES="$(printf '%s\n' "$z" | sed '/^$/d')" + printf '%s\n' "$_FW_ZONES" } # Dienstnamen von firewalld auf port/protokoll abbilden @@ -5532,6 +5566,8 @@ cmd_firewall() { done local be role; be="$(fw_detect)" + # Zonen einmal ermitteln - sonst fragt jede Regelzeile erneut nach + if [ "$be" = firewalld ]; then _FW_ZONES=""; _FW_ZONES="$(fw_zones)"; fi role="$(fw_lc "${FW_ROLE:-single}")" case "$role" in central|remote) : ;; *) role=single ;; esac @@ -5640,6 +5676,11 @@ cmd_firewall() { || warn "Neuladen fehlgeschlagen." fi ok "Regeln gesetzt." + echo + # Gesetzt ist gesetzt - der Rueckgabewert darf jetzt nicht mehr + # den urspruenglichen Befund melden, sonst liest die Oberflaeche + # das als fehlgeschlagen. + return 0 else printf '\n Automatisch setzen: %s firewall open --apply\n' "$SELF" printf ' Nur fuer ein Netz : %s firewall open --apply --source 10.0.0.0/24\n' "$SELF"