Apache2/AD-auth
Исходные данные:
- Домен ActiveDirectory DOMG.TESTG
- Веб-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd
Задача:
- Настроить аутентификацию Apache2 с PHP через AD
Создание keytab-файла
Создание SPN keytab-файла описано тут
Скопировать keytab-файл в /etc/httpd2/ и изменить владельца и права доступа для данного файла:
# chown apache2:apache2 /etc/httpd2/apache2.keytab
# chmod 0440 /etc/httpd2/apache2.keytab
Настройка Apache2
mod_auth_gssapi
Установить пакет apache2-mod_auth_gssapi и включить необходимые модули:
# apt-get install apache2-mod_auth_gssapi
# a2enmod auth_gssapi
# a2enmod authn_core
# a2enmod authz_user
# systemctl restart httpd2
Добавить в конфигурацию Apache строки:
<Directory />
AuthType GSSAPI
AuthName "GSSAPI Login"
#GssapiBasicAuth On
GssapiCredStore keytab:/etc/httpd2/apache2.keytab
Require valid-user
</Directory>
mod_auth_kerb
Установить пакет apache2-mod_auth_kerb и включить необходимые модули:
# 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
KrbLocalUserMapping On #Обрезает @REAL в переменной REMOTE_USER
require valid-user
Если в логах Apache пишется ошибка:
krb5_get_init_creds_password() failed: Client not found in Kerberos database
То необходимо изменить адрес сервиса в строке KrbServiceName, на HTTP/полное имя сервера в домене, например:
HTTP/apserver.domg.testg
Проверка аутентификации
Получить билет Kerberos:
$ kinit ivanov
Password for ivanov@DOMG.TESTG:
$ klist
Ticket cache: KEYRING:persistent:500:krb_ccache_5VitJSL
Default principal: ivanov@DOMG.TESTG
Valid starting Expires Service principal
28.04.2023 15:54:41 29.04.2023 01:54:41 krbtgt/DOMG.TESTG@DOMG.TESTG
renew until 05.05.2023 15:54:38
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : http://apserver.domg.testg
<html><body><h1>It works!</h1></body></html>
Получено содержимое страницы.
Удалить билеты Kerberos:
$ kdestroy
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : http://apserver.domg.testg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Authentication required!</title>
</head>
<body>
<h1>Authentication required!</h1>
…
<h2>Error 401</h2>
<address>
<a href="/">apserver.domg.testg</a><br />
<span>Apache/2.4.56 (Unix) mod_auth_gssapi/1.6.3 OpenSSL/1.1.1t</span>
</address>
</body>
</html>
Содержимое страницы не доступно.
Настройка PHP аутентификации GSSAPI
Инструкция для p9
Для работы аутентификации 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"
}
...
Настройка веб-браузеров для SSO
Настройка веб-браузеров для SSO