模式切换
安全性配置
Nginx 基本安全策略
为了确保 Nginx 服务器的安全性,必须进行一些基础配置来减少潜在的攻击面。以下是一些常见的安全策略:
隐藏 Nginx 版本号
默认情况下,Nginx 会在响应头中显示服务器的版本号,这可能会被攻击者利用来确定目标服务器的具体版本并发起针对性的攻击。通过以下配置,可以隐藏 Nginx 的版本信息:
nginx
http {
server_tokens off; # 隐藏Nginx版本信息
}
这会移除 HTTP 响应中的 Server
头部信息或隐藏其版本号,如下所示:
- 默认:
Server: nginx/1.18.0
- 隐藏版本后:
Server: nginx
限制访问的目录或文件
有时候需要保护某些目录或文件,使其不能被外部用户直接访问,可以通过 Nginx 的 deny
指令实现:
nginx
location /admin {
deny all; # 禁止访问/admin路径
}
这样,所有对 /admin
路径的访问请求都会被拒绝,用户将收到 403 Forbidden 错误。
配置 IP 访问控制(白名单和黑名单)
Nginx 提供了基于 IP 的访问控制,可以设置允许访问的 IP 白名单和拒绝访问的 IP 黑名单。
设置白名单
如果只允许特定的 IP 地址访问服务器,可以通过以下配置来实现 IP 白名单:
nginx
location / {
allow 192.168.1.100; # 允许该IP地址访问
allow 192.168.1.101; # 允许另一个IP地址访问
deny all; # 拒绝其他所有IP
}
此配置允许 192.168.1.100
和 192.168.1.101
访问 /
路径,其他 IP 的请求将被拒绝。
设置黑名单
如果需要禁止特定 IP 地址访问,可以使用以下配置设置 IP 黑名单:
nginx
location / {
deny 192.168.1.200; # 禁止该IP地址访问
allow all; # 允许其他所有IP访问
}
此配置会拒绝来自 192.168.1.200
的请求,其他 IP 的请求仍会被处理。
使用 CIDR 进行访问控制
Nginx 还支持使用 CIDR(无类别域间路由)来控制 IP 地址段的访问。例如,限制整个 IP 段的访问:
nginx
location / {
allow 192.168.1.0/24; # 允许IP段访问
deny all; # 拒绝其他IP
}
防止 DDoS 攻击和 HTTP Flood 攻击的基本配置
DDoS 攻击和 HTTP Flood 攻击通过大量请求耗尽服务器资源,从而导致服务不可用。Nginx 提供了多种功能来缓解这些攻击,包括请求限速和连接限速。
请求限速(Limit Request Rate)
通过限制客户端发送的请求速率,可以有效防止 HTTP Flood 攻击。limit_req_zone
指令定义了基于 IP 的请求速率限制,limit_req
指令在具体的 location
中应用该限制。
设置请求速率限制
nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend_server;
}
}
}
limit_req_zone
:定义速率限制区域,$binary_remote_addr
表示基于客户端 IP 地址进行限制,zone=one:10m
表示分配 10MB 内存用于存储该限制区域,rate=1r/s
表示每秒最多允许 1 次请求。limit_req
:在location
块中应用速率限制,burst=5
表示允许一次最多积压 5 个请求,nodelay
表示不延迟直接拒绝超额请求。
连接限速(Limit Connection Rate)
为了防止单个 IP 同时发起过多的连接,Nginx 提供了 limit_conn_zone
和 limit_conn
指令来限制每个 IP 的最大连接数。
设置连接数限制
nginx
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10; # 每个IP最多允许10个连接
proxy_pass http://backend_server;
}
}
}
limit_conn_zone
:定义基于 IP 的连接数限制区域。limit_conn
:设置每个 IP 最多可以保持 10 个并发连接。
防止慢速攻击(Slowloris)
慢速攻击通过慢速连接来拖延服务器资源。可以通过 client_body_timeout
和 client_header_timeout
来设置请求头和请求体的超时时间,从而防止这种攻击:
nginx
http {
client_body_timeout 10s; # 设置请求体的超时时间为10秒
client_header_timeout 10s; # 设置请求头的超时时间为10秒
keepalive_timeout 5s 5s; # 设置 keep-alive 超时时间为5秒
send_timeout 10s; # 设置发送响应数据的超时时间
}
client_body_timeout
:设置请求体传输的最大等待时间。client_header_timeout
:设置接收请求头的最大等待时间。keepalive_timeout
:限制客户端保持连接的时间。send_timeout
:如果客户端在发送响应过程中超过此时间未接收任何数据,则中断连接。
其他安全增强措施
HTTP 严格传输安全(HSTS)
通过 Strict-Transport-Security
头部,强制浏览器使用 HTTPS 连接,从而防止降级攻击。可以在 Nginx 配置中启用 HSTS:
nginx
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
max-age=31536000
:表示浏览器将强制使用 HTTPS 连接一年(单位:秒)。includeSubDomains
:对所有子域名也应用 HSTS 策略。
限制文件上传大小
为了防止大文件上传耗尽服务器资源,可以通过 Nginx 设置请求体的最大大小:
nginx
server {
client_max_body_size 2m; # 限制请求体大小为2MB
}
这样,任何超过 2MB 的文件上传请求都会被拒绝。
使用 Fail2ban 防止暴力破解
虽然 Nginx 本身不提供暴力破解的防护功能,但可以结合 Fail2ban 工具监控 Nginx 的日志文件并自动封禁恶意 IP。
- Fail2ban 会监控
/var/log/nginx/access.log
或/var/log/nginx/error.log
文件中的可疑行为(如频繁的 404 或 403 错误),并自动使用防火墙封锁攻击者的 IP。
总结
- 基本安全策略:通过隐藏版本号、限制目录访问等操作减少攻击面。
- IP 访问控制:可以通过白名单和黑名单来限制或允许特定 IP 的访问,进一步增强安全性。
- 防止 DDoS 和 HTTP Flood 攻击:使用请求限速、连接限速等功能防止过量请求耗尽服务器资源。
- 其他安全措施:如启用 HSTS、限制文件上传大小、结合工具如 Fail2ban 防止暴力破解。
通过合理的安全配置,Nginx 可以有效防止常见的攻击,保护服务器的安全性。