Apache2/AD-auth

Материал из ALT Linux Wiki

Исходные данные:

  • Домен ActiveDirectory DOMG.TESTG
  • Web-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd

Задача:

  • Настроить аутентификацию Apache2 с PHP через AD

Создание keytab-файла

Для работы доменной аутентификации нам необходим keytab-файл, его можно сгенерировать на сервере домена или с помощью samba на машине с web-сервером.
Воспользуемся вторым вариантом.
Минимально необходимая конфигурация samba:

[global]
workgroup = DOMG
realm = DOMG.TESTG
security = ads
passdb backend = tdbsam

Проверим конфигурационный файл samba:

# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER

Press enter to see a dump of your service definitions

Войдем в домен с помощью samba:

# net ads join -U Administrator

Проверим вход в домен:

# net ads testjoin
Join is OK

Создадим и добавим в системный keytab принципала сервиса "HTTP":

# net ads keytab add HTTP -U Administrator

Проверим наш keytab:

# klist -ek /etc/krb5.keytab
...
   3 HTTP/apserver.domg.testg@DOMG.TESTG (des-cbc-crc) 
   3 HTTP/APSERVER@DOMG.TESTG (des-cbc-crc) 
   3 HTTP/apserver.domg.testg@DOMG.TESTG (des-cbc-md5) 
   3 HTTP/APSERVER@DOMG.TESTG (des-cbc-md5) 
   3 HTTP/apserver.domg.testg@DOMG.TESTG (aes128-cts-hmac-sha1-96) 
   3 HTTP/APSERVER@DOMG.TESTG (aes128-cts-hmac-sha1-96) 
   3 HTTP/apserver.domg.testg@DOMG.TESTG (aes256-cts-hmac-sha1-96) 
   3 HTTP/APSERVER@DOMG.TESTG (aes256-cts-hmac-sha1-96) 
   3 HTTP/apserver.domg.testg@DOMG.TESTG (arcfour-hmac) 
   3 HTTP/APSERVER@DOMG.TESTG (arcfour-hmac) 
...

Так же можно проверить получение билета kerberos для созданных принципалов сервиса:

# kinit Administrator
# kvno HTTP/apserver.domg.testg@DOMG.TESTG HTTP/apserver@DOMG.TESTG
HTTP/apserver.domg.testg@DOMG.TESTG: kvno = 3
HTTP/apserver@DOMG.TESTG: kvno = 3

В целях безопасности необходимо создать отдельный keytab-файл для apache2. Сделать это можно с помощью утилиты ktutil из пакета krb5-kadmin.
Установим krb5-kadmin:

# apt-get install krb5-kadmin

Скопируем системный keytab в папку с apache2:

# cp /etc/krb5.keytab /etc/httpd2/apache2.keytab

Создадим apache2.keytab с помощью ktutil, оставив только HTTP ключи:

# ktutil
ktutil: 

Загрузим системный keytab:

ktutil:  read_kt /etc/krb5.keytab

Посмотреть список ключей можно с помощью команды list:

ktutil:  list

Нам необходимо оставить записи с меткой HTTP, удалив все остальные с помощью команды delent:

ktutil:  delent 1

В итоге файл должен выглядеть так:

ktutil:  list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
   1    3      HTTP/apserver.domg.testg@DOMG.TESTG
   2    3                 HTTP/APSERVER@DOMG.TESTG
   3    3      HTTP/apserver.domg.testg@DOMG.TESTG
   4    3                 HTTP/APSERVER@DOMG.TESTG
   5    3      HTTP/apserver.domg.testg@DOMG.TESTG
   6    3                 HTTP/APSERVER@DOMG.TESTG
   7    3      HTTP/apserver.domg.testg@DOMG.TESTG
   8    3                 HTTP/APSERVER@DOMG.TESTG
   9    3      HTTP/apserver.domg.testg@DOMG.TESTG
  10    3                 HTTP/APSERVER@DOMG.TESTG

Сохраним получившийся keytab:

ktutil:  write_kt /etc/httpd2/apache2.keytab

Поменяем владельца и права доступа:

# chown apache2:apache2 /etc/httpd2/apache2.keytab
# chmod 0440 /etc/httpd2/apache2.keytab

Настройка Apache2

Установим и включим необходимые модули:

# apt-get install apache2-mod_auth_kerb
# a2enmod auth_krb5
# a2enmod authn_core
# a2enmod authz_user
# systemctl restart httpd2

Удобнее всего настраивать модуль с помощью .htaccess файлов.
Для этого разрешим использование файла .htaccess в настройках сайта:

...
<Directory "/var/www/html">
    AllowOverride All
</Directory>
...

Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта:

  AuthType Kerberos
  AuthName "Kerberos Login"
  KrbMethodNegotiate On
  KrbMethodK5Passwd On
  KrbAuthRealms DOMG.TESTG
  Krb5KeyTab /etc/httpd2/apache2.keytab
  KrbServiceName HTTP
  KrbSaveCredentials On
  require valid-user

Настройка PHP аутентификации GSSAPI

Для работы аутентификации PHP в LDAP необходима директива KrbSaveCredentials On, при её включении будет создаваться нужная нам переменная $_SERVER['KRB5CCNAME'].
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера:

# host 192.168.135.195
195.135.168.192.in-addr.arpa domain name pointer apserver.domg.testg.

192.168.135.195 - ip-адрес нашего web-сервера.
Установим необходимые пакеты:

# apt-get install pecl-krb5 php5-ldap

Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:

<?php
    var_dump($_SERVER['PHP_AUTH_USER']);
    var_dump($_SERVER['KRB5CCNAME']);
    putenv("KRB5CCNAME={$_SERVER['KRB5CCNAME']}");
    $ldapconn = ldap_connect("ldap://dcd.domg.testg:389") or die('error connect с $ldaphost') ;
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
    $result = ldap_sasl_bind($ldapconn,'','','GSSAPI','DOMG.TESTG') or die('Failed to GSSAPI bind sasl bind.<br />');
    $result = ldap_search($ldapconn, 'DC=DOMG,DC=TESTG', '(objectClass=*)', array('mail'));
    $result_entries = ldap_get_entries($ldapconn, $result);
    var_dump($result_entries);
?>

Перейдем в браузере на адрес https://apserver.domg.testg/index.php введя имя и пароль доменного пользователя. Вывод должен быть таким:

string(7) "u01domg" string(50) "FILE:/var/run/httpd2/krbcache/krb5cc_apache_NHBQeV"

array(224) {
  ["count"]=>
  int(223)
  [0]=>
  array(2) {
    ["count"]=>
    int(0)
    ["dn"]=>
    string(16) "DC=domg,DC=testg"
  }
...