Перейти к содержанию

auth-pam: Динамический модуль аутентификации PAM для NGINX

Требует подписки Pro плана (или выше) на 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, выпущенный 15 февраля 2026 года.


Аутентификация PAM корпоративного уровня для NGINX

Обзор

Этот модуль предоставляет HTTP Basic Authentication через PAM (Pluggable Authentication Modules) для NGINX.

  • Полная реализация с нуля (не форк)
  • Совместимость с устаревшими конфигурациями
  • Укрепленная безопасность, проверенная в боевых условиях

Ключевые особенности

  • HTTP Basic Auth через PAM
  • Расширение переменных в realm (условная аутентификация)
  • Экспорт окружения PAM (HOST, REQUEST)
  • Кэширование результатов аутентификации в общей памяти (для производительности LDAP/AD)
  • Асинхронная аутентификация через пул потоков (не блокирующие рабочие процессы)
  • Поддержка динамических модулей

Конфигурация

Директива По умолчанию Описание
auth_pam - Имя realm для HTTP Basic auth. Поддерживает переменные. Установите в 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              "Secure Zone";
    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 Zone";
    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              "Cached Zone";
            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).

## Поведение по умолчанию - автоматически использует "default" пул потоков NGINX
location /protected {
    auth_pam              "Restricted";
    auth_pam_service_name "nginx_ldap";
}

## Используйте пользовательский пул потоков для аутентификации с высоким объемом
thread_pool pam_pool threads=4 max_queue=256;

http {
    server {
        location /high-volume {
            auth_pam              "High Volume Zone";
            auth_pam_service_name "nginx_ldap";
            auth_pam_thread_pool  pam_pool;
        }
    }
}

## Принудительный синхронный режим (отключить асинхронный)
location /sync-auth {
    auth_pam              "Sync Zone";
    auth_pam_service_name "nginx";
    auth_pam_thread_pool  off;
}

Примечания: - Требуется NGINX, собранный с --with-threads - Кэш проверяется перед отправкой в пул потоков (быстрый путь для попаданий в кэш) - Возвращает 503, если очередь пула потоков заполнена

Условная аутентификация

Пропустите PAM для клиентов с аутентификацией по сертификату:

map $ssl_client_verify $pam_realm {
    SUCCESS "off";
    default "Restricted Area";
}

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     "Restricted";
    10.0.0.0/8  "off";
}

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

Окружение PAM с pam_exec

Экспортируйте детали запроса в PAM для пользовательских скриптов аутентификации:

location /custom-auth {
    auth_pam              "Custom Zone";
    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 Access";
    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 или аутентификация не удалась - Работает с синхронной, асинхронной (пул потоков) и кэшированной аутентификацией