SSO с SAML, Keycloak и Nextcloud

Я пытаюсь настроить Keycloak в качестве IdP (Identity Provider) и Nextcloud в качестве службы. Я хочу настроить Keycloak так, чтобы он представлял страницу единого входа.

Я использую Linux-сервер с процессором, совместимым с Intel. Какая правильная конфигурация?

2 ответа

Решение

Prerequisit

Чтобы использовать этот ответ вам нужно заменить domain.com с фактическим доменом у вас есть. Также замените email@domain.com с вашим рабочим адресом электронной почты.

Предполагается, что у вас установлены и работают docker и docker-compose.

Настройте свои услуги с помощью Docker

В дополнение к keycloak и nextcloud я использую:

  • nginx как обратный прокси
  • letsencyrpt для генерации SSL-сертификатов для поддоменов.

Я настраиваю все необходимые службы с помощью docker и docker-compose. Вот как docker-compose.yml выглядит так:

version: '2'

  nginx-proxy:
    image: jwilder/nginx-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/etc/nginx/vhost.d"
      - "./proxy-default.conf:/etc/nginx/conf.d/my-proxy.default.conf:ro"
      - "/usr/share/nginx/html"
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "./le-cert:/etc/nginx/certs:ro"
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: unless-stopped
    depends_on:
      - nginx-proxy
    container_name: le-proxy-companion
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./le-cert:/etc/nginx/certs:rw"
    volumes_from:
      - nginx-proxy

  keycloak:
    image: jboss/keycloak
    links:
      - keycloak-postgres:postgres
    ports:
      - 8080:8080
    volumes:
      - ./keycloak:/opt/jboss/keycloak
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - "PROXY_ADDRESS_FORWARDING=true"
      - VIRTUAL_PORT=8080
      - VIRTUAL_HOST=kc.domain.com
      - LETSENCRYPT_HOST=kc.domain.com
      - LETSENCRYPT_EMAIL=email@domain.com

  keycloak-postgres:
    image: postgres
    environment:
      - POSTGRES_DB=keycloak
      - POSTGRES_USER=keycloak
      - POSTGRES_PASSWORD=keycloak

  nextcloud:
    image: hoellen/nextcloud
    environment:
      - UPLOAD_MAX_SIZE=10G
      - APC_SHM_SIZE=128M
      - OPCACHE_MEM_SIZE=128
      - CRON_PERIOD=15m
      - TZ=Europe/Berlin
      - DOMAIN=nc.domain.com
      - ADMIN_USER=admin
      - ADMIN_PASSWORD=admin
      - DB_TYPE=mysql
      - DB_NAME=nextcloud
      - DB_USER=nextcloud
      - DB_PASSWORD=nextcloud
      - DB_HOST=nc-db
    volumes:
      - ./nc/nc-data:/data
      - ./nc/nc-config:/config
      - ./nc/nc-apps:/apps2
      - ./nc/nc-themes:/nextcloud/themes
    environment:
      - VIRTUAL_HOST=nc.domain.com
      - LETSENCRYPT_HOST=nc.domain.com
      - LETSENCRYPT_EMAIL=email@domain.com

  nc-db:
    image: mariadb
    volumes:
      - ./nc/nc-db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=nextcloud
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

Я положил мои докер-файлы в папку docker и в этой папке специфичная для проекта папка. Вот keycloak, Создайте их с помощью:

mkdir -p ~/docker/keycloak

Создать docker-compose.yml -Файл с вашим предпочтительным редактором в этой папке. Начать услуги с:

cd ~/docker/keycloak
docker-compose up -d

Подождите, пока службы загрузятся и запустятся. Проверьте, все ли работает с:

docker-compose ps

Если служба не запущена. Выпустить второй docker-compose up -d и проверьте еще раз.

Настройте Keycloak, добавьте новое Царство

Откройте браузер и перейдите на https://kc.domain.com/. Нажмите на Консоль администрирования. Как указано в вашем docker-compose.yml Имя пользователя и пароль admin,

В верхнем левом углу страницы вам нужно создать новое Царство. Нажмите Add, Введите мое царство как имя. Нажмите Save,

Нажми на Keys цвет вкладка. Посмотрите на RSA -Посещение. Нам нужно будет скопировать сертификат этой линии. Нажмите на Certificate и скопируйте и вставьте содержимое в текстовый редактор для последующего использования.

Подготовить закрытый ключ и сертификат для Nextcloud

Откройте терминал и выдайте:

openssl req  -nodes -new -x509  -keyout private.key -out public.cert

Это создает два файла: private.key а также public.cert который нам понадобится позже для сервиса nextcloud.

Настроить Nextcloud

Откройте браузер и перейдите на https://nc.domain.com/. Как указано в вашем docker-compose.yml Имя пользователя и пароль admin,

Вам необходимо активировать SSO & Saml Authenticate который отключен по умолчанию.

Важно! С этого момента не закрывайте текущее окно браузера, пока установка не будет протестирована и запущена. Если вы закроете браузер до того, как все заработает, вы, вероятно, больше не сможете изменять свои настройки в nextcloud. В таком случае вам нужно остановить контейнер nextcloud- и nextcloud-db, удалить соответствующие папки, воссоздать их и начать все заново.

Нажмите на верхний правый символ шестерни и затем на + Apps -знак. Слева теперь видно меню-панель с записью Security, Нажмите на это. Теперь вы видите все приложения безопасности. Нажми на Activate кнопка под SSO & SAML authentication Приложение.

Нажмите на верхний правый символ шестерни снова и нажмите на Admin, Нажмите на SSO & SAML authentication,

Используйте следующие значения:

  • Атрибут для сопоставления UID с: имя пользователя
  • Включите "Использовать аутентификацию SAML для настольных клиентов Nextcloud (требуется повторная аутентификация пользователя)"
  • Скопируйте содержимое public.cert в поле "Сертификат X.509"
  • Скопируйте содержимое private.key в поле "Закрытый ключ поставщика услуг".
  • Идентификатор IdP: https://kc.domain.com/auth/realms/my-realm
  • URL-адрес Целевого IdP, куда SP отправит сообщение с запросом на аутентификацию: https://kc.domain.com/auth/realms/my-realm/protocol/saml
  • URL Расположение IdP, куда SP отправит запрос SLO: https://kc.domain.com/auth/realms/my-realm/protocol/saml
  • Публичный сертификат IdP X.509: скопируйте сертификат из Keycloak из Keys -таб из my-realm, Вам нужно будет добавить "-----BEGIN CERTIFICATE-----" перед ключом и "-----END CERTIFICATE-----" в его конец.
  • В данных поставщика услуг:
    • Атрибут, отображаемое имя: имя пользователя
    • Атрибут, адрес электронной почты: адрес электронной почты Нажмите Download metadata XML и сохраните файл для следующего шага.
  • Настройки безопасности, включите следующие параметры:
    • Указывает, будут ли подписанные сообщения, отправленные этим SP. [Метаданные ИП предложат эту информацию]
    • Указывает, будут ли подписанные сообщения, отправленные этим SP.
    • Указывает, будут ли подписанные сообщения, отправленные этим SP.
    • Указывает требование подписи элементов и, полученных этим SP.
    • Указывает на то, что элементы, полученные этим SP, должны быть подписаны. [Метаданные ИП предложат эту информацию]
  • Проверьте есть Metadata valid за Download metadata XML -Кнопка Эта часть конфигурации должна выглядеть так
  • Нажмите на Download metadata XML-Кнопка. Это генерирует и отправляет файл XML. Сохрани это.

Настроить Keycloak, Клиент

Получите доступ к консоли администратора снова. Нажмите на Clients и в правом верхнем углу нажмите на Create -Кнопка.

Рядом с Импортом нажмите кнопку Select File -Кнопка. Выберите XML-файл, который вы создали на последнем шаге в Nextcloud.

Изменить:

и нажмите Save,

Вам представлен новый экран. Измените следующие поля:

  • Название: Nextcloud
  • Действительные URI перенаправления: https://nc.domain.com/ *
  • Нажмите Save

На вкладке Matters:

  • Нажмите Delete -Кнопка на заранее назначенном role list
  • Нажмите Create
    • Имя: имя пользователя
    • Тип картографа: свойство пользователя
    • Свойство: имя пользователя
    • Имя атрибута SAML: имя пользователя
    • Формат имени атрибута SAML: базовый
    • Нажмите Save
  • Нажмите Create
    • Имя: электронная почта
    • Тип картографа: свойство пользователя
    • Недвижимость: электронная почта
    • Имя атрибута SAML: электронная почта
    • Формат имени атрибута SAML: базовый
    • Нажмите Save

Настроить Keycloak, Добавить пользователя

  • На левой стороне, нажмите на Users
  • В правом верхнем углу нажмите Add users
  • Установите следующие значения:
    • Имя пользователя: пользователь
    • Электронная почта: user@domain.com
    • Нажмите Save
  • На вкладке Credentials:
    • Новый пароль: пользователь
    • Подтверждение пароля: пользователь
    • Временно: Выкл.
    • Нажмите Reset Password
  • Появится окно:
    • Нажмите Change Password

Тестовый забег

Откройте новое окно браузера в режиме инкогнито / приват. Например. для google-chrome press Ctrl-Shift-N, в Firefox прессе Ctrl-Shift-P, Оставьте другое окно браузера открытой страницей настройки nextcloud. В противном случае вы можете заблокировать себя.

Зайдите на https://nc.domain.com/ с помощью окна инкогнито / приватного браузера. Вам предоставляется страница имени пользователя / пароля keycloak. Войти user как имя и пароль. Вас приветствует следующий экран приветствия nextcloud.

Подтверждение

Вот немного обновленная версия для nextcloud 15/16:

Откройте браузер и перейдите на https://kc.domain.com/. Нажмите на Консоль администрирования. Как указано в вашем docker-compose.yml, имя пользователя и пароль - admin.

В верхнем левом углу страницы вам нужно создать новое Царство. Нажмите Добавить. Введите мое царство как имя. Нажмите Сохранить.

Нажмите на вкладку Ключи. Посмотрите на RSA-запись. Нам нужно будет скопировать сертификат этой линии. Нажмите на Сертификат и скопируйте и вставьте содержимое в текстовый редактор для последующего использования. Подготовить закрытый ключ и сертификат для Nextcloud

Откройте терминал и выдайте:

openssl req -nodes -new -x509 -keyout private.key -out public.cert

Это создает два файла: private.key и public.cert, которые нам понадобятся позже для сервиса nextcloud. Настроить Nextcloud

Откройте браузер и перейдите на https://nc.domain.com/. Как указано в вашем docker-compose.yml, имя пользователя и пароль - admin.

Вам необходимо активировать SSO и Saml Authenticate, который по умолчанию отключен.

Важно! С этого момента не закрывайте текущее окно браузера, пока установка не будет протестирована и запущена. Если вы закроете браузер до того, как все заработает, вы, вероятно, больше не сможете изменять свои настройки в nextcloud. В таком случае вам необходимо остановить контейнер nextcloud- и nextcloud-db, удалить соответствующие папки, воссоздать их и начать все заново.

Нажмите на верхний правый символ шестерни и затем на знак + Apps. Слева теперь видно меню-панель с надписью Безопасность. Нажмите на это. Теперь вы видите все приложения безопасности. Нажмите кнопку "Активировать" под приложением аутентификации SSO и SAML.

Снова нажмите на верхний правый символ шестерни и нажмите на Admin. Нажмите на SSO и SAML аутентификацию.

Используйте следующие значения:

Attribute to map UID to:username
Enable "Use SAML auth for the Nextcloud desktop clients (requires user re-authentication)"
Copy the content ofpublic.cert into the 'X.509 Certificate'-field
Copy the content ofprivate.key into the 'Private key of Service Provider'-field.
Identifier of the IdP: https://kc.domain.com/auth/realms/my-realm
URL Target of the IdP where the SP will send the Authentication Request Message: https://kc.domain.com/auth/realms/my-realm/protocol/saml
URL Location of IdP where the SP will send the SLO Request: https://kc.domain.com/auth/realms/my-realm/protocol/saml
Public X.509 certificate of the IdP: Copy the certificate from Keycloak from the Keys-tab of my-realm. You will need to add '-----BEGIN CERTIFICATE-----' in front of the key and '-----END CERTIFICATE-----' to the end of it.
In Identity Provider Data:
    Attribute, displayname: username
    Attribute, email adress: email
    Attribute, Quota: nextcloudquota
    Click Download metadata XML and save the file for the next step.
Security Settings, enable the following options:
    Indicates whether the messages sent by this SP will be signed. [Metadata of the SP will offer this info]
    Indicates whether the messages sent by this SP will be signed.
    Indicates whether the messages sent by this SP will be signed.
    Indicates a requirement for the , and elements received by this SP to be signed.
    Indicates a requirement for the elements received by this SP to be signed. [Metadata of the SP will offer this info]
Check there is a Metadata valid beside the Download metadata XML-Button
Click the Download metadata XML-Button. This generate and send a XML file. Save it.

Настроить Keycloak, Клиент

Получите доступ к консоли администратора снова. Нажмите Клиенты и в правом верхнем углу нажмите кнопку Создать.

Рядом с Импортом нажмите кнопку Выбрать файл. Выберите XML-файл, который вы создали на последнем шаге в Nextcloud.

Изменить:

Client SAML Endpoint: https://kc.domain.com/auth/realms/my-realm

и нажмите Сохранить.

Вам представлен новый экран. Измените следующие поля:

Name: Nextcloud
Valid Redirect URIs: https://nc.domain.com/ *
Click Save

На вкладке вопросы:

Click Delete-Button on the preassigned role list
Click Create
    Name: username
    Mapper Type: User Property
    Property: username
    SAML Attribute Name: username
    SAML Attribute NameFormat: Basic
    Click Save
Click Create
    Name: email
    Mapper Type: User Property
    Property: email
    SAML Attribute Name: email
    SAML Attribute NameFormat: Basic
    Click Save

Нажмите Создать

Name: Roles
Mapper Type: Role List
Role attribute name: Roles
Friendly Name: roles
SAML Attribute NameFormat: Basic
Single Role Attrubute: On
Click Save

Нажмите Создать

Name: nextcloudquota
Mapper Type: User Property
Property: nextcloudquota
SAML Attribute Name: nextcloudquota
SAML Attribute NameFormat: Basic
Click Save

Настроить Keycloak, Добавить пользователя

On the left side, click on Users
On the top-right, click Add users
Set the following values:
    Username: user
    Email: user@domain.com
    Click Save
On the tab Credentials:
    New Password: user
    Password Confirmation: user
    Temporary: Off
    Click Reset Password
A Window pops up:
    Click Change Password

К сожалению, я не могу комментировать ответ @MadMike (недостаточно очков репутации), поэтому я просто даю ответ. С его решением вы копируете закрытый сертификат из keycloak, чего вам определенно не следует делать. И, наконец, вы даже не используете сертификаты для подписи чего-либо... Но вы, вероятно, хотите, чтобы служба Identity (keycloak) и поставщик услуг (Nextcloud) подписывали запросы и ответы. Чтобы быть уверенным, что это те, кем они себя называют, я не знаю достаточно о SAML, чтобы быть уверенным, что из этого действительно нужно подписать, и о том, что нам безразлично. Так что я просто позволю этому подписать как можно больше;-). Я описал весь процесс здесь. Вы должны легко быть в состоянии приспособить это к своим URL.

Другие вопросы по тегам