Apache, OpenID · 8 min read · Dec 27, 2025

Установка и настройка модуля Apache для аутентификации OpenID

Модуль Apache для аутентификации OpenID

OpenID — это широко используемая технология для аутентификации пользователей в веб-приложениях. Она основывается на концепциях распределенной аутентификации пользователей в блог-приложениях. Этот небольшой кулинарный рецепт объясняет шаг за шагом, как установить и настроить модуль Apache mod_auth_oid с открытым исходным кодом.

Предназначение этого модуля — предоставить простую реализацию доверяющей стороны, которая может использоваться для защиты доступа к веб-приложениям и ресурсам на базе Apache. Модуль не реализует все функции, описанные в официальной спецификации. Тем не менее, его возможности уже достаточно зрелы, чтобы обеспечить удобство входа для ваших приложений и пользователей.

Также включены два дополнительных модуля, которые расширяют модуль аутентификации возможностью сопоставления идентификаторов пользователей с локальными пользователями не только через конфигурацию Apache, но и с помощью локального файла сопоставления (который может уже существовать от других приложений) или через Ldap.

Предупреждение о безопасности: Модуль не поддерживает расширения протокола, такие как PAPE. Поэтому использование в средах с более высокими требованиями к защите данных, таких как здравоохранение или денежные транзакции, не рекомендуется.

Установка

Предварительные требования

Для установки этого модуля Apache необходимо выполнить следующие требования:

  • Apache 2.2, включая mod_ssl, mod_proxy, mod_include, заголовочные файлы и apxs/apxs2 (часто упоминается как пакеты apache2 и apache2-devel).
  • Модуль Apache mod_parp для разбора параметров. Получите его отсюда. Установка проста: используйте sudo или войдите как root: $ tar xvBzf mod_parp-0.10-src.tar.gz $ cd mod_parp-0.10 $ sudo apxs2 -i -c apache2/mod_parp.c $ sudo chmod 755 /usr/lib64/apache2/mod_parp.so

Основной модуль

Скачайте и распакуйте исходный код отсюда.

$ tar xvBzf mod_auth_oid-2.0-src.tar.gz  
 $ cd mod_auth_oid-2.0  
 $ sudo apxs2 -i -c -I . -D AOID_MOD_EXT_HOOKS apache2/mod_auth_oid.c -lcrypto -lparp

*Дополнительно: Есть дополнительные модули, которые идут с исходным кодом. Если вы хотите использовать также высоко рекомендуемый дополнительный модуль mod_auth_oid_file.c или mod_auth_oid_ldap.c, пожалуйста, скомпилируйте и установите их также с помощью одной из следующих команд.*

$ sudo apxs2 -i -c -I . apache2/mod_auth_oid_file.c  
 $ sudo apxs2 -i -c -I . apache2/mod_auth_oid_ldap.c

Конфигурация

Раздел сервера

Следующие стандартные модули Apache необходимы:

  • mod_ssl (предоставляет шифровальные процедуры, используемые mod_auth_oid)
  • mod_proxy (предоставляет функции для mod_auth_oid для отправки запросов к провайдерам OpenID)
  • mod_include (предоставляет рендеринг страниц shtml)

Включите модули в глобальном разделе конфигурации вашего Apache. Настройте расположение файла в соответствии с вашей файловой системой. Также важно, чтобы модули загружались после mod_ssl. Поэтому поместите эти строки в конец блока LoadModule вашего Apache. Раскомментируйте последние две строки с модулями сопоставления, если вы собираетесь использовать их также. Если ваша дистрибуция имеет индивидуальный стиль для загрузки модулей, пожалуйста, сделайте это в соответствии с их инструкциями (например, поместите следующие строки в файл, который автоматически включается, если он находится в определенной директории, такой как modules-enabled или аналогичной.

  LoadModule parp_module                    /usr/lib64/apache2/mod_parp.so
  LoadModule auth_oid_module                /usr/lib64/apache2/mod_auth_oid.so
  # LoadModule auth_oid_file_module           /usr/lib64/apache2/mod_auth_oid_file.so
  # LoadModule auth_oid_ldap_module           /usr/lib64/apache2/mod_auth_oid_ldap.so

Попробуйте перезапустить сервер. Если модуль загружен правильно, это должно быть зафиксировано в error.log сервера:

[Sun Nov 06 12:10:59 2011] [notice] Apache/2.2.17 (Linux/SUSE) mod_ssl/2.2.17 OpenSSL/1.0.0c mod_auth_oid/2.0 настроен -- возобновление нормальных операций

Раздел VirtualHost

Теперь пришло время подготовить конкретную конфигурацию для защиты вашего приложения. Отредактируйте конфигурацию вашего VirtualHost. Конечно, это должен быть ваш https VirtualHost, так как мы имеем дело с безопасностью. И замените мой OpenID YOURNAME на ваш собственный OpenID, иначе YOURNAME может однажды украсть ваши коронные драгоценности. ;) Если вы хотите использовать Google в качестве провайдера OpenID, вам нужно будет пойти немного другим путем и добавить AOID_UserPattern, потому что Google использует подход направленной идентичности с непрозрачными OpenID для каждого сайта. В последней главе этого руководства, называемой Сужение пространства имен ваших предпочитаемых провайдеров OpenID, директива конфигурации объясняется на примере Google.

Мы предполагаем, что ресурс, который мы хотим защитить, находится по адресу /private, а обработчик аутентификации расположен по адресу /aoid. Разделы ниже прокомментированы, чтобы указать, что вам нужно сделать.

       # Полная справка обо всех доступных параметрах конфигурации
       # доступна по адресу: http://auth-openid.sourceforge.net/
       # Осторожно: Включите на доверенных CA, поместив их в cacerts
       # Свяжите их с хеш-именами, как описано в документации Apache
       # http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslproxycacertificatepath
       SSLProxyEngine            on
       SSLProxyCACertificatePath /etc/ssl/cacerts

       # используйте флаг httponly, предотвращающий XSS-атаки на сессионные куки
       BrowserMatch              "Mozilla.*Firefox/(3|4)" HttpOnlyCookie
       BrowserMatch              "MSIE [6789]"            HttpOnlyCookie
       BrowserMatch              "Opera/(10|9\.[56789])"  HttpOnlyCookie
       BrowserMatch              Secure SecureCookie

       # базовые настройки mod_auth_oid
       AOID_Realm                /
       AOID_StartPage            /private/index.html
       AOID_LogLevel             info
       AOID_LoginPath            /aoid/login
       AOID_LoginSuffix          .shtml
       AOID_Timeout              300
       AOID_CookieName           AJESSIONID

       # Сопоставление пользователей OpenID. Дополнительные возможности описаны
       # в главе "Локальное сопоставление файлов" страницы Howtoforge
       # разрешенные/известные пользователи ЗАМЕНИТЕ НА ВАШ OPENID
       AOID_User http://YOURNAME.myopenid.com/ YOURNAME

       # Принудительная аутентификация пользователей mod_auth_oid для следующего местоположения
       
         AuthType OpenID
         Require valid-user
       

       # страница входа mod_auth_oid
       # включите SSI для страницы входа (требуется mod_include)
       
          Options            Includes
          AddType            text/html .shtml
          AddOutputFilter    INCLUDES .shtml
       

Файлы

Теперь создайте директорию с именем private в DocumentRoot вашего VirtualHost, которая включает в себя контент, который вы хотите защитить. В качестве примера добавьте файл index.html, который говорит: “Да!! mod_auth_oid крут и я взломал 127.0.0.1!.

Кроме того, вам нужна страница входа в директории aoid, которая также находится в DocumentRoot. В качестве начала вы можете использовать образец страницы SHTML из директории htdocs в архиве. Просто скопируйте его также в ваши htdocs. Проверьте разрешения вновь созданных файлов, чтобы они соответствовали предпочтениям вашего веб-сервера.

Теперь вы можете снова перезапустить ваш Apache. Пожалуйста, проверьте error.log, чтобы убедиться, что все в порядке.

Проверьте вашу установку

Теперь откройте ваш браузер. Если вы все сделали правильно и ваш Apache тоже, то вы должны увидеть страницу входа, когда укажете в браузере следующий URL: https://YOURHOST/private/index.html

Выберите вашего провайдера и отправьте. Модуль перенаправит вас к вашему провайдеру, где вы войдете, и если это было успешно, вас вернут обратно в ваше частное приложение. Если вы выберете Google, просто отправьте предложенный идентификатор OP, в двух других случаях введите ваш OpenID в выделенную часть. Позже в руководстве описано более удобное решение для красивой страницы входа.

Отладка в случае, если что-то пошло не так

В маловероятном случае, если что-то не сработало, как ожидалось, у вас есть несколько указаний на то, что может быть не так в error.log вашего сервера Apache. Сообщения в журнале должны указывать, что не так. Подробный список возможных кодов ошибок и как включить более высокий уровень журнала можно найти на странице mod_auth_oid.

Дополнительные параметры

Красивый экран входа

Я предполагаю, что вы, как и я, и одно из первых, что вы хотите увидеть, это красиво оформленная страница входа в браузере. Выглядит ли что-то подобное достаточно круто для вашего вкуса.

Красивый экран входа

Эта профессионально выглядящая страница входа была создана с помощью проекта с открытым исходным кодом openid-selector, который является удобным способом выбора OpenID.

После генерации страницы входа ее необходимо улучшить с помощью включаемых элементов shtml из mod_auth_oid. Я добавил часть обработки ошибок из оригинальной страницы входа в сгенерированную html-страницу из openid-selector. Мой пример настроенной страницы можно скачать здесь.

Сопоставление локальных идентификаторов пользователей

Если вы также скомпилировали модуль mod_auth_oid_file, то вы также можете сопоставить записи идентификаторов пользователей в локальном файле, вместо того чтобы добавлять их все в файл конфигурации Apache. Подробные инструкции можно найти здесь.

Прочтите следующую главу, чтобы добавить саморегистрацию пользователей с локальным сопоставлением файлов за один раз.

Самоуправление пользователей: сопоставление OpenID с локальным идентификатором пользователя

Предполагая, что у вас уже есть система управления пользователями, основанная на файлах .htpasswd Apache, вы можете использовать следующий фрагмент конфигурации, чтобы улучшить ее, чтобы пользователи могли регистрировать учетные записи OpenID к своим локальным учетным записям. Скопируйте файл file_mapper.html из архива в ваши htdocs.

  # Раздел Virtual Host
  AOID_File_DB              /etc/apache2/mapdb
  AOID_File_AdminPage       /usr/local/apache2/htdocs/file_mapper.html

  # Местоположение администрирования профиля
  # Настройте путь к файлу в соответствии с вашим существующим файлом .htpasswd
  
    AuthUserFile            /srv/data/.htpasswd
    AuthName                'Введите ваше имя пользователя: Отмените, чтобы зарегистрироваться, если у вас его нет.'
    AuthType                Basic
    Require                 valid-user
    SetEnvIf                Request_Method POST parp
    SetEnvIf                Request_Method GET parp
    SetHandler              auth-oid-file
    AOID_File_UserOnly      on
  

Теперь mod_auth_oid_file создает файл mapdb, в котором хранит связь между учетными записями OpenID и локальными учетными записями .htpasswd.

Соображения безопасности

Документ обнаружения доверяющей стороны

OpenID рекомендует размещать Документ обнаружения доверяющей стороны, который указывает правильный адрес return_to для провайдера OpenID. Yahoo укажет ваш сайт как недоверенный, если вы не предоставите такой документ. Дополнительную информацию можно найти здесь.

Сохраните документ с именем openid.xrd в DocumentRoot вашего сайта. Содержимое должно выглядеть примерно так:



    
        
            http://specs.openid.net/auth/2.0/return_to
            https://YOUR_HOST_HERE/aoid/login
        
    

Документ должен быть затем указан либо путем отправки специального заголовка с каждым HTTP-ответом, либо он может быть включен в верхний уровень документа сайта.

Вариант 1: объявите его через заголовок (рекомендуется)

    LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
    # .......
Header set X-XRDS-Location https://YOUR_HOST_HERE/openid.xrd

Вариант 2: объявите его в разделе head верхнего уровня html-документа

  ....
  
  
  ....

Защита от атак DoS и других видов атак

Атаки DoS и межсайтовые подделки запросов являются большой проблемой сегодня. Вы можете эффективно защитить свой сайт от атак DoS с помощью другого модуля с открытым исходным кодом, называемого mod_qos. Этот модуль является швейцарским армейским ножом, когда речь идет о защите вашего сервера от различных видов атак. Модуль можно установить так же легко, как и любой другой модуль Apache. Следующий пример конфигурации показывает базовую конфигурацию, которая защищает ваш сайт от атак DoS и межсайтовых подделок запросов на странице самоуправления.

    # раздел сервера
    LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so

    # обрабатывает соединения от до 100000 различных IP-адресов
    QS_ClientEntries 100000

    # разрешит только 50 соединений на IP
    QS_SrvMaxConnPerIP 50

    # максимальное количество активных TCP-соединений ограничено 256
    MaxClients              256 

    # отключает keep-alive, когда 70% TCP-соединений заняты:
    QS_SrvMaxConnClose      180

    # минимальная скорость запроса/ответа (отказать медленным клиентам, блокирующим сервер, т.е. slowloris, удерживающим соединения открытыми без запроса чего-либо):
    QS_SrvMinDataRate       120 1500 400

    # и ограничить заголовок и тело запроса (осторожно, это ограничивает загрузки и POST-запросы тоже):
    QS_SrvMaxConnClose      70%
    LimitRequestFields      30
    QS_LimitRequestBody     102400

    QS_ClientEventBlockCount 20 300
    QS_SetEnvIfStatus        400               QS_Block
    QS_SetEnvIfStatus        401               QS_Block
    QS_SetEnvIfStatus        403               QS_Block
    QS_SetEnvIfStatus        404               QS_Block
    QS_SetEnvIfStatus        405               QS_Block
    QS_SetEnvIfStatus        406               QS_Block
    QS_SetEnvIfStatus        408               QS_Block
    QS_SetEnvIfStatus        411               QS_Block
    QS_SetEnvIfStatus        413               QS_Block
    QS_SetEnvIfStatus        414               QS_Block
    QS_SetEnvIfStatus        417               QS_Block
    QS_SetEnvIfStatus        500               QS_Block
    QS_SetEnvIfStatus        503               QS_Block
    QS_SetEnvIfStatus        505               QS_Block
    QS_SetEnvIfStatus        QS_SrvMinDataRate QS_Block
    QS_SetEnvIfStatus        NullConnection    QS_Block

    QS_SrvMaxConnExcludeIP 127.0.0.1

    # Защита CSRF формы саморегистрации, установив
    # четыре контрольные точки для администрирования профиля
    QS_MileStone          deny       "^GET /OpenIdLogin"
    QS_MileStone          deny       "^GET /OpenIDRegistration"
    QS_MileStone          deny       "^GET /profile"
    QS_MileStone          deny       "^POST /profile"

Сужение пространства имен ваших предпочитаемых провайдеров OpenID

Вы можете ограничить, каких провайдеров OpenID вы принимаете для аутентификации вашего сайта, с помощью директивы конфигурации AOID_UserPattern. Следующие два примера дают вам общее представление о том, как составить регулярные выражения для этой цели.

  # Раздел VirtualHost
  
  # Разрешить только OpenID от Google
  AOID_UserPattern          "^(https://www\.google\.com/accounts/o8/id\?id=.*)$" "$1"

  # Разрешить только OpenID от my.company.com и использовать только часть для сопоставления с локальным пользователем.
  AOID_UserPattern          "^https://my\.company\.com/([a-z]{1})[a-z]+\.([a-z]{2})[a-z]+$" "$1$2"

Заключительные слова

Спасибо за чтение этого руководства. Я надеюсь, что ваша установка прошла гладко. Желаю вам, чтобы многие пользователи получили выгоду от этого модуля, и надеюсь, что вам было весело его устанавливать. Если вы хотите быть в курсе событий, происходящих с модулем, вы можете подписаться на нашу страницу mod_auth_oid в Facebook.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.