[Перевод] Аутентификация в 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

Начальная настройка WordPress

Нажмите кнопку Install WordPress.

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

Установка плагина для SAMLv2

В консоли администратора выберите пункт Plugins. Нажмите кнопку Add New Plugin и установите плагин miniOrange SAML Single Sign On — SSO Login.

Плагин WordPress для SAML

Плагин 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

Метаданные 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

Создание SAML провайдера в OpenAM

Создание Hosted Identity Provider в OpenAM

Создание Hosted Identity Provider в OpenAM

Заполните настройки, как на скриншоте и нажмите кнопку Configure.

Настройки SAML Identity Provider

Настройки SAML Identity Provider

В консоли администратора перейдите Top Level Realm в меню слева выберите Applications → SAML 2.0

OpenAM SAML

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

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 в OpenAM

Заполните настройки Remote Service Provider, как показано на скриншоте. URL метаданных должен быть из шага настройки плагина SAMLv2 WordPress:  http://wordpress.example.org:80/?option=mosaml_metadata .

Настройки SAML Service Provider в OpenAM

Настройки 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

Настройки SAML Service Provider в WordPress

Нажмите кнопку Fetch Metadata.

Все, на этом конфигурация завершена.

Проверка решения

Теперь давайте проверим решение. Выйдите с консоли администратора WordPress, консоли администратора OpenAM или откройте окно браузера в режиме «Инкогнито». Откройте ссылку http://wordpress.example.org:8081/wp-admin/. В окне логина появится кнопка входа через OpenAM.

Вход в WordPress

Вход в WordPress

Нажмите эту кнопку. Вас перенаправит на аутентификацию OpenAM. Введите имя пользователя demo и пароль changeit. Пользователь demo создается при начальной установке OpenAM. В продуктивной среде его стоит удалить или сменить пароль по умолчанию.

Вход в OpenAM

Вход в OpenAM

Нажмите кнопку LOG IN.

Вы будете аутентифицированы в WordPress с учетной записью пользователя demo

Успешная аутентификация пользователя demo в WordPress

Успешная аутентификация пользователя demo в WordPress

© Habrahabr.ru