Перейти к содержимому
Главная страница » Запуск Keycloak в Docker

Запуск Keycloak в Docker

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 и т. д.

Создайте контейнер базы данных

При развертывании контейнера Keycloak Server важно иметь базу данных. Для этого мы запустим контейнер базы данных PostgreSQL.

Создайте сеть для шифрования ключей.

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

Контрольными точками работоспособности являются:

Показатели доступны по адресу:

Получение доступа к серверу шифрования ключей

Доступ к 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

Дополнительные материалы для обучения:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *