пятница, 14 октября 2022 г.

Kerberos аутентификация Apache CentOS 9

Исходно есть CentOS 9 (прошло 8 лет с произведенных настроек CentOS 6, пришло время обновиться)
Active Directory построены на Microsoft Server 2012

DNS

Создаем запись в DNS

web-server01.domain.com   A   10.0.0.251
alias.domain.com          CN  web-server01

Генерируем keytab на сервере AD

Здесь для примера генерируем keytab в котором содержится 2 SPN. Это необходимо для того чтобы работала сквозная аутентификация и по своему основному имени и по алиасу. Без FQDN Kerberos работать не будет.

>ktpass -princ HTTP/web-server01.domain.com@DOMAIN.COM -mapuser DOMAIN\web-server01 -crypto All -ptype KRB5_NT_PRINCIPAL -mapop set -pass Pa$$W0rdd -out c:\temp\krb5_one.keytab

>ktpass -princ HTTP/alias.domain.com@DOMAIN.COM -mapuser DOMAIN\web-server01 -pass "Pa$$W0rdd" -crypto All -ptype KRB5_NT_PRINCIPAL -in c:\temp\krb5_one.keytab -out c:\temp\krb5.keytab -setupn -setpass


Проверяем SPN

>setspn -L domain\web-server01
Registered ServicePrincipalNames for CN=web-server01,OU=SERVERS,DC=domain,DC=com:
        HTTP/web-server01.domain.ru
        HTTP/alias.domain.ru

Настройка CentOS

Установка пакетов. В отличии от предущего сервера CentOS 6, здесь используется новый пакет mod_auth_gssapi вместо mod_auth_kerb

#dnf install httpd mod_ssl mod_auth_gssapi mod_session php
systemctl enable httpd

Настройка krb5.conf

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = DOMAIN.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 DOMAIN.COM = {
  kdc = domain-controller.DOMAIN.COM
  admin_server = domain-controller.DOMAIN.COM
 }

[domain_realm]
 web-server01.domain.com = DOMAIN.COM

Поместить keytab в место его хранения

cd /tmp/krb5.keytab /etc/httpd/conf/krb5.keytab

Настроить соответствующий раздел в конфигурации Apache(httpd.conf) или в файле .htaccess

    AuthType GSSAPI
    AuthName "GSSAPI Single Sign On Login"
    GssapiCredStore keytab:/etc/httpd/conf/krb5.keytab
    GssapiBasicAuthMech krb5
    GssapiBasicAuth On
    GssapiUseSessions       On
    Session on
    SessionCookieName gssapi_session path=/;httponly;secure;
    Require valid-user

Появлении ошибки 400 в браузере и на сервере:
[debug] (28)No space left on device: Failed to read request header line Authorization: Negotiate
связано с большим количеством атрибутов безопасности переданном в заголовке (например пользователь входит в большое количество групп). В файле httpd.conf увеличить
LimitRequestFieldSize 32768

Запустить httpd

systemctl start httpd

Проверочный скрипт PHP index.php в разделе где проводится аутентификация

 <?php
    echo "<pre>";
    var_dump($_SERVER["GSS_NAME"]);
    echo "</pre>";
?>

Настройка браузеров

Internet Explorer


Firefox

Результат