跳转至

auth-pam: NGINX 的 PAM 认证动态模块

需要 GetPageSpeed NGINX Extras 订阅的专业计划(或更高版本)。

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7、8、9 和 10
  • CentOS 7、8、9
  • AlmaLinux 8、9
  • Rocky Linux 8、9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-auth-pam
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-auth-pam

通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:

load_module modules/ngx_http_auth_pam_module.so;

本文档描述的是 nginx-module-auth-pam v1.6.1,于 2026 年 2 月 15 日发布。


企业级 PAM 认证用于 NGINX

概述

此模块通过 PAM(可插拔认证模块)为 NGINX 提供 HTTP 基本认证。

  • 完整的自下而上的实现(不是分支)
  • 与遗留配置兼容
  • 加强的安全性,在生产环境中经过考验

主要特性

  • 通过 PAM 实现 HTTP 基本认证
  • 领域中的变量扩展(条件认证)
  • PAM 环境导出(HOST, REQUEST)
  • 在共享内存中缓存认证结果(提高 LDAP/AD 性能)
  • 通过线程池进行异步认证(非阻塞工作进程)
  • 支持动态模块

配置

指令 默认值 描述
auth_pam - HTTP 基本认证的领域名称。支持变量。设置为 off 以禁用。
auth_pam_service_name nginx PAM 服务名称(与 /etc/pam.d/<name> 匹配)
auth_pam_set_pam_env off 将 HOST 和 REQUEST 导出到 PAM 环境
auth_pam_cache_zone - 定义共享内存区域:zone=name:size(仅限 http 上下文)
auth_pam_cache - 启用认证缓存:zone=name time=60s
auth_pam_thread_pool default 用于异步认证的线程池(需要 --with-threads)。设置为 off 以启用同步模式。

示例

基本用法

使用 PAM 认证保护一个位置:

location /secure {
    auth_pam              "安全区域";
    auth_pam_service_name "nginx";
}

创建 PAM 服务文件 /etc/pam.d/nginx

auth    required pam_unix.so
account required pam_unix.so

LDAP 认证

使用 PAM LDAP 模块进行基于目录的认证:

location /ldap-protected {
    auth_pam              "LDAP 区域";
    auth_pam_service_name "nginx_ldap";
}

PAM 服务文件 /etc/pam.d/nginx_ldap

auth    required pam_ldap.so
account required pam_ldap.so

认证缓存

缓存成功的认证以减少 PAM 后端的负载(对 LDAP/AD 特别有用):

http {
    auth_pam_cache_zone zone=pam_cache:1m;

    server {
        location /cached-auth {
            auth_pam              "缓存区域";
            auth_pam_service_name "nginx_ldap";
            auth_pam_cache        zone=pam_cache time=60s;
        }
    }
}

注意: - 仅缓存成功的认证(失败的尝试始终会触及 PAM) - 密码在缓存键中以 SHA1 哈希存储,绝不以明文存储 - 服务名称包含在缓存键中,以防止跨服务冲突 - 推荐的 TTL:60s(默认),根据安全要求进行调整

异步认证(线程池)

当 NGINX 使用 --with-threads 编译时,PAM 认证会自动卸载到线程池。这防止了慢速 PAM 后端(LDAP/AD)阻塞工作进程。

## 默认行为 - 自动使用 NGINX 的 "default" 线程池
location /protected {
    auth_pam              "受限区域";
    auth_pam_service_name "nginx_ldap";
}

## 为高流量认证使用自定义线程池
thread_pool pam_pool threads=4 max_queue=256;

http {
    server {
        location /high-volume {
            auth_pam              "高流量区域";
            auth_pam_service_name "nginx_ldap";
            auth_pam_thread_pool  pam_pool;
        }
    }
}

## 强制同步模式(禁用异步)
location /sync-auth {
    auth_pam              "同步区域";
    auth_pam_service_name "nginx";
    auth_pam_thread_pool  off;
}

注意: - 需要使用 --with-threads 编译的 NGINX - 在提交到线程池之前检查缓存(缓存命中的快速路径) - 如果线程池队列已满,则返回 503

条件认证

跳过证书认证的客户端的 PAM:

map $ssl_client_verify $pam_realm {
    SUCCESS "off";
    default "受限区域";
}

server {
    listen 443 ssl;
    ssl_client_certificate /etc/nginx/ca.crt;
    ssl_verify_client optional;

    location /api {
        auth_pam $pam_realm;
        auth_pam_service_name "nginx";
    }
}

对内部网络禁用认证:

geo $pam_realm {
    default     "受限";
    10.0.0.0/8  "off";
}

location /internal {
    auth_pam $pam_realm;
    auth_pam_service_name "nginx";
}

使用 pam_exec 的 PAM 环境

将请求细节导出到 PAM 以进行自定义认证脚本:

location /custom-auth {
    auth_pam              "自定义区域";
    auth_pam_service_name "nginx_exec";
    auth_pam_set_pam_env  on;
}

启用时,PAM 环境包括:

  • HOST - 请求主机头(例如,localhost:8000
  • REQUEST - 完整请求行(例如,GET /path?query HTTP/1.1

PAM 服务文件 /etc/pam.d/nginx_exec

auth required pam_exec.so /path/to/auth-script.sh
account required pam_permit.so

使用 $pam_user 变量

成功 PAM 认证后,$pam_user 变量包含经过认证的用户名:

location /api {
    auth_pam              "API 访问";
    auth_pam_service_name "nginx";

    # 为后端添加用户名头
    proxy_set_header X-Authenticated-User $pam_user;
    proxy_pass http://backend;
}

## 带用户名的自定义访问日志
log_format auth '$remote_addr - $pam_user [$time_local] "$request"';
access_log /var/log/nginx/access.log auth;

注意: - 当 auth_pam off 或认证失败时为空 - 适用于同步、异步(线程池)和缓存认证