У меня Ubuntu и Apache + PHP + MySQL отлично работают на коробке в нашей интрасети. Ящик доступен только через IP-адрес (в настоящее время). Теперь я хочу настроить его так, чтобы пользователи, которые уже прошли проверку подлинности через корпоративный сервер Active Directory, могли подключаться к веб-сайту и передавать имя пользователя AD на PHP без необходимости повторного ввода учетных данных AD. Я слышал, что это называется SSPI, но, по-видимому, это только для Windows. Я нашел то, что кажется миллионом различных руководств по выполнению этого под Linux, которые включают редактирование всевозможных файлов конфигурации, и ни одно из руководств не имеет для меня смысла, поскольку большинство из них пытается настроить общие ресурсы Samba в процессе, тогда как я только нужна чистая аутентификация против AD. Самое близкое, что я получил, было с «аналогично-открытым», когда он, наконец, присоединился к домену, но затем инструкции, которые я нашел, чтобы заставить Apache работать с «аналогично-открытым», после этого не имели смысла. В инструкциях, которым я следовал, говорилось, что будет каталог '/ opt / likewise /', содержащий соответствующие двоичные файлы Apache, но в '/ opt' ничего нет (это пустой каталог).
Предположим следующее:
AD server primary DC hostname: ad.primarydc.com (parent company owns this)
AD server primary DC IP: 172.130.0.25
Our AD domain: MAIN (main.ad.primarydc.com)
Our AD domain IP: 10.1.134.67
Our AD admin account that can join computers to the domain: MAIN\admin
Ubuntu box IP: 10.1.134.15
Ubuntu box name: thebox
Ubuntu 12.04.2 LTS
«Аналогично-открытый» установлен, «domainjoin-cli» сказал, что ящик присоединился к домену (THEBOX), а lw-get-status возвращает кучу знакомых вещей.
Ранее были установлены winbind и libapache2-mod-auth-ntlm-winbind (с первой попытки. Однако он так и не присоединился к домену).
Я готов начать все сначала, если есть руководство для новичков, которому легко следовать и которое действительно работает.
Что именно мне нужно сделать, чтобы Apache мог взаимодействовать с AD?
Kerberos - ваш друг! (это то, что AD фактически использует для Auth)
Как использовать Kerberos с PHP
Источник Soureforge и как установить модуль Kerberos в Apache
Вам, вероятно, сначала понадобится: libapache2-mod-auth-curb, согласно:
http://www.microhowto.info/howto/configure_apache_to_use_kerberos_authentication.html
Полный текст:
Чтобы настроить Apache для использования аутентификации Kerberos Фон
Kerberos - это протокол аутентификации, который поддерживает концепцию единого входа (SSO). Пройдя аутентификацию один раз в начале сеанса, пользователи могут получать доступ к сетевым службам в области Kerberos без повторной аутентификации. Для этого необходимо использовать сетевые протоколы, поддерживающие Kerberos.
В случае HTTP поддержка Kerberos обычно предоставляется с использованием механизма аутентификации SPNEGO (простое и защищенное согласование GSS-API). Это также известно как «интегрированная аутентификация» или «согласованная аутентификация». Сам Apache не поддерживает SPNEGO, но поддержку можно добавить с помощью модуля аутентификации mod_auth_kerb. Сценарий
Предположим, вы хотите ограничить доступ к веб-сайту. http://www.example.com/. Аутентификация будет выполняться с использованием Kerberos и SPNEGO. Веб-сайт не обязательно должен быть доступен для веб-браузеров, не поддерживающих SPNEGO.
Пользователи, которым будет предоставлен доступ, являются членами области Kerberos EXAMPLE.COM и называются dougal, brian, ermintrude и dylan. Областью можно управлять с помощью главного bofh / admin. Предпосылки
В приведенном ниже описании предполагается, что вы уже установили и Apache, и Kerberos на веб-сервере.
Apache должен находиться в состоянии, в котором вы можете запросить хотя бы одну страницу с соответствующего веб-сайта для целей тестирования. Он не обязательно должен содержать какой-либо реальный контент (и если он есть, вы, вероятно, захотите предпринять шаги для изоляции сервера от неавторизованных пользователей, пока он не будет должным образом защищен).
Kerberos должен находиться в состоянии, в котором EXAMPLE.COM был настроен как область по умолчанию, и можно получить билет для этой области на веб-сервере. Обзор метода
Описанный здесь метод состоит из шести шагов:
Установите модуль аутентификации mod_auth_kerb. Создайте субъект-службу для веб-сервера. Создайте keytab для субъекта-службы. Укажите используемый метод аутентификации. Укажите список авторизованных пользователей. Перезагрузите конфигурацию Apache.
Обратите внимание, что помимо включения SPNEGO на веб-сервере, может также потребоваться явное включение его в веб-браузере. Как известно, это относится к Mozilla Firefox. Видеть:
Настройте Firefox для аутентификации с использованием SPNEGO и Kerberos
Установите модуль аутентификации mod_auth_kerb
Как отмечалось выше, Apache сам по себе не поддерживает SPNEGO, но его можно добавить с помощью модуля mod_auth_kerb. Он включен в большинство основных дистрибутивов GNU / Linux, но поскольку это сторонний модуль, он обычно упаковывается отдельно от Apache. В системах на основе Debian он предоставляется пакетом libapache2-mod-auth-curb:
apt-get install libapache2-mod-auth-kerb
а в системах на базе Red Hat - пакетом mod_auth_kerb:
yum install mod_auth_kerb
Модули Apache должны быть загружены перед тем, как их можно будет использовать, но оба вышеуказанных пакета организуют это автоматически. Если по какой-либо причине вам нужно сделать это вручную, тогда соответствующая директива конфигурации:
LoadModule auth_kerb_module /usr/lib/apache2/modules/mod_auth_kerb.so
(где путь к модулю следует заменить на то, что подходит для вашей системы). Создайте субъект-службу для веб-сервера
SPNEGO требует, чтобы для веб-сервера был создан субъект службы Kerberos. Имя службы определено как HTTP, поэтому для сервера www.example.com требуемое имя участника службы - HTTP/www.example.com@EXAMPLE.COM.
Если вы используете MIT Kerberos, то субъект-службу можно создать с помощью команды kadmin:
kadmin -p bofh/admin -q "addprinc -randkey HTTP/www.example.com"
См. MicroHOWTO Создание субъекта-службы с использованием MIT Kerberos для получения дополнительной информации о том, как можно создать субъект-службу и зачем он нужен. Создайте keytab для субъекта-службы
Keytab - это файл для хранения ключей шифрования, соответствующих одному или нескольким участникам Kerberos. mod_auth_kerb нужен для того, чтобы использовать созданный выше принципал службы. Если вы используете MIT Kerberos, тогда keytab (например, субъект-службу) можно создать с помощью команды kadmin. Его право собственности должно быть таким, чтобы его мог читать процесс Apache.
В системах на основе Debian подходящим местом для keytab будет /etc/apache2/http.keytab, а соответствующим владельцем является www-data:
kadmin -p bofh/admin -q "ktadd -k /etc/apache2/http.keytab HTTP/www.example.com"
chown www-data /etc/apache2/http.keytab
В системах на основе Red Hat подходящим расположением будет /etc/httpd/http.keytab, а соответствующим владельцем будет apache:
kadmin -p bofh/admin -q "ktadd -k /etc/httpd/http.keytab HTTP/www.example.com"
chown apache /etc/httpd/http.keytab
Параметр -k указывает путь к ключевой вкладке, которая будет создана, если она еще не существует.
См. MicroHOWTO Добавление хоста или принципала службы на вкладку ключей с помощью MIT Kerberos для получения дополнительной информации о создании вкладок ключей, их назначении и почему вкладка ключей по умолчанию (обычно /etc/krb5.keytab) не подходит для использования сетевыми службами, которые не запускайте от root.
Если вы хотите проверить, что ключ был правильно добавлен в keytab, вы можете попытаться использовать его для аутентификации в качестве участника службы, а затем просмотреть полученный билет на выдачу билетов с помощью klist:
kinit -k -t /etc/apache2/http.keytab HTTP/www.example.com
klist
Укажите метод аутентификации, который будет использоваться
Apache необходимо сообщить, какие части каких веб-сайтов должны использовать аутентификацию, предоставляемую mod_auth_kerb. Это делается с помощью директивы AuthType со значением Kerberos. Затем необходимы дополнительные директивы для настройки поведения mod_auth_kerb.
Если цель состоит в том, чтобы применить эти директивы ко всему данному веб-сайту, они могут быть помещены в контейнер с путем, соответствующим корню сайта:
<Location />
AuthType Kerberos
AuthName "Acme Corporation"
KrbMethodNegotiate on
KrbMethodK5Passwd off
Krb5Keytab /etc/apache2/http.keytab
</Location>
Директива AuthName определяет область авторизации HTTP. Его цель - указать пользователю, какой из различных паролей, которые он может знать, необходим для доступа к определенному веб-сайту. При истинной аутентификации Kerberos не должно быть запроса пароля, и mod_auth_kerb, похоже, отлично работает без указания AuthName; однако в документации Apache говорится, что это необходимо, поэтому было бы разумно предоставить его в любом случае. Подходящим значением может быть имя домена, имя области Kerberos или имя организации, которой принадлежит веб-сайт.
В дополнение к протоколу SPNEGO, mod_auth_kerb имеет возможность запрашивать у пользователя пароль с использованием базовой аутентификации, а затем проверять этот пароль, пытаясь аутентифицироваться в KDC. Это может быть полезно, если необходимо, чтобы веб-сайт был доступен для авторизованных пользователей с компьютеров, которые не являются частью области Kerberos, однако это значительно менее безопасно, чем настоящая проверка подлинности Kerberos. По умолчанию включены SPNEGO и парольная аутентификация. В этом примере не требуется, чтобы сайт был доступен для веб-браузеров, не поддерживающих SPNEGO, поэтому аутентификация по паролю была отключена с помощью директивы KrbMethodK5Passwd. Для полноты картины SPNEGO был явно включен с помощью директивы KrbMethodNegotiate.
Директива Krb5Keytab указывает путь к таблице ключей, в которую был добавлен участник службы HTTP. Он должен соответствовать тому, что было передано команде ktadd kadmin ранее в этой процедуре.
Хотя в этом примере использовался контейнер, было бы в равной степени приемлемо, если бы вышеуказанные директивы были размещены внутри, или контейнера, или внутри файла .htaccess. Укажите список авторизованных пользователей
Установка метода аутентификации сама по себе не ограничивает доступ к серверу. Это связано с тем, что Apache по умолчанию разрешает доступ анонимным пользователям, и если это поведение не будет отменено, метод аутентификации (каким бы он ни был) не будет вызываться.
В этом примере есть только четыре пользователя, которым нужен доступ, и самый простой способ организовать это с помощью директивы Require:
<Location />
# ...
Require user dougal@EXAMPLE.COM brian@EXAMPLE.COM ermintrude@EXAMPLE.COM dylan@EXAMPLE.COM
</Location>
Обратите внимание, что каждое имя определяется областью Kerberos, членом которой оно является.
Для серверов с большим количеством пользователей это, очевидно, не масштабируемое решение, однако у Apache есть другие методы авторизации, которые могут эффективно обрабатывать большое количество пользователей, включая mod_authz_dbd и mod_authnz_ldap. Перезагрузите конфигурацию Apache
См. «Заставить системную службу перезагрузить свою конфигурацию». В последних системах на базе Debian требуется следующая команда:
service apache2 force-reload
Соображения безопасности Парольная аутентификация
Как отмечалось выше, mod_auth_kerb имеет возможность запрашивать имя пользователя и пароль из веб-браузера с использованием базовой аутентификации HTTP, а затем проверять, действительны ли это имя пользователя и пароль, с помощью Kerberos. У этого подхода есть три серьезных недостатка по сравнению с настоящей аутентификацией Kerberos:
The password is sent unencrypted as part of the HTTP stream.
The password is exposed to the Apache server.
The password must be entered mid-session.
Первый из этих вопросов можно решить, разрешив доступ через TLS (SSL) и отключив простой HTTP. Второй и третий пункты менее понятны и подрывают многие преимущества безопасности, обеспечиваемые моделью единого входа в целом и Kerberos в частности.
На практике иногда необходимо разрешить доступ с хостов, которые не являются частью области Kerberos, или с пользовательских агентов, не поддерживающих SPNEGO. По этой причине нереально рекомендовать, чтобы аутентификация по паролю никогда не использовалась в качестве запасного варианта, однако этого лучше избегать, если вы можете и не должны быть разрешены только потому, что она включена по умолчанию. СПНЕГО
Аутентификация с использованием SPNEGO решает перечисленные выше проблемы, но способ ее интеграции с HTTP далек от идеала. Когда клиент аутентифицируется в сетевой службе Kerberos, одним из продуктов процесса аутентификации является ключ шифрования, который клиент и сервер могут использовать для защиты любой дальнейшей связи между ними. Это не используется, когда HTTP-соединение аутентифицируется с помощью SPNEGO, что означает, что если соединение перехватывается после завершения аутентификации, то ничто не может помешать злоумышленнику выполнить несанкционированные HTTP-команды.
Этот риск можно значительно снизить, используя TLS (SSL) для защиты соединения. Это предотвращает захват соединения после того, как оно было установлено, и не позволяет серверу принимать соединения с веб-сайтом, для которого у него нет действующего сертификата. Это не идеальное решение из-за большого количества организаций, которые могут выдавать сертификаты. Существует решение, которое использует привязку канала для связывания ключа TLS с Kerberos, однако на момент написания оно не было широко реализовано (и не поддерживается mod_auth_kerb).