SSO (единый вход) — это система, которая позволяет получить доступ к нескольким независимым программным системам, используя одни и те же учётные данные. Это просто означает, что с помощью единой аутентификации вы можете войти в несколько сервисов, не вводя пароль. Системы SSO популярны в наши дни, их используют Google, Facebook и другие. Сегодня существует множество серверов SSO, в том числе OneLogin, okta и другие.
Keycloak — это поставщик единого входа с открытым исходным кодом, который поддерживает несколько протоколов, таких как OpenID Connect и SAML 2.0. Эта система управления идентификацией и доступом позволяет легко добавить аутентификацию в приложение и защитить его. Вы можете легко включить социальный вход или использовать существующую Active Directory/LDAP.
Keycloak — это очень расширяемый и настраиваемый инструмент, который предлагает следующие функции:
- Федерация пользователей — позволяет синхронизировать пользователей с серверов Active Directory и LDAP.
- Мост Kerberos – может использоваться для автоматической аутентификации пользователей, вошедших на сервер Kerberos.
- Поддержка тем — Настройте интерфейс для интеграции с вашими приложениями по желанию.
- Поддержка двухфакторной аутентификации — предлагает поддержку HOTP/TOTP через Google Authenticator или FreeOTP.
- Вход через социальные сети — вы можете включить вход через GitHub, Google, Facebook, Twitter и другие социальные сети.
- Он обеспечивает единый вход и выход из приложений для браузеров.
- Брокерство идентификационных данных — позволяет проходить аутентификацию с помощью внешних поставщиков идентификационных данных SAML или Open ID.
- Управление сеансами – администраторы могут просматривать сеансы пользователей и управлять ими.
- Клиентские адаптеры для приложений JavaScript, JBoss EAP, WildFly, Fuse, Jetty, Tomcat, Spring и т. д.
Создайте контейнер базы данных
Создайте сеть для шифрования ключей.
docker network create keycloak-network
Запустите PostgreSQL в модуле.
docker run --name db \
--net keycloak-network \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=Passw0rd \
-e POSTGRES_DB=keycloakdb \
-d docker.io/library/postgres:latest
Просмотрите контейнер.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
479b1599d5a0 postgres:latest "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 5432/tcp db
Подготовка контейнера сервера шифрования ключей
В этом руководстве описаны два способа настройки контейнера Keycloak Server. Вот они:
- Создание оптимизированного образа Keycloak docker
- Используя готовый образ Keycloak docker
1. Используем готовый образ Keycloak docker
Вы также можете использовать готовый образ Docker Keycloak. Приведённая ниже команда показывает, как запустить стандартный образ Keycloak.
docker run -d \
--net keycloak-network \
--name keycloak \
-e KEYCLOAK_USER=admin \
-e KEYCLOAK_PASSWORD=StrongPassw0rd \
-p 8080:8080 \
-p 8443:8443 \
-e KEYCLOAK_DB=postgres \
-e KEYCLOAK_FEATURES=token-exchange \
-e KEYCLOAK_DB_URL=jdbc:postgresql://db/keycloakdb \
-e KEYCLOAK_DB_USERNAME=admin \
-e KEYCLOAK_DB_PASSWORD=Passw0rd \
jboss/keycloak
Не забудьте заменить учетные данные администратора базы данных и Keycloak.
Проверьте состояние контейнера.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a910a9eaa5e1 jboss/keycloak "/opt/jboss/tools/do…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp keycloak
8f5e593eb517 postgres:latest "docker-entrypoint.s…" About an hour ago Up About an hour 5432/tcp db
После завершения установки контейнер должен быть доступен по порту 8443. Доступ к нему можно получить по URL-адресу https://IP_адрес:8443
2. Создание оптимизированного образа Keycloak docker
Вы можете создать собственный образ Keycloak с функцией обмена токенами, поддержкой работоспособности и метрик, а также с базой данных PostgreSQL из приведенного ниже файла Docker.
vim Dockerfile
Добавьте в файл следующие строки
FROM quay.io/keycloak/keycloak:latest as builder
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
ENV KC_FEATURES=token-exchange
ENV KC_DB=postgres
# Install custom providers
RUN curl -sL https://github.com/aerogear/keycloak-metrics-spi/releases/download/4.0.0/keycloak-metrics-spi-4.0.0.jar -o /opt/keycloak/providers/keycloak-metrics-spi-4.0.0.jar
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
# For demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
# Change these values to point to a running postgres instance
ENV KC_DB_URL=jdbc:postgresql://db/keycloakdb
ENV KC_DB_USERNAME=admin
ENV KC_DB_PASSWORD=Passw0rd
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
Не забудьте заменить учетные данные базы данных и IP-адрес в DB_URL на соответствующие значения, прежде чем приступать к созданию образа.
docker build . -t keycloak_image
После создания образа просмотрите его:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
keycloak_image latest c7e3a15f28de 5 seconds ago 754MB
<none> <none> faf55943f0f2 13 seconds ago 734MB
quay.io/keycloak/keycloak latest a669b057e631 36 hours ago 562MB
postgres latest 74b0c105737a 44 hours ago 376MB
Теперь запустите Keycloak в созданном модуле, используя оптимизированный образ.
В рабочем режиме (с защитой по умолчанию)
docker run --name keycloak --net keycloak-network -p 8443:8443 -e KEYCLOAK_ADMIN=myadmin -e KEYCLOAK_ADMIN_PASSWORD=StrongPassw0rd -d keycloak_image
Контейнер будет создан, как показано ниже:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78eb8a3e6ecc keycloak_image "/opt/keycloak/bin/k…" 4 seconds ago Up 3 seconds 8080/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp keycloak
f6f538e7c097 postgres:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp db
После завершения установки контейнер должен быть доступен по порту 8443. Доступ к нему можно получить по URL-адресу https://IP_адрес:8443
Контрольными точками работоспособности являются:
- https://localhost:8443/health
- https://localhost:8443/health/ready
- https://localhost:8443/health/live
Показатели доступны по адресу:
Получение доступа к серверу шифрования ключей
Доступ к Keycloak по URL-адресу https://IP_адрес:8443. Войдите в систему, используя имя пользователя, указанное в переменных среды Docker.
По умолчанию в этой статье используется имя пользователя admin и пароль StrongPassw0rd.
Перейдите в консоль администратора и войдите в систему под именем созданного пользователя.
При вводе правильных учётных данных вы войдёте в панель управления ниже.
У нас уже есть созданная область, мы продолжим и добавим нового клиента на вкладке Клиенты.
Предоставьте подробную информацию для клиента.
Укажите URL-адрес вашего приложения в разделе «Допустимый URL-адрес перенаправления».
Вы также можете создать нового пользователя на вкладке user.
Перейдите на вкладку Учетные данные и установите пароль для пользователя.
Назначьте роли созданному пользователю на вкладке роли
Это была краткая демонстрация того, как начать работу с Keycloak.
Защитите Keycloak с помощью Let’s Encrypt SSL
Необходимо защитить сервер Keycloak с помощью SSL-сертификатов, чтобы предотвратить передачу учётных данных по незащищённому каналу связи. В этом руководстве мы будем использовать Let’s Encrypt для выдачи бесплатных доверенных SSL-сертификатов для нашего доменного имени.
Сначала установите и настройте обратный прокси с помощью Nginx.
##On RHEL 8/CentOS/Rocky Linux 8/Fedora
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo yum install nginx certbot python3-certbot-nginx
##On Debian/Ubuntu
sudo apt install nginx certbot python3-certbot-nginx
Продолжайте и создайте файл виртуального хоста.
sudo vim /etc/nginx/conf.d/keycloak.conf
Файл будет содержать следующие строки.
server {
listen 80;
server_name keycloak.example.com;
client_max_body_size 25m;
location / {
proxy_pass https://localhost:8443/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Сохраните файл, перезапустите и включите Nginx
sudo systemctl restart nginx
sudo systemctl enable nginx
Продолжайте и сгенерируйте SSL-сертификаты для доменного имени с помощью команды:
sudo certbot --nginx
Действуйте, как показано ниже.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): Enter a valid Email address here
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
Account registered.
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: keycloak.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for keycloak.example.com
Performing the following challenges:
http-01 challenge for keycloak.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/keycloak.conf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/keycloak.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://keycloak.example.com
...
Теперь перейдите по ссылке HTTPS на свой сервер Keycloak, используя URL https://имя_домена
Перевод статьи: Run Keycloak Server in Docker Containers with Let’s Encrypt SSL
Дополнительные материалы для обучения: