Модуль ngx_mail_auth_http_module

Директивы
     auth_http
     auth_http_header
     auth_http_pass_client_cert
     auth_http_timeout
Протокол

Директивы

Синтаксис: auth_http URL;
Умолчание:
Контекст: mail, server

Задаёт URL HTTP-сервера аутентификации. Протокол описан ниже.

Синтаксис: auth_http_header заголовок значение;
Умолчание:
Контекст: mail, server

Добавляет указанный заголовок к запросам, посылаемым на сервер аутентификации. Заголовок можно использовать в качестве shared secret для проверки, что запрос поступил от nginx. Например:

auth_http_header X-Auth-Key "secret_string";

Синтаксис: auth_http_pass_client_cert on | off;
Умолчание:
auth_http_pass_client_cert off;
Контекст: mail, server

Эта директива появилась в версии 1.7.11.

Добавляет заголовок “Auth-SSL-Cert” с клиентским сертификатом в формате PEM (закодирован в формате urlencode) к запросам, посылаемым на сервер аутентификации.

Синтаксис: auth_http_timeout время;
Умолчание:
auth_http_timeout 60s;
Контекст: mail, server

Задаёт таймаут общения с сервером аутентификации.

Протокол

Для общения с сервером аутентификации используется протокол HTTP. Данные в теле ответа игнорируются, информация передаётся только в заголовках.

Примеры запросов и ответов:

Запрос:

GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain # plain/apop/cram-md5/external
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap # imap/pop3/smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org

Хороший ответ:

HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143

Плохой ответ:

HTTP/1.0 200 OK
Auth-Status: Invalid login or password
Auth-Wait: 3

Если заголовка “Auth-Wait” нет, то после выдачи ошибки соединение будет закрыто. В текущей реализации на каждую попытку аутентификации выделяется память, которая освобождается только при завершении сессии. Поэтому число неудачных попыток аутентификации в рамках одной сессии должно быть ограничено — после 10-20 попыток (номер попытки передаётся в заголовке “Auth-Login-Attempt”) сервер должен выдать ответ без заголовка “Auth-Wait”.

При использовании APOP или CRAM-MD5 запрос и ответ будут выглядеть так:

GET /auth HTTP/1.0
Host: localhost
Auth-Method: apop
Auth-User: user
Auth-Salt: <238188073.1163692009@mail.example.com>
Auth-Pass: auth_response
Auth-Protocol: imap
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org

Хороший ответ:

HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143
Auth-Pass: plain-text-pass

Если в ответе есть заголовок “Auth-User”, то он переопределяет имя пользователя, используемое для аутентификации с бэкендом.

Для SMTP в ответе дополнительно учитывается заголовок “Auth-Error-Code” — если он есть, то используется как код ответа в случае ошибки. Если его нет, то по умолчанию к “Auth-Status” будет добавлен код 535 5.7.0.

Например, если от сервера аутентификации будет получен ответ:

HTTP/1.0 200 OK
Auth-Status: Temporary server problem, try again later
Auth-Error-Code: 451 4.3.0
Auth-Wait: 3

то по SMTP клиенту будет выдана ошибка

451 4.3.0 Temporary server problem, try again later

Если при проксировании SMTP не требуется аутентификация, запрос будет выглядеть так:

GET /auth HTTP/1.0
Host: localhost
Auth-Method: none
Auth-User: 
Auth-Pass: 
Auth-Protocol: smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org
Auth-SMTP-Helo: client.example.org
Auth-SMTP-From: MAIL FROM: <>
Auth-SMTP-To: RCPT TO: <postmaster@mail.example.com>

Для клиентского соединения по протоколу SSL/TLS (1.7.11) добавляется заголовок “Auth-SSL”, и если директива ssl_verify_client включена, заголовок “Auth-SSL-Verify” содержит результат проверки клиентского сертификата: “SUCCESS”, “FAILED:reason” и, если сертификат не был предоставлен, “NONE”.

До версии 1.11.7 результат “FAILED” не содержал строку reason.

Если клиентский сертификат был предоставлен, информация о нём передаётся в следующих заголовках запроса: “Auth-SSL-Subject”, “Auth-SSL-Issuer”, “Auth-SSL-Serial” и “Auth-SSL-Fingerprint”. Если директива auth_http_pass_client_cert включена, сам сертификат передаётся в заголовке “Auth-SSL-Cert”. Запрос будет выглядеть так:

GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Auth-SSL: on
Auth-SSL-Verify: SUCCESS
Auth-SSL-Subject: /CN=example.com
Auth-SSL-Issuer: /CN=example.com
Auth-SSL-Serial: C07AD56B846B5BFF
Auth-SSL-Fingerprint: 29d6a80a123d13355ed16b4b04605e29cb55a5ad