Nginx安全防护实战:DDoS、XSS攻击防御与SSL配置
Nginx安全防护实战:DDoS、XSS攻击防御与SSL配置
随着网络攻击日益猖獗,服务器安全已成为每个开发者和运维人员必须重视的问题。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了丰富的安全配置选项,可以帮助我们有效抵御各种网络威胁。本文将详细介绍如何通过Nginx配置,打造坚不可摧的服务器防线。
防御DDoS攻击
分布式拒绝服务(DDoS)攻击是当前最常见的网络攻击之一,其特点是分布式、高流量,主要针对服务器的带宽和服务。DDoS攻击可以分为四层流量攻击和七层应用攻击。对于七层应用攻击,我们可以通过Nginx的配置来进行有效防御。
Nginx提供了http_limit_conn和http_limit_req模块,可以用来限制单个IP的连接数和每秒请求数。通过这些限制,可以相对有效地防御CC攻击。
限制每秒请求数
ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数。一旦单位时间内请求数超过限制,Nginx就会返回503错误。配置需要在两个地方设置:
- 在nginx.conf的http段内定义触发条件
- 在location内定义达到触发条件时Nginx所要执行的动作
例如:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //触发条件,所有访问ip 限制每秒10个请求
...
server {
...
location ~ \.php$ {
limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应
}
}
}
参数说明:
$binary_remote_addr 二进制远程地址
zone=one:10m 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话
rate=10r/s; 限制频率为每秒10个请求
burst=5 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
nodelay 超过的请求不被延迟处理,设置后15个请求在1秒内处理。
限制IP连接数
ngx_http_limit_conn_module的配置方法和参数与http_limit_req模块很像,参数少,要简单很多
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件
...
server {
...
location /download/ {
limit_conn addr 1; // 限制同一时间内1个连接,超出的连接返回503
}
}
}
白名单设置
http_limit_conn和http_limit_req模块限制了单ip单位时间内的并发和请求数,但是如果Nginx前面有lvs或者haproxy之类的负载均衡或者反向代理,nginx获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要geo和map模块配合使用,设置白名单。
防御SQL注入和XSS攻击
SQL注入和跨站脚本(XSS)攻击是常见的应用层攻击手段。虽然Nginx本身不处理应用层的数据逻辑,但可以通过配置增强HTTP头来提高安全性。
增强HTTP头
- 设置X-XSS-Protection:这个HTTP头指示浏览器启用他们的跨站脚本过滤器。这个头已经在现代浏览器中弃用,但它可能被绕过。
add_header X-XSS-Protection "1; mode=block";
- 设置Content-Type Options:阻止浏览器从执行由服务器推断出的MIME类型,而非服务器声明的内容类型。
add_header X-Content-Type-Options nosniff;
- 实施CSP:通过Nginx设置CSP头可以大大增加防御XSS的能力。
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com";
限制请求大小
通过限制请求的大小,可以减少大型恶意载荷的风险。
client_max_body_size 10K;
黑白名单设置
Nginx的deny指令可以用来拒绝特定IP地址或地址段的请求。以下是一个简单的配置示例:
# 在 http 块中定义黑名单
http {
# 定义一个名为 blacklist 的 key 来存储黑名单
geo $blacklist {
default 0; # 默认为不在黑名单中
10.1.1.0/24 1; # 把10.1.1.0/24网段加入黑名单
192.168.0.100 1; # 把单个IP地址加入黑名单
}
# 定义一个名为 blocked 的 location 来拒绝黑名单中的请求
server {
location / {
# 如果客户端IP在黑名单中,返回403 Forbidden
if ($blacklist) {
return 403;
}
# 其他情况下,继续正常处理请求
...
}
}
}
配置解释:
- 使用geo指令定义了一个名为$blacklist的变量,用来存储黑名单信息。
- 在server块中的location /中,使用if指令检查客户端的IP地址是否在黑名单中,如果在黑名单中,则返回403 Forbidden,拒绝请求。
数据传输加密
使用SSL/TLS加密数据传输是保护服务器安全的重要措施。以下是在Nginx中配置SSL证书的基本步骤:
下载SSL证书:登录数字证书管理服务控制台,下载适用于Nginx的SSL证书。
上传证书文件:将下载的证书文件上传到Nginx服务器的适当目录,例如/usr/local/nginx/conf/cert。
配置Nginx:编辑Nginx配置文件,添加SSL相关的配置:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /usr/local/nginx/conf/cert/cert-file-name.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/cert-file-name.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://your_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- 重启Nginx:应用更改并重启Nginx服务。
通过以上配置,你可以确保数据在传输过程中的安全性,防止中间人攻击和数据泄露。
服务器安全是一个系统工程,需要从多个层面进行防护。通过合理配置Nginx,我们可以有效抵御DDoS攻击、SQL注入、XSS攻击等常见威胁。同时,结合应用层的安全措施和定期的安全审计,可以进一步提升系统的整体安全性。记住,安全配置不是一劳永逸的工作,需要根据实际情况不断调整和优化。