Optionalen HTTP(S)-Proxy ueber .env unterstuetzen

- .env: HTTP_PROXY, HTTPS_PROXY, NO_PROXY (leer = kein Proxy)
- Image-Build: Proxy als Build-Argumente (dnf, apt, pip)
- Laufzeit: Manager und Dashboard bekommen den Proxy (Wazuh-Feeds, Update-Check);
  interne Dienstnamen stehen immer in NO_PROXY
- setup.sh: exportiert den Proxy (Podman-Pulls/-Builds), reicht ihn ans
  Zertifikat-Tool weiter, warnt bei Docker-Daemon ohne Proxy, uebernimmt beim
  ersten Lauf einen Proxy aus der Shell und ergaenzt neue Schluessel in bestehenden .env
- README: Abschnitt Proxy

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-10-07 12:57:55 +02:00
co-authored by Claude Opus 5.5
parent 61232af61c
commit e6aad53fb5
4 changed files with 115 additions and 3 deletions
+9
View File
@@ -4,6 +4,15 @@ DASHBOARD_PORT=443
INDEXER_HEAP=1g INDEXER_HEAP=1g
COLLECTOR_MAX_LOG_MB=50 COLLECTOR_MAX_LOG_MB=50
# Optionaler HTTP(S)-Proxy, falls der Server nicht direkt ins Internet kommt.
# Leer lassen = kein Proxy. Beispiel: HTTP_PROXY=http://proxy.firma.local:3128
# Genutzt fuer: Image-Build (dnf/apt/pip), Zertifikat-Tool, Wazuh-Feeds (Schwachstellen, Updates),
# unter Podman auch fuer das Laden der Images. SSH zu den Hosts laeuft nie ueber den Proxy.
# NO_PROXY: zusaetzliche Ausnahmen; die internen Dienstnamen sind immer ausgenommen.
HTTP_PROXY=
HTTPS_PROXY=
NO_PROXY=
# Werden von ./setup.sh zufaellig erzeugt # Werden von ./setup.sh zufaellig erzeugt
INDEXER_PASSWORD= INDEXER_PASSWORD=
DASHBOARD_PASSWORD= DASHBOARD_PASSWORD=
+23
View File
@@ -80,6 +80,29 @@ unangetastet. Mit `CONTAINER_ENGINE=docker|podman` lässt sich die Erkennung üb
nano hosts.yml # Hosts eintragen (siehe hosts.yml.example) nano hosts.yml # Hosts eintragen (siehe hosts.yml.example)
``` ```
### Proxy (optional)
Kommt der Server nur über einen Proxy ins Internet, trägst du ihn in `.env` ein:
```bash
cp .env.example .env # nur vor dem allerersten ./setup.sh nötig
nano .env # HTTP_PROXY=http://proxy.firma.local:3128, HTTPS_PROXY=..., ggf. NO_PROXY=...
```
Alternativ übernimmt `./setup.sh` beim ersten Lauf `HTTP_PROXY`/`HTTPS_PROXY` aus der Shell.
Genutzt wird der Proxy für:
- Image-Build (`dnf`, `apt`, `pip`) und das Zertifikat-Tool
- Laufzeit: Manager und Dashboard (Schwachstellen-Feeds von cti.wazuh.com, Update-Check)
- Podman: auch für das Laden der Images
Die internen Dienstnamen (`wazuh.manager`, `wazuh.indexer`, …) sind immer in `NO_PROXY`. SSH
zu den Hosts läuft nie über den Proxy.
**Docker:** Images lädt der Docker-Daemon, nicht der Container. Ohne Daemon-Proxy gibt
`setup.sh` eine Warnung mit der fertigen systemd-Konfiguration aus. `setup.sh` ändert die nicht
selbst, weil ein Neustart von Docker alle Container auf dem Server neu startet.
### Red Hat / Podman ### Red Hat / Podman
```bash ```bash
+26
View File
@@ -15,6 +15,12 @@ services:
dockerfile: manager/Dockerfile dockerfile: manager/Dockerfile
args: args:
WAZUH_VERSION: ${WAZUH_VERSION} WAZUH_VERSION: ${WAZUH_VERSION}
HTTP_PROXY: ${HTTP_PROXY}
HTTPS_PROXY: ${HTTPS_PROXY}
NO_PROXY: ${NO_PROXY}
http_proxy: ${HTTP_PROXY}
https_proxy: ${HTTPS_PROXY}
no_proxy: ${NO_PROXY}
image: localhost/sshpull/wazuh-manager:${WAZUH_VERSION} image: localhost/sshpull/wazuh-manager:${WAZUH_VERSION}
hostname: wazuh.manager hostname: wazuh.manager
restart: always restart: always
@@ -41,6 +47,13 @@ services:
- SSL_KEY=/etc/ssl/filebeat.key - SSL_KEY=/etc/ssl/filebeat.key
- API_USERNAME=wazuh-wui - API_USERNAME=wazuh-wui
- API_PASSWORD=${API_PASSWORD} - API_PASSWORD=${API_PASSWORD}
# optionaler Proxy (.env); interne Namen nie ueber den Proxy
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTPS_PROXY}
- NO_PROXY=wazuh.manager,wazuh.indexer,wazuh.dashboard,sshpull.collector,localhost,127.0.0.1,${NO_PROXY}
- http_proxy=${HTTP_PROXY}
- https_proxy=${HTTPS_PROXY}
- no_proxy=wazuh.manager,wazuh.indexer,wazuh.dashboard,sshpull.collector,localhost,127.0.0.1,${NO_PROXY}
volumes: volumes:
- wazuh_api_configuration:/var/ossec/api/configuration - wazuh_api_configuration:/var/ossec/api/configuration
- wazuh_etc:/var/ossec/etc - wazuh_etc:/var/ossec/etc
@@ -99,6 +112,12 @@ services:
- DASHBOARD_PASSWORD=${DASHBOARD_PASSWORD} - DASHBOARD_PASSWORD=${DASHBOARD_PASSWORD}
- API_USERNAME=wazuh-wui - API_USERNAME=wazuh-wui
- API_PASSWORD=${API_PASSWORD} - API_PASSWORD=${API_PASSWORD}
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTPS_PROXY}
- NO_PROXY=wazuh.manager,wazuh.indexer,wazuh.dashboard,sshpull.collector,localhost,127.0.0.1,${NO_PROXY}
- http_proxy=${HTTP_PROXY}
- https_proxy=${HTTPS_PROXY}
- no_proxy=wazuh.manager,wazuh.indexer,wazuh.dashboard,sshpull.collector,localhost,127.0.0.1,${NO_PROXY}
volumes: volumes:
- ./config/wazuh_indexer_ssl_certs/wazuh.dashboard.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard.pem:ro,z - ./config/wazuh_indexer_ssl_certs/wazuh.dashboard.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard.pem:ro,z
- ./config/wazuh_indexer_ssl_certs/wazuh.dashboard-key.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard-key.pem:ro,z - ./config/wazuh_indexer_ssl_certs/wazuh.dashboard-key.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard-key.pem:ro,z
@@ -114,6 +133,13 @@ services:
build: build:
context: . context: .
dockerfile: collector/Dockerfile dockerfile: collector/Dockerfile
args:
HTTP_PROXY: ${HTTP_PROXY}
HTTPS_PROXY: ${HTTPS_PROXY}
NO_PROXY: ${NO_PROXY}
http_proxy: ${HTTP_PROXY}
https_proxy: ${HTTPS_PROXY}
no_proxy: ${NO_PROXY}
image: localhost/sshpull/collector:latest image: localhost/sshpull/collector:latest
hostname: sshpull.collector hostname: sshpull.collector
restart: always restart: always
+57 -3
View File
@@ -32,6 +32,7 @@ is_root() { [ "$(id -u)" -eq 0 ]; }
ENGINE="" ENGINE=""
DC=() DC=()
SELINUX=no SELINUX=no
PROXY_ARGS=()
detect_runtime() { detect_runtime() {
[ -n "$ENGINE" ] && return [ -n "$ENGINE" ] && return
@@ -71,6 +72,10 @@ detect_runtime() {
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
SELINUX=yes # docker-compose.yml nutzt ":z" auf allen Bind-Mounts SELINUX=yes # docker-compose.yml nutzt ":z" auf allen Bind-Mounts
fi fi
sync_env_keys
load_proxy
check_docker_proxy
} }
check_rootless() { check_rootless() {
@@ -96,7 +101,44 @@ set_env() { # set_env KEY VALUE
if grep -q "^$1=" .env; then sed -i "s|^$1=.*|$1=$2|" .env; else echo "$1=$2" >> .env; fi if grep -q "^$1=" .env; then sed -i "s|^$1=.*|$1=$2|" .env; else echo "$1=$2" >> .env; fi
} }
env_get() { grep "^$1=" .env 2>/dev/null | cut -d= -f2-; } env_get() { grep "^$1=" .env 2>/dev/null | cut -d= -f2- || true; }
INTERNAL_NO_PROXY="wazuh.manager,wazuh.indexer,wazuh.dashboard,sshpull.collector,localhost,127.0.0.1"
sync_env_keys() {
# Neue Schluessel aus .env.example in eine bestehende .env uebernehmen (leer bzw. Default)
[ -f .env ] || return 0
local line key
while IFS= read -r line; do
[[ $line =~ ^([A-Z_]+)= ]] || continue
key=${BASH_REMATCH[1]}
grep -q "^$key=" .env || { echo "$line" >> .env; info ".env: $key ergaenzt"; }
done < .env.example
}
load_proxy() {
# Proxy aus .env in die Umgebung dieses Skripts: Podman nutzt ihn fuer Pull und Build,
# "run" reicht ihn an das Zertifikat-Tool weiter.
local hp hsp np
hp=$(env_get HTTP_PROXY); hsp=$(env_get HTTPS_PROXY); np=$(env_get NO_PROXY)
[ -n "$hp$hsp" ] || return 0
export HTTP_PROXY="$hp" http_proxy="$hp" HTTPS_PROXY="$hsp" https_proxy="$hsp"
export NO_PROXY="$INTERNAL_NO_PROXY${np:+,$np}" no_proxy="$INTERNAL_NO_PROXY${np:+,$np}"
PROXY_ARGS=(-e HTTP_PROXY -e HTTPS_PROXY -e NO_PROXY -e http_proxy -e https_proxy -e no_proxy)
}
check_docker_proxy() {
# Docker laedt Images ueber den Daemon, nicht ueber die Umgebung dieses Skripts
[ "$ENGINE" = docker ] && [ -n "${HTTPS_PROXY:-}${HTTP_PROXY:-}" ] || return 0
[ -n "$(docker info --format '{{.HTTPSProxy}}{{.HTTPProxy}}' 2>/dev/null)" ] && return 0
warn "Proxy in .env gesetzt, aber der Docker-Daemon hat keinen (Image-Pulls brauchen ihn)."
warn "Als root /etc/systemd/system/docker.service.d/http-proxy.conf mit diesem Inhalt anlegen:"
{
echo " [Service]"
echo " Environment=\"HTTP_PROXY=${HTTP_PROXY:-}\" \"HTTPS_PROXY=${HTTPS_PROXY:-}\" \"NO_PROXY=localhost,127.0.0.1\""
} >&2
warn "Dann: systemctl daemon-reload && systemctl restart docker (startet alle Container neu)"
}
tune_kernel() { tune_kernel() {
local mmc local mmc
@@ -147,6 +189,7 @@ cmd_info() {
echo "SELinux: $SELINUX" echo "SELinux: $SELINUX"
echo "root: $(is_root && echo ja || echo nein)" echo "root: $(is_root && echo ja || echo nein)"
echo "max_map: $(cat /proc/sys/vm/max_map_count)" echo "max_map: $(cat /proc/sys/vm/max_map_count)"
echo "Proxy: ${HTTPS_PROXY:-${HTTP_PROXY:-keiner}}${NO_PROXY:+ (NO_PROXY=$NO_PROXY)}"
} }
cmd_init() { cmd_init() {
@@ -156,7 +199,18 @@ cmd_init() {
tune_kernel tune_kernel
# --- .env + Passwoerter ------------------------------------------------- # --- .env + Passwoerter -------------------------------------------------
[ -f .env ] || cp .env.example .env if [ ! -f .env ]; then
cp .env.example .env
# Proxy aus der Shell uebernehmen (z.B. export HTTPS_PROXY=... vor dem ersten Setup)
local k v
for k in HTTP_PROXY HTTPS_PROXY NO_PROXY; do
v=$(printenv "$k" || printenv "${k,,}" || true)
if [ -n "$v" ]; then set_env "$k" "$v"; info ".env: $k aus der Umgebung uebernommen"; fi
done
fi
sync_env_keys
load_proxy
check_docker_proxy
for k in INDEXER_PASSWORD DASHBOARD_PASSWORD API_PASSWORD; do for k in INDEXER_PASSWORD DASHBOARD_PASSWORD API_PASSWORD; do
if [ -z "$(env_get $k)" ]; then set_env "$k" "$(genpw)"; info "$k erzeugt"; fi if [ -z "$(env_get $k)" ]; then set_env "$k" "$(genpw)"; info "$k erzeugt"; fi
done done
@@ -202,7 +256,7 @@ EOF
if [ ! -f config/wazuh_indexer_ssl_certs/root-ca.pem ]; then if [ ! -f config/wazuh_indexer_ssl_certs/root-ca.pem ]; then
info "Erzeuge TLS-Zertifikate" info "Erzeuge TLS-Zertifikate"
mkdir -p config/wazuh_indexer_ssl_certs mkdir -p config/wazuh_indexer_ssl_certs
engine run --rm \ engine run --rm "${PROXY_ARGS[@]}" \
-e CERT_TOOL_VERSION="${version%.*}" \ -e CERT_TOOL_VERSION="${version%.*}" \
-v "$PWD/config/wazuh_indexer_ssl_certs/:/certificates/:z" \ -v "$PWD/config/wazuh_indexer_ssl_certs/:/certificates/:z" \
-v "$PWD/config/certs.yml:/config/certs.yml:ro,z" \ -v "$PWD/config/certs.yml:/config/certs.yml:ro,z" \