Установка SimpleSAMLphp и настройка SAML аутентификации в Ubuntu 16.04

SimpleSAMPLphp – это открытое PHP-приложение аутентификации, которое предоставляет поддержку SAML 2.0 как

Service Provider (SP, поставщик сервиса) или Identity Provider (IdP, поставщик учётных записей).

SAML (Security Assertion Markup Language) – это надежный механизм XML для обмена данными аутентификации и авторизации между приложениями и организациями. SAML часто используется для реализации Web SSO (Single Sign On). Это устраняет необходимость поддерживать несколько наборов учетных данных для аутентификации в разных приложениях. Проще говоря, вы можете использовать одну учетную запись (identity), например имя пользователя и пароль, для доступа к нескольким приложениям.

SimpleSAMLphp подключается к источнику аутентификации (поставщику учётных записей, или IdP) типа LDAP или БД пользователя и проверяет подлинность данных, после чего предоставляет пользователю доступ через поставщика сервиса (SP).

Данное руководство поможет установить SimpleSamplPHP и настроить взаимодействие приложения с MySQL. БД MySQL будет использоваться в качестве источника аутентификации, здесь будут храниться учетные данные.

Требования

  • Сервер Ubuntu 16.04, настроенный согласно этому руководству.
  • Предварительно установленные Apache, MySQL и PHP (все инструкции вы найдете здесь).
  • Доменное имя, указывающее на сервер.
  • Виртуальный хост для домена (больше информации – здесь).
  • Сертификат Let’s Encrypt, который можно получить с помощью этого мануала.

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

Установка SimpleSAMLphp состоит из нескольких этапов. Сначала нужно загрузить приложение и его дополнительные компоненты. Также нужно отредактировать виртуальный хост.

Войдите на сервер.

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

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

Эта команда загрузит сжатый файл download?latest. Распакуйте его с помощью tar.

tar zxf download?latest

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

ls simplesamplphp-1*
simplesamlphp-1.14.14

Скопируйте содержимое каталога в /var/simplesamlphp с помощью команды cp. Укажите правильный номер версии.

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

Флаг –a сохраняет все привилегии копируемых файлов. Точка после исходного файла скопирует все скрытые файлы в новый каталог.

Примечание: Чтобы установить файлы в другое место, обновите несколько файлов. Больше об этом – в официальной документации SimpleSAMLphp.

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

Сначала нужно обновить индекс пакетов:

sudo apt-get update

Чтобы установить зависимости, введите:

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

После установки перезапустите Apache, чтобы включить новые расширения PHP:

sudo systemctl restart apache2

2: Настройка Apache для поддержки SimpleSAMLphp

На данный момент домен должен быть настроен. Также вы должны были заранее создать виртуальный хост для этого домена, который защитит Apache с помощью сертификата Let’s Encrypt.

Теперь нужно настроить этот хост для поддержки SimpleSAMLphp.

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

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

Откройте этот файл:

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

Примечание: Вместо your_domain укажите свой домен.

Файл должен выглядеть так (комментарии опущены для удобства):

<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/*.

...
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 доступным в Интернете. Добавьте в конфигурационный файл следующее:

...
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www/>
Require all granted
</Directory>
...

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

sudo systemctl restart apache2

3: Настройка SimpleSAMLphp

Конфигурационный файл SimpleSAMLphp находится в /var/simplesamlphp/config/config.php. Откройте его:

nano /var/simplesamlphp/config/config.php

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

. . .
'auth.adminpassword'        => 'your_admin_password',
. . .

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

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

openssl rand -base64 32

Флаг -base64 32 предоставляет строку Base64 в 32 символа длиной.

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

. . .
'secretsalt' => 'your_generated_salt',
. . .

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

. . .
'technicalcontact_name'     => 'Administrator',
'technicalcontact_email'    => 'na@example.org',
. . .

Замените Administrator и na@example.org своими данными.

Затем установите часовой пояс. Найдите раздел:

. . .
'timezone' => null,
. . .

Вместо null укажите свой часовой пояс.

. . .
'timezone' => 'America/New_York',
. . .

Примечание: Полный список часовых поясов можно найти здесь.

Сохраните и закройте файл. Теперь вы можете получить доступ к сайту в браузере:

https://your_domain/simplesaml

В браузере вы увидите:

Congratulations, you have successfully installed SimpleSAMLphp. …

Чтобы убедиться, что установка PHP соответствует всем требованиям SimpleSAMLphp, выберите вкладку Configuration и нажмите ссылку Login as administrator. Затем используйте пароль администратора, который вы установили в разделе 3.

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

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

Также вы увидите ссылку Sanity check of your SimpleSAMLphp setup. Кликните по ней, чтобы провести ряд проверок и убедиться, что настройки в порядке.

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

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

Войдите в MySQL  как root.

mysql -u root -p

Введите root-пароль MySQL.

Создайте БД, которая будет источником аутентификации.

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, чтобы расшифровать пароли.

Сбросьте привилегии:

FLUSH PRIVILEGES;

Закройте командную строку MySQL.

exit

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

nano /var/simplesamlphp/config/config.php

Найдите этот раздел:

...
'enable.saml20-idp' => false,
...

Вместо false введите true. Сохраните и закройте файл.

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

nano /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. Нужно раскомментировать его и изменить запрос, чтобы приложение SimpleSAMLphp искало пользователя из таблицы с помощью функции AES_DECRYPT(). Предоставьте функции AES_DECRYPT() тот же ключ, который вы использовали для шифрования паролей в запросе.

Отредактируйте этот раздел и укажите сведения о соединении с базой данных:

...
'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',
),
...

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

5: Тестирование настройки с помощью SAML 2.0 SP Demo

Вы можете протестировать источник аутентификации MySQL. Для этого перейдите во вкладку Authentication и нажмите ссылку Test configured authentication sources. Вам будет представлен список настроенных источников аутентификации.

Кликните example-sql, это и есть ваш ранее настроенный провайдер. Программа запросит имя пользователя и пароль. Введите учетные данные одного из пользователей, которые вы добавляли в таблицу (например, user1 и user1pass).

После этого вы увидите страницу SAML 2.0 SP Demo Example:

SAML 2.0 SP Demo Example
Hi, this is the status page of SimpleSAMLphp. …

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

После этого вы можете интегрировать SimpleSAMLphp со своим приложением. Все инструкции можно найти в документации SimpleSAMLphp API.

Tags: , , ,