SSO с SAML, Keycloak и Nextcloud
Я пытаюсь настроить Keycloak в качестве IdP (Identity Provider) и Nextcloud в качестве службы. Я хочу настроить Keycloak так, чтобы он представлял страницу единого входа.
Я использую Linux-сервер с процессором, совместимым с Intel. Какая правильная конфигурация?
- Keycloak будет работать как https://kc.domain.com/
- Nextcloud будет работать как https://nc.domain.com/
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.
Изменить:
- Конечная точка SAML клиента: https://kc.domain.com/auth/realms/my-realm
и нажмите 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.
Подтверждение
- Это руководство было бы невозможно без замечательной записи в блоге http://int128.hatenablog.com/entry/2018/01/16/194048. Я прочитал это с Google-переводчиком на английском языке.
- Спасибо также RMM. Его запись в вики позволила мне создать правильные ключи для 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.