Restrict production wp-admin/wp-login to an IP allowlist (opt-in)
New WP_ADMIN_ALLOWED_IPS env var (space-separated CIDR ranges, matching Caddy's remote_ip syntax directly). Defaults to 0.0.0.0/0 ::/0 (today's open behavior) when unset, resolved at the Compose level rather than in the Caddyfile so an unset var can never leave `remote_ip` with zero arguments and fail Caddy's startup. admin-ajax.php stays exempt since WooCommerce routes logged-out storefront AJAX through it. Production only — staging is already LAN-only. Verified live: a scratch Caddy instance on a Docker network, with a sibling container's actual observed source IP used to prove both the blocked (403 on wp-admin/wp-login, everything else unaffected) and allowed (matching CIDR lets it through) cases, plus `docker compose config` to confirm the unset-var default resolves correctly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MqhgnCRjjVLFnZ3Jpn93Vg
This commit is contained in:
1 parent
3143128798
commit
8b149a672d
4 files changed
+39
No files matched your search
@@ -61,3 +61,10 @@ MAILERLITE_API_KEY=
|
||||
# --- Hardcover (AO3-style tag browsing — genre/mood/content-warning/tag sync) ---
|
||||
# Get a token: hardcover.app account settings -> Hardcover API -> New API Key
|
||||
HARDCOVER_API_TOKEN=
|
||||
|
||||
# --- Admin access restriction (production only) ---
|
||||
# Space-separated IPs/CIDR ranges allowed to reach /wp-admin and
|
||||
# /wp-login.php (matches Caddy's `remote_ip` syntax directly — no quotes,
|
||||
# space-separated even though most other values here are one token).
|
||||
# Leave blank to leave wp-admin reachable from anywhere (today's behavior).
|
||||
WP_ADMIN_ALLOWED_IPS=
|
||||
Reference in new issue
Block a user