diff --git a/README.md b/README.md index 677bff8..a92270b 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ cd adguard-shield GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o adguard-shield ./cmd/adguard-shieldd ``` +Benötigt wird Go 1.26.9 oder neuer (ältere 1.26.x-Patchversionen enthalten bekannte Sicherheitslücken in der Standardbibliothek). `go.mod` gibt `toolchain go1.26.9` vor; bei älterem lokalem Go lädt `go` diese Toolchain automatisch nach, sofern `GOTOOLCHAIN` nicht auf `local` steht. + ### Variante C: Ohne lokales Go per Docker bauen ```bash diff --git a/adguard-shield.conf b/adguard-shield.conf index 3fba468..591b29d 100644 --- a/adguard-shield.conf +++ b/adguard-shield.conf @@ -7,7 +7,7 @@ ADGUARD_URL="https://dns1.domain.com" ADGUARD_USER="admin" ADGUARD_PASS='changeme' -ADGUARD_TLS_INSECURE=true # TLS-Zertifikat der AdGuard-API nicht prüfen (selbstsigniert); gilt nur für die AdGuard-API +ADGUARD_TLS_INSECURE=false # true = TLS-Zertifikat der AdGuard-API nicht prüfen (nur selbstsigniert/intern) # --- Rate-Limit --- RATE_LIMIT_MAX_REQUESTS=30 # Max. Anfragen pro Domain/Client im Zeitfenster diff --git a/docs/konfiguration.md b/docs/konfiguration.md index b2718b3..f38759d 100644 --- a/docs/konfiguration.md +++ b/docs/konfiguration.md @@ -75,7 +75,7 @@ sudo adguard-shield dry-run | `ADGUARD_URL` | `https://dns1.domain.com` | URL der AdGuard-Home-Weboberfläche/API | | `ADGUARD_USER` | `admin` | Benutzername für die API-Authentifizierung | | `ADGUARD_PASS` | `changeme` | Passwort für die API-Authentifizierung | -| `ADGUARD_TLS_INSECURE` | `true` | TLS-Zertifikat der AdGuard-Home-API nicht prüfen (z.B. selbstsigniert) | +| `ADGUARD_TLS_INSECURE` | `false` | `true` = TLS-Zertifikat der AdGuard-Home-API nicht prüfen (nur selbstsigniert/intern) | ### Beispiel: Lokale Instanz @@ -99,7 +99,7 @@ AdGuard Shield ruft intern diesen Endpunkt ab: /control/querylog?limit=&response_status=all ``` -**Hinweis:** Mit `ADGUARD_TLS_INSECURE=true` (Standard) akzeptiert AdGuard Shield für die AdGuard-Home-API auch selbstsignierte TLS-Zertifikate. Das erleichtert lokale Setups, ersetzt aber keine saubere Absicherung der AdGuard-Home-Oberfläche. Hat AdGuard Home ein gültiges Zertifikat, sollte `ADGUARD_TLS_INSECURE=false` gesetzt werden. Benachrichtigungen prüfen Zertifikate standardmäßig; nur mit `NOTIFY_TLS_INSECURE=true` werden für das Benachrichtigungsziel auch selbstsignierte Zertifikate akzeptiert. AbuseIPDB, externe Listen und der MaxMind-Download prüfen Zertifikate immer. +**Hinweis:** Standardmäßig (`ADGUARD_TLS_INSECURE=false`) prüft AdGuard Shield das TLS-Zertifikat der AdGuard-Home-API. Nutzt AdGuard Home ein selbstsigniertes Zertifikat, schlägt die Verbindung fehl. Abhilfe: gültiges Zertifikat, die API lokal per `http://127.0.0.1:` ansprechen oder `ADGUARD_TLS_INSECURE=true` setzen. Letzteres erlaubt Man-in-the-Middle-Angriffe auf die API-Verbindung (Zugangsdaten und Querylog) und sollte nur in vertrauenswürdigen Netzen genutzt werden. Benachrichtigungen prüfen Zertifikate standardmäßig; nur mit `NOTIFY_TLS_INSECURE=true` werden für das Benachrichtigungsziel auch selbstsignierte Zertifikate akzeptiert. AbuseIPDB, externe Listen und der MaxMind-Download prüfen Zertifikate immer. --- diff --git a/docs/update.md b/docs/update.md index 6f4483f..eeee1de 100644 --- a/docs/update.md +++ b/docs/update.md @@ -50,7 +50,8 @@ Was du prüfen solltest: | Thema | Hinweis | |---|---| -| TLS-Zertifikate | Benachrichtigungen (ntfy, Gotify, Webhooks) und externe Listen prüfen jetzt das TLS-Zertifikat. Nutzt du einen eigenen Server mit selbstsigniertem Zertifikat, schlagen Benachrichtigungen fehl (`Benachrichtigung fehlgeschlagen` im Log). Abhilfe: gültiges Zertifikat oder `NOTIFY_TLS_INSECURE=true`. Für externe Listen gibt es keine Ausnahme – bei Fehlern bleibt die bisherige Whitelist erhalten bzw. der Cache wird genutzt. Die AdGuard-API ist nicht betroffen (`ADGUARD_TLS_INSECURE=true`). | +| TLS-Zertifikate | Benachrichtigungen (ntfy, Gotify, Webhooks) und externe Listen prüfen jetzt das TLS-Zertifikat. Nutzt du einen eigenen Server mit selbstsigniertem Zertifikat, schlagen Benachrichtigungen fehl (`Benachrichtigung fehlgeschlagen` im Log). Abhilfe: gültiges Zertifikat oder `NOTIFY_TLS_INSECURE=true`. Für externe Listen gibt es keine Ausnahme – bei Fehlern bleibt die bisherige Whitelist erhalten bzw. der Cache wird genutzt. | +| AdGuard-API-Zertifikat | Auch das TLS-Zertifikat der AdGuard-Home-API wird jetzt geprüft (`ADGUARD_TLS_INSECURE=false`, wird beim Update ergänzt). Bis v1.1.x wurde es nie geprüft. Bei selbstsigniertem Zertifikat schlägt die Abfrage fehl (`sudo adguard-shield test` meldet einen Zertifikatsfehler). Abhilfe: gültiges Zertifikat, `ADGUARD_URL` auf `http://127.0.0.1:` umstellen oder bewusst `ADGUARD_TLS_INSECURE=true` setzen. | | Konfigurations-Warnungen | Ungültige, unbekannte oder veraltete Parameter werden beim Start und bei jedem CLI-Befehl als `WARNUNG` gemeldet (z. B. `BAN_HISTORY_FILE` aus der alten Shell-Version). Ungültige Werte werden durch den Standardwert ersetzt. Veraltete Zeilen kannst du aus der Konfiguration löschen. | | Logrotation | `LOG_MAX_SIZE_MB` (Standard 50) wird jetzt ausgewertet: Das Log wird nach `adguard-shield.log.1` rotiert. | | `BLOCKED_PORTS` | Kommas sind jetzt erlaubt, ungültige Ports werden mit Warnung ignoriert. Port-Namen wie `domain` werden nicht mehr akzeptiert – bitte Portnummern verwenden. | diff --git a/go.mod b/go.mod index 8a3f65a..77ba686 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module adguard-shield go 1.26.0 +toolchain go1.26.9 + require ( github.com/oschwald/maxminddb-golang v1.13.1 golang.org/x/net v0.61.0 diff --git a/internal/config/config.go b/internal/config/config.go index f4f1d1d..b72c743 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -140,7 +140,7 @@ func load(values map[string]string) (*Config, *reader) { c.AdGuardURL = r.str("ADGUARD_URL", "") c.AdGuardUser = r.str("ADGUARD_USER", "") c.AdGuardPass = r.str("ADGUARD_PASS", "") - c.AdGuardTLSInsecure = r.bool("ADGUARD_TLS_INSECURE", true) + c.AdGuardTLSInsecure = r.bool("ADGUARD_TLS_INSECURE", false) c.RateLimitMaxRequests = r.intMin("RATE_LIMIT_MAX_REQUESTS", 30, 1) c.RateLimitWindow = r.intMin("RATE_LIMIT_WINDOW", 60, 1) c.CheckInterval = r.intMin("CHECK_INTERVAL", 10, 1) diff --git a/internal/config/config_test.go b/internal/config/config_test.go index a2b886e..72ee617 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -71,8 +71,8 @@ func TestLoadDefaultsWithoutWarnings(t *testing.T) { if len(c.Warnings) != 0 { t.Fatalf("unexpected warnings: %v", c.Warnings) } - if !c.AdGuardTLSInsecure { - t.Fatal("ADGUARD_TLS_INSECURE should default to true") + if c.AdGuardTLSInsecure { + t.Fatal("ADGUARD_TLS_INSECURE must default to false") } if c.HistoryRetentionDays != 0 { t.Fatalf("BAN_HISTORY_RETENTION_DAYS default: %d", c.HistoryRetentionDays) @@ -86,8 +86,8 @@ func TestLoadDefaultsWithoutWarnings(t *testing.T) { } func TestLoadNewKeys(t *testing.T) { - c := loadString(t, "ADGUARD_TLS_INSECURE=false\nBAN_HISTORY_RETENTION_DAYS=30\nLOG_MAX_SIZE_MB=0\n") - if c.AdGuardTLSInsecure || c.HistoryRetentionDays != 30 || c.LogMaxSizeMB != 0 { + c := loadString(t, "ADGUARD_TLS_INSECURE=true\nBAN_HISTORY_RETENTION_DAYS=30\nLOG_MAX_SIZE_MB=0\n") + if !c.AdGuardTLSInsecure || c.HistoryRetentionDays != 30 || c.LogMaxSizeMB != 0 { t.Fatalf("unexpected values: tls=%v retention=%d logmax=%d", c.AdGuardTLSInsecure, c.HistoryRetentionDays, c.LogMaxSizeMB) } if len(c.Warnings) != 0 { diff --git a/internal/installer/installer.go b/internal/installer/installer.go index c243a65..e66431a 100644 --- a/internal/installer/installer.go +++ b/internal/installer/installer.go @@ -663,7 +663,7 @@ const defaultConfig = `######################################################### ADGUARD_URL="https://dns1.domain.com" ADGUARD_USER="admin" ADGUARD_PASS='changeme' -ADGUARD_TLS_INSECURE=true # TLS-Zertifikat der AdGuard-API nicht prüfen (selbstsigniert); gilt nur für die AdGuard-API +ADGUARD_TLS_INSECURE=false # true = TLS-Zertifikat der AdGuard-API nicht prüfen (nur selbstsigniert/intern) # --- Rate-Limit --- RATE_LIMIT_MAX_REQUESTS=30 # Max. Anfragen pro Domain/Client im Zeitfenster