[Перевод] Аутентификация в WordPress через OpenAM по протоколу SAMLv2
Введение
SAMLv2, не смотря на почтенный возраст, является стандартом де факто для SSO (Single Sign On) в корпоративной среде. И в этой статье мы настроим вход в WordPress по протоколу SAML используя аутентификацию OpenAM. То есть, при аутентификации в WordPress, пользователи будут перенаправлены в OpenAM и, после аутентификации в OpenAM будут автоматически аутентифицированы в WordPress. Учитывая гибкость OpenAM в настройке способов аутентификации, вы можете настроить вход в WordPress не только по логину и паролю, но еще, например, используя встроенную аутентификацию Windows (NTLMv2 или Kerberos), добавить второй фактор аутентификации (биометрию или одноразовый код) или даже фотографируя QR код в специальном мобильном приложении.
Вместо WordPress может быть практически любое приложение, которое поддерживает технологию единого входа по протоколу SAMLv2. Настройка OpenAM будет практически идентичной. Отличаться будут только настройки самого приложения.
Немного терминологии
Service Provider (SP) — приложение, сервисы которого будут использовать пользователи после аутентификации.
Identity Provider (IdP) — приложение, которое аутентифицирует пользователей и предоставляет Service Provider информацию об аутентифицированных учетных записей.
В нашем случае Identity Provider это OpenAM, а Service Provider — WordPress.
Тестовое окружение
Для демонстрационных целей все приложения будут запущены в Docker контейнерах через утилиту Docker Compose.
Добавьте в файл hosts
имена хоста OpenAM и WordPress 127.0.0.1 openam.example.org wordpress.example.org
соответственно.
В системах под управлением Windows hosts
файл находится C:\Windows\System32\drivers\etc\hosts
. В системах под управлением Linux и Mac — /etc/hosts
.
Создайте файл docker-compose.yml
со следующим содержимым
services:
openam:
image: openidentityplatform/openam:latest
restart: always
hostname: openam.example.org
ports:
- "8080:8080"
volumes:
- openam-data:/usr/openam/config
- ./openam-config.properties:/usr/openam/openam-config.properties:ro
- ./openam-init.sh:/usr/local/tomcat/bin/openam-init.sh:ro
command: |
bash /usr/local/tomcat/bin/openam-init.sh
wordpress:
image: wordpress
restart: always
hostname: wordpress.example.org
ports:
- 8081:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
openam-data:
Для того, чтобы OpenAM сразу был сконфигурирован при запуске, создайте файл настроек OpenAM openam-config.properties
ACCEPT_LICENSES=true
SERVER_URL=http://openam.example.org:8080
DEPLOYMENT_URI=/openam
BASE_DIR=/usr/openam/config
locale=en_US
PLATFORM_LOCALE=en_US
AM_ENC_KEY=
ADMIN_PWD=passw0rd
AMLDAPUSERPASSWD=p@passw0rd
COOKIE_DOMAIN=openam.example.org
ACCEPT_LICENSES=true
DATA_STORE=embedded
DIRECTORY_SSL=SIMPLE
DIRECTORY_SERVER=openam.example.org
DIRECTORY_PORT=50389
DIRECTORY_ADMIN_PORT=4444
DIRECTORY_JMX_PORT=1689
ROOT_SUFFIX=dc=openam,dc=example,dc=org
DS_DIRMGRDN=cn=Directory Manager
DS_DIRMGRPASSWD=passw0rd
и скрипт начальной конфигурации openam-init.sh
#!/bin/bash
/usr/local/tomcat/bin/catalina.sh run &
SERVER_PID=$!
# Wait for OpenAM to respond to isAlive.jsp
until curl -f -s -o /dev/null http://localhost:8080/openam/isAlive.jsp; do
echo "Waiting for OpenAM to fully initialize..."
sleep 5
done
if [[ -f /usr/openam/config/boot.json ]]; then
echo "OpenAM has already been configured."
else
echo "Setting up OpenAM..."
java -jar /usr/openam/ssoconfiguratortools/openam-configurator-tool*.jar --file /usr/openam/openam-config.properties
fi
wait $SERVER_PID
Запустите контейнеры командой docker compose up
.
Настройка WordPress
Начальная конфигурация WordPress
Если WordPress у вас уже сконфигурирован, можете пропустить этот раздел. Если же нет, откройте в браузере ссылку http://wordpress.example.org:8081/wp-admin/install.php. Выберите нужный язык и перейдите к настройкам. Заполните настройки, и обязательно запомните сгенерированный пароль. Он понадобится для входа в консоль администратора.
Начальная настройка WordPress
Нажмите кнопку Install WordPress
.
После окончания конфигурирования перейдите на форму логина и введите логин администратора и пароль, которые были указаны при установке. Откроется консоль администратора.
Установка плагина для SAMLv2
В консоли администратора выберите пункт Plugins. Нажмите кнопку Add New Plugin
и установите плагин miniOrange SAML Single Sign On — SSO Login.
Плагин WordPress для SAML
После установки активируйте плагин, нажав кнопку Activate в окне плагина. В панели слева появится пункт настроек установленного плагина.
Перейдите в панель настроек плагина в раздел Service Provider Metadata
и скопируйте оттуда Metadata URL. Замените в нем порт с 8081 на 80 так как OpenAM будет загружать метаданные из соседнего Docker контейнера WordPress, а внутри среды Docker он доступен на 80 порту: http://wordpress.example.org:80/?option=mosaml_metadata
.
Метаданные SAML SP WordPress
Настройка OpenAM
Создание Hosted Identity Provider
Зайдите в консоль администратора OpenAM по ссылке http://openam.example.org:8080/openam/XUI/#login/.
Введите логин и пароль администратора OpenAM. В нашем случае это будут amadmin
и passw0rd
соотвественно.
В открывшейся консоли откройте Top Level Realm
, нажмите Configure SAMLv2 Provider
→ Create Hosted Identity Provider
.
Создание SAML провайдера в OpenAM
Создание Hosted Identity Provider в OpenAM
Заполните настройки, как на скриншоте и нажмите кнопку Configure
.
Настройки SAML Identity Provider
В консоли администратора перейдите Top Level Realm
в меню слева выберите Applications
→ SAML 2.0
OpenAM SAML
В разделе Entity Providers
откройте настройки Identity Provider http://openam.example.org:8080/openam
. На вкладке Assertion Content
перейдите в раздел Name ID Format
→ NameID Value Map
и добавьте значение urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified=uid
OpenAM SAML NameID Value Map
Нажмите кнопку Save
.
Создание Remote Service Provider
Теперь зарегистрируем WordPress как Remote Service Provider. В консоли администратора OpenAM выберите Top Level Realm
, далее Configure SAMLv2 Provider
→ Configure Remote Service Provider
.
Создание Remote Service Provider в OpenAM
Заполните настройки Remote Service Provider, как показано на скриншоте. URL метаданных должен быть из шага настройки плагина SAMLv2 WordPress: http://wordpress.example.org:80/?option=mosaml_metadata
.
Настройки SAML Service Provider в OpenAM
Регистрация в WordPress OpenAM Identity Provider
Вернитесь в консоль администратора WordPress.
Откройте настройки плагина miniOrange SAML.
Перейдите на вкладку Service Provider Setup
.
В разделе Configure Service Provider
перейдите на вкладку Upload IDP Metadata
.
Заполните поля, как показано на скриншоте ниже. URL метаданных SAML для OpenAM будет http://openam.example.org:8080/openam/saml2/jsp/exportmetadata.jsp
Настройки SAML Service Provider в WordPress
Нажмите кнопку Fetch Metadata
.
Все, на этом конфигурация завершена.
Проверка решения
Теперь давайте проверим решение. Выйдите с консоли администратора WordPress, консоли администратора OpenAM или откройте окно браузера в режиме «Инкогнито». Откройте ссылку http://wordpress.example.org:8081/wp-admin/. В окне логина появится кнопка входа через OpenAM.
Вход в WordPress
Нажмите эту кнопку. Вас перенаправит на аутентификацию OpenAM. Введите имя пользователя demo
и пароль changeit
. Пользователь demo
создается при начальной установке OpenAM. В продуктивной среде его стоит удалить или сменить пароль по умолчанию.
Вход в OpenAM
Нажмите кнопку LOG IN
.
Вы будете аутентифицированы в WordPress с учетной записью пользователя demo
Успешная аутентификация пользователя demo в WordPress