Nginx不存储明文密码,安全核心是密码文件不落盘明文、权限严格隔离、路径不可Web访问、传输全程加密;须用htpasswd -B -C 12生成bcrypt哈希,文件权限设640、属主root:nginx,存放于/etc/nginx/.htpasswd等受控路径,并强制HTTPS。

账号密码不能以明文形式存在,Nginx 本身不存储也不处理原始密码,只校验哈希值。安全存放的核心是:**密码文件不落盘为明文、权限严格隔离、路径不可被 Web 访问、传输全程加密**。
密码文件生成必须用强哈希算法
使用 htpasswd 工具时,务必指定 bcrypt 算法并提高计算成本:
-
htpasswd -B -C 12 /etc/nginx/.htpasswd username(-B强制 bcrypt,-C 12设置高迭代轮次) - 禁用默认的
crypt或apr1(MD5 变种),它们抗暴力能力弱 - 避免在命令行中直接写密码,改用交互式输入,防止密码出现在 shell 历史或进程列表中
密码文件存放位置与系统权限要严控
文件一旦生成,必须立刻加固访问控制:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 路径选在非 Web 可达区域,如
/etc/nginx/.htpasswd,绝不能放在/var/www或任何root指向的目录下 - 设置文件权限为
640:chmod 640 /etc/nginx/.htpasswd - 属主设为
root,属组为 Nginx 运行用户组(如nginx或www-data):chown root:nginx /etc/nginx/.htpasswd - 确认 Nginx 主进程以非 root 用户 worker 运行,但能读取该文件(靠组权限实现)
配置中禁止日志记录和缓存敏感信息
Nginx 不该留下任何凭据痕迹:
- 自定义
log_format,显式排除$request_body,尤其过滤含password、credential的 POST 内容 - 对登录接口(如
/login)禁用缓存:proxy_no_cache $http_authorization; proxy_cache_bypass $http_authorization; - 若用 Basic Auth,确保整个 server 块强制 HTTPS,否则 Base64 编码的凭证极易被截获解码
进阶建议:避免静态文件,转向动态凭据加载
长期来看,硬编码密码文件仍是单点风险:
- 敏感凭据可外部化,例如通过环境变量注入(配合 OpenResty + Lua)、Consul Vault 或 Kubernetes Secret 挂载
- 使用 JWT 或 OAuth2 等无状态方案替代 Basic Auth,让认证逻辑下沉到后端服务,Nginx 仅做签名验证
- 定期轮换密码文件,结合脚本自动重生成 + 权限重置,避免人工疏漏

















