nginx 的安全加固核心围绕最小权限原则、配置硬 ening、访问控制和审计监控展开,权限设置则是其中最基础也最关键的一环。下面我会分模块给出可落地的加固方案,所有操作都提供具体命令和配置示例。
一、基础权限加固(核心)
1. 创建专用低权限用户 / 组
nginx 默认可能以 root 或 nginx 用户运行,需确保运行进程的用户无登录权限、无系统管理权限:
# 1. 创建专用用户(禁止登录、无家目录) useradd -r -s /sbin/nologin -m nginx # 2. 验证用户是否创建成功 id nginx # 输出示例:uid=998(nginx) gid=996(nginx) groups=996(nginx)
2. 配置 nginx 以低权限用户运行
编辑主配置文件(通常 /etc/nginx/nginx.conf),确保 user 指令指向专用用户:
# 开头添加/修改:指定运行用户和组 user nginx nginx; # 其他核心配置(保持默认即可) worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
3. 修复文件 / 目录权限
遵循「最小权限」原则,不同目录 / 文件设置不同权限,避免过度开放:
# 1. 核心目录权限(仅 root 可写,nginx 可读) # nginx 配置目录 chown -r root:root /etc/nginx chmod -r 755 /etc/nginx # 目录:root可读写执行,其他只读执行 chmod 644 /etc/nginx/*.conf # 配置文件:root可读写,其他只读 # 2. 日志目录(nginx 可写,其他无权限) chown -r nginx:nginx /var/log/nginx chmod -r 700 /var/log/nginx # 仅 nginx 用户可访问 # 3. 运行目录(pid/锁文件) chown -r nginx:nginx /var/run/nginx chmod -r 700 /var/run/nginx # 4. 网站根目录(根据业务调整,示例为 /usr/share/nginx/html) chown -r root:nginx /usr/share/nginx/html # root 可写,nginx 可读 chmod -r 750 /usr/share/nginx/html # 禁止其他用户访问 # 5. nginx 二进制文件(仅 root 可修改) chown root:root /usr/sbin/nginx chmod 755 /usr/sbin/nginx # 禁止普通用户修改
4. 禁止 nginx 进程提权
- 确保
nginx.conf中无user root;配置(避免以 root 运行); - 禁止 nginx 用户执行 sudo:检查
/etc/sudoers和/etc/sudoers.d/,确保无 nginx 相关配置。
二、配置层面安全加固
1. 隐藏 nginx 版本信息
避免暴露版本号被针对性攻击,编辑 nginx.conf:
http {
# 隐藏版本号
server_tokens off;
# 可选:修改 server 响应头(需编译时开启模块,或用第三方模块)
# more_set_headers 'server: webserver';
}2. 限制请求参数(防止攻击)
在 http 或 server 块中添加:
http {
# 限制请求体大小(防止 post 大文件攻击,根据业务调整)
client_max_body_size 10m;
# 限制请求头大小
client_header_buffer_size 1k;
large_client_header_buffers 4 1k;
# 超时设置(防止 slowloris 攻击)
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 65s 20s;
send_timeout 10s;
# 限制并发连接(可选,根据服务器性能调整)
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20; # 单个 ip 最大 20 个并发连接
}3. 访问控制
限制 ip 访问(如后台管理页面):
location /admin/ {
allow 192.168.1.0/24; # 仅允许内网 ip 访问
deny all; # 拒绝其他所有 ip
}禁止访问敏感文件:
# 禁止访问 .htaccess、.env 等敏感文件
location ~ /\.(ht|env|git|svn) {
deny all;
}
# 禁止访问配置文件/日志文件
location ~* (\.conf|\.log)$ {
deny all;
}4. 启用 https 并加固(必做)
server {
listen 443 ssl http2;
server_name yourdomain.com;
# ssl 证书路径
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 禁用弱加密算法
ssl_protocols tlsv1.2 tlsv1.3;
ssl_ciphers ecdhe-ecdsa-aes128-gcm-sha256:ecdhe-rsa-aes128-gcm-sha256:ecdhe-ecdsa-aes256-gcm-sha384:ecdhe-rsa-aes256-gcm-sha384;
ssl_prefer_server_ciphers on;
# 会话缓存
ssl_session_cache shared:ssl:10m;
ssl_session_timeout 10m;
# hsts(强制 https)
add_header strict-transport-security "max-age=31536000; includesubdomains" always;
# 其他安全头
add_header x-frame-options deny; # 禁止iframe嵌入
add_header x-content-type-options nosniff; # 防止mime类型嗅探
add_header x-xss-protection "1; mode=block"; # 防xss
}
# 重定向 http 到 https
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
三、系统层面加固
1. 启用 selinux(linux 系统)
# 1. 查看 selinux 状态 getenforce # 2. 若为 disabled,临时启用(重启失效) setenforce 1 # 3. 永久启用(修改配置文件) sed -i 's/^selinux=.*/selinux=enforcing/' /etc/selinux/config
2. 限制 nginx 端口访问
通过防火墙(firewalld/iptables)仅开放必要端口(如 80/443):
# firewalld 示例 firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload # 禁止其他无关端口 firewall-cmd --permanent --remove-all-ports # 先清空(谨慎!仅新服务器) firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp firewall-cmd --reload
3. 定期审计日志
# 1. 配置日志轮转(避免日志过大)
# 编辑 /etc/logrotate.d/nginx(通常已存在,检查配置)
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 nginx nginx
postrotate
/usr/bin/systemctl reload nginx > /dev/null 2>&1
endscript
}
# 2. 定期检查错误日志(关注权限/攻击行为)
tail -f /var/log/nginx/error.log
grep -i "error" /var/log/nginx/error.log
grep -i "denied" /var/log/nginx/access.log
四、验证加固效果
# 1. 检查 nginx 运行用户 ps aux | grep nginx # 输出应显示 nginx 进程以 nginx 用户运行(master 进程可能为 root,正常) # 2. 检查配置语法 nginx -t # 3. 重启 nginx 使配置生效 systemctl restart nginx # 4. 验证版本号是否隐藏 curl -i http://yourdomain.com # 响应头中不应包含 "server: nginx/1.20.1" 这类版本信息 # 5. 检查文件权限 ls -l /etc/nginx/nginx.conf # 应为 -rw-r--r-- 1 root root ls -ld /var/log/nginx # 应为 drwx------ 2 nginx nginx
总结
- 权限核心:创建专用
nginx低权限用户,配置文件归root所有(只读),日志 / 运行目录归nginx所有(仅自身可访问); - 配置加固:隐藏版本号、限制请求参数、启用 https 并禁用弱加密、添加安全响应头;
- 系统层面:启用 selinux、防火墙仅开放必要端口、定期审计日志,形成完整安全闭环。
所有操作完成后,建议用 nmap、openvas 等工具扫描 nginx 服务,验证加固效果。
到此这篇关于nginx 安全加固的几种方法的文章就介绍到这了,更多相关nginx 安全加固内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论