在Nginx部署Web应用,如何保障后端API的安全
1. 使用HTTPS和http2.0
参考:Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客
2. 设置严格的CORS策略
通过add_header
指令设置CORS头。
只允许来自https://frontend.yourdomain.com
的请求访问API
location /api/ {
if ($http_origin ~* (https://frontend\.yourdomain\.com)) {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://backend;
}
3. 实现身份验证
对于JWT认证,后端服务负责生成和验证令牌,Nginx仅需检查令牌的存在性。为了实现这一点,可以在Nginx中添加一个自定义的Lua脚本(需要安装ngx_http_lua_module
)或者直接在Nginx配置中进行简单的检查:
location /api/ {
set $auth 0;
if ($http_authorization ~ "^Bearer (.+)$") {
set $auth 1;
}
if ($auth = 0) {
return 401 "Missing or invalid Authorization header";
}
proxy_pass http://backend;
}
4. 限制IP地址
location /api/secure {
allow 192.168.1.0/24; # 允许的子网
deny all; # 拒绝其他所有
proxy_pass http://backend;
}
5. 使用限流
防止滥用或DDoS攻击,使用limit_req
模块来限制请求速率
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /api/ {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend;
}
}
}
6. 实施WAF(Web应用防火墙)
安装ModSecurity并在Nginx中启用它:
# 安装ModSecurity
sudo apt-get install libmodsecurity3 modsecurity-crs
# 启用ModSecurity
sudo nano /etc/nginx/modsec/modsecurity.conf-recommended
编辑/etc/nginx/sites-available/yourdomain
,添加以下行以加载ModSecurity:
load_module modules/ngx_http_modsecurity_module.so;
server {
...
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
...
}
创建或编辑规则文件/etc/nginx/modsec/main.conf
以包含OWASP Core Rule Set或其他自定义规则。
7. 日志记录和监控
确保启用了适当的日志级别,并定期审查日志文件。也可以集成第三方监控工具如ELK Stack、Prometheus等。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
}
8. 更新和维护
保持系统和软件包的更新是至关重要的。使用自动化的包管理器如APT(Debian/Ubuntu)或YUM(CentOS/RHEL)来定期更新
# 对于Debian/Ubuntu
sudo apt-get update && sudo apt-get upgrade -y
# 对于CentOS/RHEL
sudo yum update -y
同时,可以订阅安全公告并及时应用补丁,考虑使用自动化工具如Ansible、Puppet或Chef来进行系统管理和配置部署。