Caddy 安全配置指南
本文将详细介绍 Caddy 的安全配置,包括 TLS 设置、访问控制、安全头部等内容。
基础安全配置
安全响应头
example.com { header { # 防止点击劫持 X-Frame-Options "DENY" # XSS 保护 X-XSS-Protection "1; mode=block" # 内容类型安全 X-Content-Type-Options "nosniff" # 引用策略 Referrer-Policy "strict-origin-when-cross-origin" # 内容安全策略 Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" # 移除服务器标识 -Server }}
访问控制
基本认证
example.com { basicauth { admin JDJhJDE0JDFrMnN5dGdQVUxLOHBtRzlxQS5tci5XMUVzbjlzWG9wYkV4RzBaeTZYTEhtMmJwZlBGRTZp }}
IP 访问限制
example.com { @blocked { remote_ip 192.168.1.0/24 10.0.0.0/8 } respond @blocked 403}
TLS 安全配置
强化 TLS 设置
example.com { tls { protocols tls1.3 tls1.2 ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 curves x25519 secp521r1 secp384r1 secp256r1 must_staple key_type p384 }}
HSTS 配置
example.com { header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"}
防护配置
DDoS 防护
example.com { rate_limit { zone dynamic 10m rate 10r/s key {remote_host} }
# 连接限制 limit_conn { max 100 key {remote_host} }}
文件访问限制
example.com { @forbidden { path *.sql *.conf *.config *.htaccess .git* .env* } respond @forbidden 403
file_server { hide .git .env .* }}
Web 应用防护
SQL 注入防护
example.com { @sql_injection { path_regexp (?i)(union|select|insert|delete|update|drop|;|--|'|") } respond @sql_injection 403}
XSS 防护
example.com { header { Content-Security-Policy " default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; form-action 'self'; frame-ancestors 'none'; " }}
日志安全
安全日志配置
example.com { log { output file /var/log/caddy/access.log { roll_size 100mb roll_keep 10 roll_keep_for 720h } format json level INFO }}
错误页面
example.com { handle_errors { respond "{http.error.status_code} {http.error.status_text}" {http.error.status_code} }}
API 安全
JWT 认证
example.com { jwt { primary { issuer "example.com" allow_claims sub exp cookie jwt_token auth_url /api/auth } }}
CORS 配置
example.com { header { Access-Control-Allow-Origin "https://trusted-site.com" Access-Control-Allow-Methods "GET, POST, OPTIONS" Access-Control-Allow-Headers "Content-Type, Authorization" Access-Control-Max-Age "3600" defer }}
安全监控
审计日志
example.com { log { output file /var/log/caddy/audit.log { roll_size 100mb roll_keep 30 } format json { time_format "2006-01-02 15:04:05" time_local } include { request>headers request>body response>headers } }}
安全告警
example.com { @security_breach { expression {http.request.uri.path} matches "/admin/*" not remote_ip private_ranges }
handle @security_breach { log { output file /var/log/caddy/security.log format json level ERROR } respond 403 }}