Настройка LDAP-аутентификации на Apache

Задача

Необходимо сделать защиту API сервиса ONS с помощью аутентификации в Active Directory (LDAP).
В текущем варианте, есть беспарольный доступ к приложению Flask по API через nginx по двум протоколам http и https.
В качестве ОС используется Astra Linux 1.7.
Предполагается, что уже установлены http-серверы apache и nginx.

Диаграмма решения

LDAP auth diagrams

Apache

Прежде всего. необходимо отключить AstraMode - иначе работать не будет.

AstraMode off

Разрешить модули apache2:

a2enmod ldap authnz_ldap proxy proxy_http

Вот эти модули не надо:
- auth_form
- auth_kerb
- authn_anon
- auth_openidc
- request
- session
- session_cookie
- session_crypto

Далее, открываем порт 8009 для публикации сервиса авторизации в файле /etc/apache2/ports.conf:

Listen 8009
...
Создаем файл виртуального хоста /etc/apache2/sites-available/ldap_auth.conf

<VirtualHost 127.0.0.1:8009>
    ServerAdmin webmaster@dataflex.local
    DocumentRoot /var/www/html/auth
    ErrorLog ${APACHE_LOG_DIR}/auth_err.log
    CustomLog ${APACHE_LOG_DIR}/auth_acc.log combined

<LocationMatch ^/.*>
    AuthType Basic
    AuthName "LDAP authentication"
    AuthBasicAuthoritative Off
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://10.55.41.8:389/OU=SPB,OU=Regions,DC=dataflex,DC=local?sAMAccountName?sub?(objectClass=*)"
    AuthLDAPBindDN IAC-IT-NS-SUDI_T
    AuthLDAPBindPassword MySecretPass

    AuthLDAPGroupAttributeIsDN on
    AuthLDAPGroupAttribute member

</LocationMatch>

<Location />
    LogLevel info
    AllowOverride All
    Options +Indexes +FollowSymlinks
    Require valid-user
    ProxyPass http://127.0.0.1:8002/ws/
</Location>

<Location /vm>
    Require valid-user
    ProxyPass http://127.0.0.1:8002/vm/
</Location>

<Location /ws>
    Require valid-user
    ProxyPass http://127.0.0.1:8002/ws/
</Location>

</VirtualHost>
Включаем сайт ldap_auth и переходим к настройке nginx
a2enmod ldap_auth
apachectl configtest
systemctl restart apache2

Nginx

Создаем файл конфигурации nginx /etc/nginx/conf.d/enabled/ons.conf

## HTTPS wo secure [443]
server {
    server_name ekb99-scl-ons1t;

    listen 443 ssl http2;
    ssl_certificate /etc/ssl/private/ekb99-scl-ons1t-bundle.pem;
    ssl_certificate_key /etc/ssl/private/ekb99-scl-ons1t.key;
    ssl_dhparam /etc/ssl/dhparams.pem;

    client_max_body_size 100M;

    location / {
        include proxy_params;
        #auth_request /auth;
        try_files $uri $uri/ =404;
        proxy_pass http://127.0.0.1:8009;
        #proxy_pass http://127.0.0.1:8002;
    }

    location /vm {
        include proxy_params;
        proxy_pass http://127.0.0.1:8009/vm;
    }

    location /ws {
        include proxy_params;
        proxy_pass http://127.0.0.1:8009/ws;
    }

}

## Current insecure ONS API backend [80]
server {
    listen 80;
    server_name ekb99-scl-ons1t;
    client_max_body_size 100M;

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8001;
    }
}

## Htaccess basic secure ONS API backend [81]
server {
    listen 81;
    server_name ekb99-scl-ons1t.gazprom-neft.local;
    client_max_body_size 100M;

    location / {
        include proxy_params;
        auth_basic "API security access";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:8001;
    }
}

После этого делаем проверку конфигурации и рестарт сервера:

nginx -t
systemctl restart nginx

Проверка работы

Заходим на клиентскую ВМ, с которой будем делать API-запросы к сервису. Проверяем работу без авторизации:

curl --insecure -u IAC-IT-NS-SUDI_T:MySecretPass https://ekb99-scl-ons1t/ws | jq
Проверяем работу c авторизацией по паролю из файла .htaccess:

curl -u ons:MySecretPass http://ekb99-scl-ons1t:81/ws | jq

Проверяем работу с авторизацией по LDAP:

curl --insecure -u IAC-IT-NS-SUDI_T:MySecretPass https://ekb99-scl-ons1t/ws | jq