Nginx不存储密码,安全核心在于凭证不落盘、传输全加密、校验防爆破:Basic Auth须用bcrypt哈希并严格设文件权限;反向代理时禁用缓存与日志记录敏感字段;LDAP必须启用LDAPS/STARTTLS及证书校验;敏感凭据应外部化动态加载。

Nginx 本身不直接处理用户密码的“加密存储”,它不自带数据库或用户凭证管理模块。它的认证机制(如 Basic Auth、LDAP、JWT 验证等)依赖外部组件提供凭证校验能力,安全关键在于:凭证**不以明文落盘**、**传输全程加密**、**校验过程可控且防爆破**。
Basic Auth 场景下的密码文件安全
这是最轻量但需谨慎使用的方案。Nginx 通过 auth_basic_user_file 指向一个包含用户名和哈希密码的文件(如 .htpasswd),该文件必须由 htpasswd 工具生成:
- 务必使用强哈希算法:运行
htpasswd -B -C 12(-B 表示 bcrypt,-C 12 指定高成本因子),避免默认的 crypt 或过时的 apr1; - 密码文件权限设为
640,属主为root:nginx(或运行 Nginx 的用户组),禁止 world 可读; - 文件路径不要放在 Web 可访问目录下(如
/var/www),推荐放在/etc/nginx/.htpasswd等受控位置。
反向代理后端认证时的凭据流转安全
当 Nginx 作为 API 网关,将认证交由后端服务(如 OAuth2 Server、Keycloak、自研登录接口)处理时,重点在“不接触、不记录、不缓存”原始凭据:
- 前端提交的登录请求(如
POST /login)必须走 HTTPS,防止密码被截获; - Nginx 配置中禁用对该路径的缓存:
proxy_cache_bypass $http_authorization;+proxy_no_cache $http_authorization;; - 避免在日志中记录敏感字段:用
log_format自定义日志,排除$request_body或过滤password、credential类参数; - 若需透传 Token,建议用 JWT 并验证签名与有效期,而非转发原始 session cookie。
集成 LDAP/AD 认证时的通信加密
使用 ngx_http_auth_ldap_module 或 OpenResty 的 LDAP 模块时,凭据不存于 Nginx,但传输链路必须受保护:
- 强制启用 STARTTLS 或 LDAPS(端口 636),禁用纯文本 LDAP(端口 389);
- 配置证书验证:
ldap_server example { ssl on; ssl_ca_cert /etc/ssl/certs/ca.pem; },防止中间人伪造 LDAP 服务器; - 绑定账户(bind DN)应使用专用低权限账号,而非管理员账号,且其密码也需安全保管(如通过环境变量注入,而非硬编码在配置中)。
进阶:敏感凭据的外部化与动态加载
避免密钥、API Secret、LDAP 密码等写死在 Nginx 配置里:
- 使用 OpenResty + Lua:从 HashiCorp Vault、Consul KV 或加密文件中按需解密获取凭据,实现运行时注入;
- 利用 Nginx Plus 的 key-value store 或键值对模块,配合定期刷新机制更新认证令牌;
- 容器化部署时,通过 secret mount 方式挂载加密凭据文件,并在启动脚本中解密到临时内存路径供 Nginx 读取。


















