Участник:Petr-akhlamov/Настройка Apache2 разработка: различия между версиями
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 13: | Строка 13: | ||
{{Note|Обратите внимание, метод аутентификации SSSD, не Winbind!}} | {{Note|Обратите внимание, метод аутентификации SSSD, не Winbind!}} | ||
==Создание keytab-файла== | ==Создание keytab-файла== | ||
*Создание SPN keytab-файла описано в статье [[Создание SPN и Keytab файла]]. | *Создание SPN keytab-файла описано в статье [[Создание SPN и Keytab файла]]. Короче говоря: | ||
**На контроллере домена | **На контроллере домена | ||
***[[Создание_SPN_и_Keytab_файла#Samba_DC|Создаем пользователя, с которым будут связаны создаваемые SPN]] | ***[[Создание_SPN_и_Keytab_файла#Samba_DC|Создаем пользователя, с которым будут связаны создаваемые SPN]] | ||
Строка 120: | Строка 120: | ||
== Настройка PHP аутентификации GSSAPI == | == Настройка PHP аутентификации GSSAPI == | ||
Для работы аутентификации PHP в LDAP необходима директива {{cmd|KrbSaveCredentials On}}, при её включении будет создаваться нужная нам переменная {{cmd|$_SERVER['KRB5CCNAME']}}.<br> | |||
Для работы аутентификации PHP в LDAP необходима директива KrbSaveCredentials On, при её включении будет создаваться нужная нам переменная $_SERVER['KRB5CCNAME'].<br> | |||
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера: | Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера: | ||
<syntaxhighlight lang="bash"># host 192.168.135.195 | <syntaxhighlight lang="bash"># host 192.168.135.195 | ||
Строка 127: | Строка 126: | ||
192.168.135.195 - ip-адрес нашего web-сервера.<br> | 192.168.135.195 - ip-адрес нашего web-сервера.<br> | ||
Установим необходимые пакеты: | Установим необходимые пакеты: | ||
<syntaxhighlight lang="bash"># apt-get install pecl-krb5 | <syntaxhighlight lang="bash"># apt-get install pecl-krb5 php8.*-ldap</syntaxhighlight> | ||
{{Attention|GSSAPI не работает по протоколу ldaps://, поэтому указывайте ldap://}} | {{Attention|GSSAPI не работает по протоколу ldaps://, поэтому указывайте ldap://}} | ||
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания: | Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания: | ||
Строка 156: | Строка 155: | ||
} | } | ||
...</syntaxhighlight> | ...</syntaxhighlight> | ||
== Настройка веб-браузеров для SSO == | == Настройка веб-браузеров для SSO == | ||
См. [[Настройка браузеров для SSO]] | См. [[Настройка браузеров для SSO]] |
Текущая версия от 22:47, 15 января 2025
Настройка аутентификации Apache2 с PHP через AD
Задача:
- Настроить аутентификацию Apache2 с PHP через AD
Исходные данные:
- Сервер с доменом ActiveDirectory PETR.RU
- Создаем сервер AD по SambaAD_start
- Веб-сервер введенный в домен с помощью sssd - apache.petr.ru
- создаем по Apache2
- вводим стандартными средствами в новосозданный домен с аутентификацией sssd
Создание keytab-файла
- Создание SPN keytab-файла описано в статье Создание SPN и Keytab файла. Короче говоря:
- На контроллере домена
- На веб-сервре
Перейдите в каталог, в котором вы хотите создать файл
# cd /tmp
или отобразите текущий, чтобы знать, куда сохранится файл:
# pwd
Запустите утилиту и построчно выполняйте команды:
# ktutil ktutil: addent -password -p HTTP/apache.petr.ru@PETR.RU -k 6 -e RC4-HMAC
Password for HTTP/apache.petr.ru@PETR.RU:
ktutil: wkt apache.keytab
ktutil: q
Скопируйте keytab-файл в /etc/httpd2/ и измените владельца и права доступа для данного файла:
# cp apache.keytab /etc/httpd2/apache2.keytab
# 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
Перезапустите службу Apache2:
# systemctl restart httpd2
Добавьте в конец файла с конфигурацией Apache строки:
# mcedit /etc/httpd2/conf/httpd2.conf
<Directory />
AuthType GSSAPI
AuthName "GSSAPI Login"
#GssapiBasicAuth On
GssapiCredStore keytab:/etc/httpd2/apache2.keytab
Require valid-user
</Directory>
Проверка аутентификации
Получите билет 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
Для работы аутентификации 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 php8.*-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
Система конфигурации apache2
Начиная с apache2-2.2.4-alt14 для конфигурирования apache2 используется доработанная Debian`овская схема.
Основные отличия от Debian
Ссылки с описанием Debian`овского оригинала я не нашёл.
- Конфигурационные файлы conf/{mods,sites}-{available,enabled} — передраны из Debian без существенных изменений. По их образу и подобию созданы conf/{ports,extra}-{available,enabled}. Содержимое:
- conf/mods-available/<имя модуля>.load — файлы обеспечивающие загрузку модулей и содержащие описание их зависимостей. Примерной формат:
# Depends: <имя требуемого модуля>
LoadModule ...
- conf/mods-available/<имя модуля>.conf — конфигурация для модуля <имя модуля> (если она нужна).
- conf/sites-available/*.conf — конфигурации для сайтов (виртуалхостов).
- conf/ports-available/*.conf — конфигурирования слушаемых портов.
- conf/extra-available/*.conf — конфигурирования компонент общих для всех сайтов. За прототип взято содержимое conf/extra из апстримного apache-2.2.4 (не всё: часть переехала в другие каталоги).
- conf/{mods,sites,ports,extra}-enabled/*.{conf,load} — симлинки на соответствующие conf/{mods,sites,ports,extra}-available/*.{conf,load}, используемые в httpd2.conf.
- conf/include/*.conf — конфигурационные файлы включаемые в другие через:
Include conf/include/...
- Утилиты /usr/sbin/a2{en,dis}{mod,site}, управляющие созданием/удалением симинков conf/*-enabled/* на соответствующие conf/*-available/* взяты из Debian без существенных изменений. /usr/sbin/a2{en,dis}{port,extra} — добавлены, и имеют аналогичные функционал и назначение.
- Добавлена система автоматизированного управления включением/выключением компонент. Состоит из утилиты /usr/sbin/a2chkconfig и конфигов conf/{mods,sites,port,extra}-start.d/*.conf для неё.
- /usr/sbin/a2chkconfig — покомпонентно обрабатывает conf/*-start.d/*.conf (файлы обрабатываются в порядке их имён, обработанные позже имеют приоритет) и вызывает соответствующие a2{en,dis}{mod,site} для компонент упомянутых в конфигах.
- conf/{mods,sites,port,extra}-start.d/*.conf — файлы конфигурации для a2chkconfig. Формат:
<имя компонента>={yes,no}
- Пример применения (включения модуля dir, см. http://lists.altlinux.org/pipermail/sisyphus/2007-March/095644.html):
Варианты включения модуля
На примере модуля dir.
Быстрый
$ sudo -H a2enmod dir
Возможно отключение при выполнении /usr/sbin/a2chkconfig, если требование отключить его будет присутствовать в каком либо из /etc/httpd2/conf/mods-start.d/*.conf (a2chkconfig может вызываться при установке/обновлении/удалении связанных с apache2 пакетов).
- Важно! По умолчанию в дистрибутивах ALT Linux утилита sudo не настроена.
Надёжный
$ sudo -H sh -с 'еcho "dir=yes" >> /etc/httpd2/conf/mods-start.d/900-local.conf'
$ sudo -H a2chkconfig
- Важно! По умолчанию в дистрибутивах ALT Linux утилита sudo не настроена.
Пример: включение HTTPS и виртуальных хостов в ALT Linux Centaurus 6.0
Задача: на машине с одним IP-адресом развернуть виртуальный хостинг сайтов в нескольких доменах; обеспечить поддержку работы по HTTPS.
Замечание 1. При использовании SSL можно выдать только один сертификат на все виртуальные хосты, так что предупреждения о несоответствии ключа доменному имени избежать почти нельзя (исключение: все доменные имена из одного и того же домена, а сертификат выписан на wildcard вида *.общее.доменное.имя
).
Замечание 2. Файл /etc/httpd2/conf/sites-available/ports_all.conf после установки 6.0 отличается от файла в пакете по умолчанию: вместо
NameVirtualHost *
там прибито
NameVirtualHost *:80 NameVirtualHost *:443
И это очень хорошо. Если вы установили пакет из Сизифа и вам нужны виртуальные хосты с SSL, проще всего привести ports_all.conf в такое же состояние, иначе задать виртуальные хосты на разных портах (в данном случае, на 80 и 443) будет невозможно.
Вместо редактирования этого файла можно было создать свой, «включить» его, «выключить» ports_all.conf, да вдобавок позаботиться о том, чтобы ports_all не включался по умолчанию в каталоге настроек по умолчанию (в случае Centaurus имеется файл /etc/httpd2/conf/sites-start.d/000-default.conf, в котором надо удалить строчку ports_all=yes
. Если не сделать последнего, ports_all
будет включаться при каждом запуске a2chkconfig
(в т. ч. при обновлении apache).
Включение Apache2
Через альтератор или вручную с помощью
[root@host-15 ~]# chkconfig httpd2 on [root@host-15 ~]# service httpd2 start
Вторая строка нужна для того, чтобы отработали (если они есть или появятся в будущем) одноразовые сценарии.
Необходимо также убедиться, что пакет apache2-mod_ssl
установлен (или установить его):
[root@host-15 ~]# rpm -qa apache2-mod_ssl apache2-mod_ssl-2.2.17-alt2
Шаблон сайта
Несмотря на «Замечание 1», настройки SSL придётся задавать каждому виртуальному хосту. Более того, собственные настройки виртуального хоста для HTTP и для HTTPS практически совпадают. Следовательно, разумно будет завести три файла: базовый конфигурационный, содержащий include-ы настроек для HTTP и для HTTPS. Все три файла разместим в /etc/httpd2/conf/sites-available.
Базовый файл для сайта srv (srv.conf):
[root@host-15 sites-available]# cat srv.conf <VirtualHost *:80> Include conf/sites-available/srv.include </VirtualHost> <VirtualHost *:443> Include conf/sites-available/srv.include Include conf/sites-available/ssl.include </VirtualHost>
Содержательные настройка сайта srv (srv.include):
[root@host-15 sites-available]# cat srv.include ServerName www.srv.ru ServerAlias srv.ru srv ServerAdmin www-adm@srv.ru DocumentRoot /var/www/vhosts/srv/htdocs ScriptAlias /cgi-bin/ /var/www/vhosts/srv/feedback/cgis/ ErrorLog /var/www/vhosts/srv/log/error_log_a2 TransferLog /var/www/vhosts/srv/log/access_log_a2
Общие настройки SSL (ssl.include):
[root@host-15 sites-available]# cat ssl.include <IfModule ssl_module> SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile "/etc/httpd2/conf/ssl.crt/server.crt" SSLCertificateKeyFile "/etc/httpd2/conf/ssl.key/server.key" </IfModule>
Если для HTTP и HTTPS-версий сайтов ещё что-нибудь различается (например, ведутся раздельные журналы), эти настройки надо выносить из srv.include и явно указывать в srv.conf,
Добавление виртуального хоста
Принято располагать контент виртуальных хостов в каталоге /var/www/vhosts/<имя-хоста>. Поэтому для начала надо создать подкаталоги, упомянутые в настройках:
[root@host-15 ~]# mkdir -p /var/www/vhosts/srv/htdocs [root@host-15 ~]# mkdir -p /var/www/vhosts/srv/log
Затем «разрешить» этот хост:
[root@host-15 ~]# a2ensite srv Site srv installed; run service httpd2 condreload to fully enable.
В результате в каталоге /etc/httpd2/conf/sites-enabled образуются следующие символьные ссылки:
[root@host-15 ~]# ls -l /etc/httpd2/conf/sites-enabled/ итого 0 lrwxrwxrwx 1 root root 31 Мар 3 12:19 000-default.conf -> ../sites-available/default.conf lrwxrwxrwx 1 root root 37 Мар 3 12:30 000-default_https.conf -> ../sites-available/default_https.conf lrwxrwxrwx 1 root root 33 Мар 3 12:19 ports_all.conf -> ../sites-available/ports_all.conf lrwxrwxrwx 1 root root 27 Мар 3 15:36 srv.conf -> ../sites-available/srv.conf
Первые два файла (000-default.conf и 000-default_https.conf) — ссылки на сайты по умолчанию (для HTTP и HTTPS соответственно) а ports_all.conf включает виртуальный хостинг на двух портах. Сайты по умолчанию показываются при обращении к серверу по имени, не совпадающему ни с одним виртуальным хостом (например, по Ip-адресу). Если выключить 000-default.conf и 000-default_https.conf, сайтом по умолчанию станет какой-то виртуальный хост.
Apache рекомендует после этого запустить service httpd2 condreload
, однако в нашем случае сгодится и restart
:
[root@host-15 ~]# service httpd2 restart Stopping httpd2 service: [ DONE ] Checking configuration sanity for httpd2: Syntax OK [ DONE ] Starting httpd2 service: [ DONE ]
С этой поры по адресу http://srv должно быть видно содержимое /var/www/vhosts/srv/htdocs.
Добавление ещё одного виртуального хоста
Если все виртуальные хосты типовые, добавление нового сводится к подмене имени и созданию каталогов (изменения происходят в каталоге /etc/httpd2/conf/sites-available:
[root@host-15 sites-available]# sed 's@srv@srvbis@g' < srv.conf > srvbis.conf [root@host-15 sites-available]# sed 's@srv@srvbis@g' < srv.include > srvbis.include [root@host-15 sites-available]# mkdir -p /var/www/vhosts/srvbis/htdocs [root@host-15 sites-available]# mkdir -p /var/www/vhosts/srvbis/log [root@host-15 sites-available]# a2ensite srvbis Site srvbis installed; run service httpd2 condreload to fully enable. [root@host-15 sites-available]# service httpd2 condreload Reloading httpd2 service: [ DONE ]
Пример 2: включение CGI printenv
Чтобы разрешить CGI, необходимо включить соответствующий модуль:
[root@host-15 ~]# a2enmod cgi Module cgi installed; run service httpd2 condreload to fully enable. [root@host-15 ~]# service httpd2 condreload Reloading httpd2 service: [ DONE ]
Разумеется, пакеты apache2-cgi-bin-printenv
и apache2-cgi-bin
должны быть установлены:
[root@host-15 ~]# rpm -qa apache2-cgi\* apache2-cgi-bin-test-cgi-2.2.17-alt2 apache2-cgi-bin-2.2.17-alt2 apache2-cgi-bin-printenv-2.2.17-alt2
Однако http://localhost/cgi-bin/printenv
покажет ошибку. Дело в том, что файл /var/www/cgi-bin/printenv после установки Centaurus — символьная ссылка на неисполняемый файл в /usr/share/apache2/cgi-bin:
[root@host-15 ~]# ls -l /var/www/cgi-bin /usr/share/apache2/cgi-bin/ /usr/share/apache2/cgi-bin/: итого 8 -rw-r--r-- 1 root root 288 Дек 27 01:43 printenv -rw-r--r-- 1 root root 779 Окт 14 20:33 test-cgi
/var/www/cgi-bin: итого 0 lrwxrwxrwx 1 root root 35 Мар 5 14:43 printenv -> /usr/share/apache2/cgi-bin/printenv lrwxrwxrwx 1 root root 35 Мар 3 12:19 test-cgi -> /usr/share/apache2/cgi-bin/test-cgi
Для управления тестовыми CGI-сценариями имеются соответствующие control-сценарии. В Centaurus достаточно выполнить
[root@host-15 ~]# control cgi-bin_printenv symlink_webmaster_exec
После этого файл станет исполняемым и сценарий заработает:
[root@host-15 ~]# ls -l /var/www/cgi-bin /usr/share/apache2/cgi-bin/ /usr/share/apache2/cgi-bin/: итого 8 -rwxr-xr-x 1 root root 288 Дек 27 01:43 printenv -rw-r--r-- 1 root root 779 Окт 14 20:33 test-cgi
/var/www/cgi-bin: итого 0 lrwxrwxrwx 1 root webmaster 35 Мар 5 14:47 printenv -> /usr/share/apache2/cgi-bin/printenv lrwxrwxrwx 1 root root 35 Мар 3 12:19 test-cgi -> /usr/share/apache2/cgi-bin/test-cgi
Пример 3: документация к Centaurus
Документация к Centaurus 6.0 доступна по 80 порту на сервере. Включается этот доступ с помошью дополнительного блока настроек (т. н. «extra») под названием addon.d
:
[root@host-15 ~]# ls /etc/httpd2/conf/extra-enabled/ httpd-addon.d.conf httpd-icons.conf httpd-mpm.conf httpd-autoindex.conf httpd-languages.conf httpd-multilang-errordoc.conf httpd-default.conf httpd-mime.conf phpMyAdmin.conf [root@host-15 ~]# cat /etc/httpd2/conf/extra-enabled/httpd-addon.d.conf # # Summary: Load config files from the config directory "conf/addon.d" # Provides: Extra #
### # Load config files from the config directory "conf/addon.d". # Include conf/addon.d/A.*.conf
[root@host-15 ~]# cat /etc/httpd2/conf/addon.d/A.docs.conf Alias "/documentation" "/usr/share/doc/documentation" <Directory "/usr/share/doc/documentation"> Allow From all </Directory>
Дополнение addon.d
просто заставляет apache включать все настроечные файлы из каталога /etc/httpd2/conf/addon.d, а в файле /etc/httpd2/conf/addon.d/A.docs.conf содержится объявление дополнительного пути /documentation
.
Для запрета этой возможности можно либо переименовать файл A.docs.conf, чтобы он не начинался с буквы A, либо вовсе запретить addon.d
с помощью:
[root@host-15 ~]# a2disextra httpd-addon.d
Генерация core dump
По умолчанию в дистрибутивах ALT Linux генерация core dump отключена.
Для включения нужно задать шаблон пути к core-файлу в ядре:
# sysctl -p kernel.core_pattern=/tmp/core-%e-%s-%u-%g-%p-%t
чтобы получилось как-то так:
# sysctl -a | grep core kernel.core_uses_pid = 1 kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t kernel.core_pipe_limit = 0
Поскольку инит-скрипт апача устанавливает свои ограничения через limited, то надо создать /etc/sysconfig/limits.d/httpd2 с содержимым
RLIMIT_SOFT_CORE=10000000 RLIMIT_HARD_CORE=10000000
Поскольку limited выбирает файл в limits.d в соответствии с названием процесса, нужно ещё создать символические ссылки на httpd2, в зависимости от того, какие apache2-httpd-* установлены:
ln -s httpd2 /etc/sysconfig/limits.d/httpd2.prefork ln -s httpd2 /etc/sysconfig/limits.d/httpd2.worker
https://lists.altlinux.org/pipermail/sysadmins/2014-June/036782.html