Tutorial

Установка и настройка SimpleSAMLphp для аутентификации SAML в Ubuntu 18.04

PHPSecurityOpen SourceUbuntu 18.04

Введение

SimpleSAMLphp — это PHP-приложение для аутентификации с открытым исходным кодом, которое предоставляет поддержку SAML 2.0 в качестве поставщика сервиса (SP) или поставщика учетных записей (IdP).

SAML (язык разметки подтверждений безопасности) — это защищенный механизм коммуникации на базе XML для обмена данными аутентификации и авторизации между организациями и приложениями. Часто он используется для реализации Web SSO (единый вход в систему). Это устраняет необходимость сохранения нескольких учетных данных для разных организаций. Проще говоря, вы можете использовать одну учетную запись, например имя пользователя и пароль, для доступа к нескольким приложениям.

Экземпляр SimpleSAMLphp подключается к источнику аутентификации, который представляет собой поставщика удостоверений, например LDAP или база данных пользователей. Он выполняет аутентификацию пользователей для этого источника аутентификации, прежде чем предоставлять доступ к ресурсам, предоставляемым связанным поставщиком сервисов.

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

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

Шаг 1 — Загрузка и установка SimpleSAMLphp

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

Войдите на сервер, если вы еще не сделали этого.

Загрузите SimpleSAMLphp на веб-сайте проекта. SimpleSAMLphp всегда использует для последней стабильной версии программного обеспечения один и тот же URL-адрес. Это означает, что мы можем получить последнюю версию, введя следующую команду:

  • wget https://simplesamlphp.org/download?latest

В результате будет загружен сжатый файл с именем download?latest, который содержит SimpleSAMLphp. Выполните извлечение содержимого файла с помощью команды tar:

  • tar zxf download?latest

Файлы будут извлечены в новую директорию с именем simplesamlphp-1.x.y, где x.y — это текущий номер версии. Используйте команду ls для идентификации файла:

  • ls

Вы увидите отображаемое имя файла:

Ouptut
simplesamlphp-1.18.5

Теперь скопируйте содержимое директории в /var/simplesamlphp​​​ с помощью команды cp. Обязательно замените номер версии на номер вашей версии:

  • sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

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

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

Существует несколько дополнительных пакетов программного обеспечения, которые требуются SimpleSAMLphp, включая расширения PHP для работы с XML, многобайтовыми строками, curl и LDAP. Также необходимо установить memcached. Установите все необходимо с помощью вашего диспетчера пакетов.

Вначале обновите список пакетов:

  • sudo apt update

Затем выполните установку пакетов:

  • sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

После завершения установки перезапустите Apache для активации новых расширений PHP:

  • sudo systemctl restart apache2

Теперь, когда SimpleSAMLphp установлен, давайте настроим Apache для обслуживания файлов.

Шаг 2 — Настройка Apache для обслуживания SimpleSAMLphp

Вы уже настроили домен и указали на сервер, а также настроили виртуальный хост для работы с HTTPS, обеспечив защиту Apache с помощью Let’s Encrypt. Давайте используем его для обслуживания SimpleSAMLphp.

Единственная директория SimpleSAMLphp, которая должна быть видима в сети, — /var/simplesamlphp/www. Чтобы открыть для нее доступ из Интернета, измените файл конфигурации виртуального хоста SSL Apache для вашего домена.

Если ваш файл конфигурации виртуального хоста имеет имя your_domain.conf, Let’s Encrypt создает новый файл конфигурации your_domain-le-ssl.conf​​​, который обрабатывает запросы HTTPS для вашего домена. Откройте файл конфигурации SSL с помощью следующей команды, чтобы отредактировать файл. Обязательно замените your_domain на актуальное имя файла:

  • sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf

Файл должен выглядеть следующим образом, хотя фактический файл может иметь более подробные комментарии:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName your_domain

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Директива ServerName задает здесь базовый домен, который должен соответствовать этому определению виртуального хоста. Это должно быть доменное имя, для которого вы настроили сертификат SSL согласно информации в разделе предварительных требований. Давайте добавим директиву Alias, которая будет контролировать SimpleSAMLphp для всех URL-адресов, соответствующих https://your_domain/simplesaml/*. Сделайте это, добавив следующую строку в файл конфигурации:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
...
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  Alias /simplesaml /var/simplesamlphp/www

...

Это означает, что все URL-адреса, совпадающие с domain_name/simplesaml/*, будут направляться в директорию /var/simplesamlphp/www, предоставляя контроль SimpleSAMLphp.

Далее мы предоставим доступ к директории /var/simplesamlphp/www, указав контроль доступа Require all granted​​​ для нее. Это позволит получить доступ к службе SimpleSAMLphp через Интернет. Сделайте это, добавив следующую строку в файл конфигурации:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
...
  Alias /simplesaml /var/simplesamlphp/www
  <Directory /var/simplesamlphp/www/>
      Require all granted
  </Directory>
...

Сохраните и закройте файл. Перезапустите Apache для вступления изменений в силу:

  • sudo systemctl restart apache2

Теперь, когда Apache настроен для обслуживания файлов приложения, давайте настроим SimpleSAMLphp.

Шаг 3 — Настройка SimpleSAMLphp

Далее нам необходимо внести несколько изменений в основную конфигурацию SimpleSAMLphp, размещенную в /var/simplesamlphp/config/config.php​​​. Откройте файл в своем редакторе:

  • nano /var/simplesamlphp/config/config.php

Задайте пароль администратора, заменив в строке 'auth.adminpassword' значение по умолчанию 123​​ на более безопасный пароль. Этот пароль позволяет получить доступ к некоторым страницам в веб-интерфейсе вашей установки SimpleSAMLphp:

/var/simplesamlphp/config/config.php
. . .
'auth.adminpassword'        => 'your_admin_password',
. . .

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

Вы можете использовать функцию OpenSSL rand для генерации случайной строки для использования в качестве строки соли. Откройте новый терминал, подключитесь к серверу еще раз и запустите следующую команду для получения этой строки:

  • openssl rand -base64 32

Опция -base64 32 гарантирует получение зашифрованной по алгоритму Base64 строки длиной 32 символа.

Затем в файле конфигурации найдите запись 'secretsalt'​​​ и замените defaultsecretsalt​​​ на строку, которую вы сгнерировали:

/var/simplesamlphp/config/config.php
. . .
'secretsalt' => 'your_generated_salt',
. . .

Затем задайте техническую контактную информацию. Эта информация будет доступна в генерируемых метаданных, а SimpleSAMLphp будет отправлять автоматически генерируемые отчеты об ошибке на заданный вами адрес электронной почты. Найдите следующий раздел:

/var/simplesamlphp/config/config.php
. . .
'technicalcontact_name'     => 'Administrator',
'technicalcontact_email'    => 'na@example.org',
. . .

Замените Administrator​​​ и na@example.org на соответствующие значения.

Затем задайте часовой пояс, который вы хотите использовать. Найдите следующий раздел:

/var/simplesamlphp/config/config.php
. . .
'timezone' => null,
. . .

Замените null​​​ на предпочитаемый часовой пояс из этого списка часовых поясов для PHP. Обязательно поместите значения в кавычки:

/var/simplesamlphp/config/config.php
. . .
'timezone' => 'America/New_York',
. . .

Сохраните и закройте файл. Теперь вы можете получить доступ к сайту в браузере, указав в адресной строке https://your_domain/simplesaml​​​. Вы увидите следующий экран в браузере:

веб-интерфейс simplesaml

Чтобы убедиться, что ваша установка PHP соответствует всем требованиям SimpleSAMLphp для плавного запуска, выберите вкладку Конфигурация и нажмите ссылку Войти как администратор. Затем воспользуйтесь паролем администратора, заданным в файле конфигурации на шаге 3.

После входа вы увидите список обязательных и дополнительных расширений PHP, которые используются SimpleSAMLphp. Убедитесь, что вы установили каждое расширение, за исключением predis/predis​​​:

Все расширения установлены

Если какие-либо обязательные компоненты отсутствуют, просмотрите это руководство и установите недостающие элементы, прежде чем продолжить.

Также вы увидите ссылку, которая говорит Проверка работоспособности вашей установки SimpleSAMLphp. Нажмите эту ссылку для получения списка проверок, выполненных для вашей установки, чтобы убедиться, что они выполнены успешно.

Теперь давайте перейдем к настройке источника аутентификации для SimpleSAMLphp.

Шаг 4 — Настройка источника аутентификации

Теперь, когда у нас есть установленная и настроенная версия SimpleSAMLphp, давайте настроим источник аутентификации, чтобы мы могли выполнять аутентификацию пользователей. Мы будем использовать базу данных MySQL для хранения списка имен пользователей и паролей для аутентификации.

Чтобы начать, выполните вход в учетную запись root MySQL:

  • mysql -u root -p

Вам будет предложено ввести пароль учетной записи root MySQL. Предоставьте нужные данные, чтобы продолжить.

Затем создайте базу данных, которая будет выполнять роль источника аутентификации. Мы назовем ее auth. Вы можете использовать любое имя по желанию.

  • CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Теперь давайте создадим отдельного пользователя MySQL для работы исключительно в нашей базе данных auth. С точки зрения управления и безопасности рекомендуется использовать базы данных и учетные записи с одной функцией. Мы назовем пользователя authuser. Выполните следующую команду для создания пользователя, задайте пароль и предоставьте доступ к нашей базе данных auth. Не забудьте задать надежный пароль для нового пользователя базы данных.

  • GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';

Теперь создайте таблицу users, которая будет состоять из двух полей: username и password. Для дополнительной безопасности мы будем использовать функцию MySQL AES_ENCRYPT() для шифрования строки пароля, чтобы не сохранять пароли в текстовом формате. Эта функция шифрует строку и возвращает бинарную строку.

  • CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));

Затем добавьте трех пользователей в созданную таблицу. Здесь мы будем использовать функцию AES_ENCRYPT() для шифрования значений для поля пароля. Вам необходимо задать строку, которая используется как ключ шифрования. Обязательно замените ее на собственную строку, которая может быть любой строкой, чем длиннее, тем сложнее.

  • INSERT INTO auth.users(username, password) VALUES
  • ('user1', AES_ENCRYPT('user1pass','your_secret_key')),
  • ('user2', AES_ENCRYPT('user2pass','your_secret_key')),
  • ('user3', AES_ENCRYPT('user3pass','your_secret_key'));

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

Нам нужно установить права, чтобы текущий экземпляр MySQL узнал о последних внесенных нами изменениях в права:

  • FLUSH PRIVILEGES;

Закройте командную строку MySQL с помощью следующей команды:

  • exit

Чтобы активировать функционал поставщика удостоверений в SimpleSAMLphp, нам нужно отредактировать файл /var/simplesamlphp/config/config.php. Существует несколько доступных способов, но поскольку это руководство посвящено поддержке SAML 2.0, мы будем использовать опцию enable.saml20-idp​​​. Для этого откройте /var/simplesamlphp/config/config.php​​​ и активируйте поддержку SAML 2.0:

  • nano /var/simplesamlphp/config/config.php

Найдите следующий раздел файла и замените false​​ на true:

/var/simplesamlphp/config/config.php
...
'enable.saml20-idp' => true,
...

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

Теперь, когда у нас есть активированный поставщик удостоверений, нам нужно указать модуль аутентификации для использования. Поскольку у нас есть таблица пользователей в базе данных MySQL, мы будем использовать модуль аутентификации SQL. Откройте файл конфигурации authsources​​​:

  • nano /var/simplesamlphp/config/authsources.php

Найдите следующий закомментированный блок:

/var/simplesamlphp/config/authsources.php
...
    /*
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
        'username' => 'simplesaml',
        'password' => 'secretpassword',
        'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
    ),
    */
...

Этот код определяет подключение к базе данных и запрос, который SimpleSAMLphp может использовать для поиска пользователя в таблице базы данных с именем users. Нам нужно разкомментировать его и изменить запрос для поиска пользователя из нашей таблицы с помощью функции MySQL AES_DECRYPT(). Нам нужно предоставить функции AES_DECRYPT() тот же ключ, который мы использовали для шифрования паролей в запросе.

Измените раздел файла, чтобы указать данные подключения к базе данных и запрос:

/var/simplesamlphp/config/authsources.php
...
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
        'username' => 'authuser',
        'password' => 'your_mysql_auth_user_password',
        'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
    ),
...

Обязательно укажите секретный ключ, который вы задали, вместо your_secret_key.

Сохраните и закройте файл. Давайте проверим нашего поставщика удостоверений.

Шаг 5 — Тестирование поставщика удостоверений с помощью SAML 2.0 SP Demo

Вы можете протестировать источник аутентификации MySQL, который вы только что настроили, перейдя на вкладку Аутентификация и нажав ссылку Проверить настроенные источники аутентификации. Вы увидите список настроенных источников аутентификации.

Список настроенных источников аутентификации

Нажмите example-sql, поскольку это ваш поставщик, настроенный на предыдущем шаге. Появится запрос на ввод имени пользователя и пароля. Введите данные для любого из трех тестовых пользователей, которых вы добавили в таблицу пользователей MySQL. Попробуйте использовать user1 с паролем user1pass.

После успешной попытки входа вы увидите страницу SAML 2.0 SP Demo Example​​​:

Успешная страница демо

Если вы не можете выполнить вход и знаете, что пароль верный, убедитесь, что вы применяли один и тот же ключ для функции AES_ENCRYPT(), используемой при создании пользователя, и функции AES_DECRYPT(), которая использовалась при поиске пользователя.

Теперь вы можете интегрировать SimpleSAMLphp в ваше приложение согласно документации SimpleSAMLphp API.

Заключение

Теперь у вас есть установленное и настроенное соответствующим образом приложение SimpleSAMLphp в Ubuntu 18.04 VPS. SimpleSAMLphp также позволяет использовать широкий набор вариантов пользовательской настройки интерфейса с помощью тем. Вы можете ознакомиться с документацией по использованию тем для получения дополнительной информации.

Creative Commons License