Evolution
Тема интерфейса
Лабораторные работы Evolution

Развертывание Identity Provider Keycloak на виртуальной машине и Managed PostgreSQL®

В этой лабораторной работе вы развернете Identity Provider Keycloak в облаке Cloud.ru для централизованной аутентификации пользователей. Вы создадите инфраструктуру, настроите подключение к управляемой базе данных Managed PostgreSQL®, опубликуете сервис через Nginx и обеспечите безопасный доступ по HTTPS. В результате вы получите готовый сервис аутентификации, полностью изолированный в собственной VPC и доступный из интернета.

Вы будете использовать следующие сервисы:

  • Виртуальные машины — виртуальная машина в облаке для размещения приложения.

  • Публичный IP-адрес — для доступа к сервису через интернет.

  • Managed PostgreSQL® — управляемая база данных PostgreSQL.

  • VPC сеть — изолированная виртуальная сеть для создания безопасной инфраструктуры.

  • nip.io — бесплатный сервис динамического DNS для получения публичного доменного имени и сертификата. Вы также можете использовать собственное зарегистрированное доменное имя и SSL-сертификат для организации доступа.

  • Nginx — для проксирования запросов и организации защищённого HTTPS-доступа к приложению.

  • Let’s Encrypt — для автоматического получения бесплатного SSL-сертификата.

Шаги:

Перед началом работы

  1. Если вы уже зарегистрированы, войдите под своей учетной записью.

1. Разверните ресурсы в облаке

На этом шаге вы подготовите сеть, группу безопасности, виртуальную машину и кластер Managed PostgreSQL®. Все ресурсы будут расположены в одной VPC, что обеспечит сетевую изоляцию.

  1. Создайте виртуальную сеть с названием identity-provider-VPC.

  2. Создайте подсеть со следующими параметрами:

    • Название: identity-provider-subnet.

    • VPC: identity-provider-VPC.

    • Адрес: 10.10.1.0/24.

  3. Создайте группу безопасности с названием identity-provider и добавьте в нее правила:

    • Правило входящего трафика:

      • Протокол: TCP;

      • Порт: 443;

      • Тип источника: IP-адрес;

      • Источник: 0.0.0.0/0.

    • Правило входящего трафика:

      • Протокол: TCP;

      • Порт: 80;

      • Тип источника: IP-адрес;

      • Источник: 0.0.0.0/0.

    • Правило исходящего трафика:

      • Протокол: Любой;

      • Тип адресата: IP-адрес;

      • Адресат: 0.0.0.0/0.

  4. Создайте виртуальную машину со следующими параметрами:

    • Название: identity-provider.

    • Образ: публичный образ Ubuntu 22.04.

    • VPC: identity-provider-VPC.

    • Подсети: identity-provider-subnet.

    • Подключить публичный IP: оставьте опцию включенной.

    • Тип IP: оставьте прямой IP-адрес.

    • Группы безопасности: SSH-access_ru.AZ-1 и identity-provider.

    • Логин: keycloak.

    • Метод аутентификации: Публичный ключ и Пароль.

    • Публичный ключ: укажите ключ, созданный ранее.

    • Пароль: задайте пароль.

    • Имя хоста: identity-provider.

  5. Создайте кластер Managed PostgreSQL со следующими параметрами:

    • Имя кластера: identity-provider.

    • Название базы данных: identity_provider_database.

    • Версия PostgreSQL: 16.

    • Режим: Стандарт.

    • Тип: Single.

    • Подсеть: identity-provider-subnet.

    • Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.

Убедитесь, что ресурсы созданы и отображаются в личном кабинете:

  1. На странице Сети → VPC отображается сеть identity-provider-VPC, а в списке ее подсетей — identity-provider-subnet.

  2. На странице Сети → Группы безопасности отображается группа безопасности identity-provider со статусом «Создана».

  3. На странице Инфраструктура → Виртуальные машины отображается виртуальная машина identity-provider со статусом «Запущена».

  4. На странице Базы данных → Managed PostgreSQL® отображается кластер identity-provider со статусом «Доступен».

2. Настройте окружение виртуальной машины

На этом шаге вы установите необходимые пакеты и подготовите среду для Keycloak.

  1. Активируйте сетевой интерфейс:

    sudo cloud-init clean
    sudo cloud-init init
  2. Обновите систему и установите утилиты:

    sudo apt update && sudo apt upgrade -y
    sudo apt install curl wget unzip software-properties-common -y
  3. Установите и запустите Nginx:

    sudo apt install nginx -y
    sudo systemctl enable nginx
    sudo systemctl start nginx
  4. Установите Java 17:

    sudo apt install openjdk-17-jdk -y
    export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
    echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
  5. Установите Certbot:

    sudo apt install certbot python3-certbot-nginx -y

3. Настройте защищенный доступ через Nginx

На этом шаге вы зарегистрируете доменное имя, настроите Nginx в качестве защищенного прокси, получите SSL-сертификат и ограничите доступ через межсетевой экран.

  1. Создайте конфигурационный файл Nginx:

    sudo nano /etc/nginx/sites-available/identity-provider.conf
  2. Вставьте код, заменив <IP-ADDRESS> на значение публичного IP-адреса виртуальной машины:

    server {
    listen 80;
    server_name <IP-ADDRESS>.nip.io www.<IP-ADDRESS>.nip.io;
    location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port 443;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    }
    }
  3. Сконфигурируйте межсетевой экран:

    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx Full'
    sudo ufw enable
  4. Активируйте конфигурацию и перезапустите Nginx:

    sudo ln -sf /etc/nginx/sites-available/identity-provider.conf /etc/nginx/sites-enabled/identity-provider.conf
    sudo rm -f /etc/nginx/sites-enabled/default
    sudo nginx -t
    sudo systemctl reload nginx
  5. Выпустите SSL-сертификат:

    sudo certbot --nginx -d <IP-ADDRESS>.nip.io --redirect --agree-tos -m <EMAIL>

    Где:

    • <IP-ADDRESS> — публичный IP-адрес виртуальной машины.

    • <EMAIL> — email для регистрации сертификата.

  6. Перейдите по адресу https://<IP-ADDRESS>.nip.io и убедитесь, что браузер отмечает соединение как безопасное.

4. Установите и запустите Keycloak

На этом шаге вы установите Keycloak, настроите подключение к базе данных и запустите сервис как systemd-службу.

  1. Загрузите и распакуйте Keycloak:

    cd /opt
    sudo wget https://github.com/keycloak/keycloak/releases/download/26.0.2/keycloak-26.0.2.tar.gz
    sudo tar -xzf keycloak-26.0.2.tar.gz
    sudo mv keycloak-26.0.2 keycloak
    sudo chown -R keycloak:keycloak /opt/keycloak
    sudo chmod o+x /opt/keycloak/bin/
  2. Создайте файл конфигурации Keycloak:

    sudo nano /opt/keycloak/conf/keycloak.conf
  3. Вставьте код, заменив значения параметров ниже на свои:

    db=postgres
    db-username=<POSTGRES-ADMIN-USER>
    db-password=<POSTGRES-ADMIN-PASSWORD>
    db-url=jdbc:postgresql://<POSTGRES-IP>/identity_provider_database
    proxy=edge
    hostname=https://<IP-ADDRESS>.nip.io
    http-enabled=true
    proxy-headers=xforwarded
    hostname-strict=false
    hostname-admin=https://<IP-ADDRESS>.nip.io
    health-enabled=true
    metrics-enabled=true

    Где:

    • <POSTGRES-ADMIN-USER> — имя пользователя кластера Managed PostgreSQL®.

    • <POSTGRES-ADMIN-PASSWORD> — пароль указанного пользователя.

    • <POSTGRES-IP> — приватный IP-адрес кластера.

    • <IP-ADDRESS> — публичный IP-адрес виртуальной машины.

  4. Соберите приложение:

    sudo -u keycloak /opt/keycloak/bin/kc.sh build
  5. Создайте файл службы systemd:

    sudo nano /etc/systemd/system/keycloak.service
  6. Содержимое файла:

    [Unit]
    Description=Keycloak Identity Provider
    After=network.target
    Wants=network.target
    [Service]
    Type=simple
    User=keycloak
    Group=keycloak
    Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
    Environment=KC_LOG_LEVEL=INFO
    WorkingDirectory=/opt/keycloak
    ExecStart=/opt/keycloak/bin/kc.sh start
    ExecReload=/bin/kill -s HUP $MAINPID
    KillMode=mixed
    KillSignal=SIGINT
    TimeoutStopSec=30
    Restart=always
    RestartSec=10
    [Install]
    WantedBy=multi-user.target
  7. Создайте временного администратора:

    sudo -u keycloak /opt/keycloak/bin/kc.sh bootstrap-admin user
  8. Запустите сервис:

    sudo systemctl daemon-reload
    sudo systemctl enable keycloak
    sudo systemctl start keycloak
  9. Перейдите по адресу https://<IP-ADDRESS>.nip.io и войдите в администраторскую консоль Keycloak, используя созданные учетные данные.

5. Отключите SSH-доступ

Когда вы развернули и настроили сервис, закройте доступ по SSH для повышения безопасности.

  1. В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Инфраструктура → Виртуальные машины.

  2. В списке виртуальных машин выберите identity-provider.

  3. Перейдите на вкладку Сетевые параметры.

  4. В строке подсети нажмите Горизонтальное меню и выберите Изменить группы безопасности.

  5. Удалите группу SSH-access_ru и сохраните изменения.

  6. Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH. После отключения доступа по SSH, администрирование сервиса будет доступно через серийную консоль виртуальной машины.

Что дальше

В ходе лабораторной работы вы развернули Keycloak, настроили его взаимодействие с Managed PostgreSQL®, обеспечили безопасный доступ через Nginx и отключили неиспользуемый SSH-доступ.

Узнавайте больше о работе с сервисами и получайте практические навыки управления облаком, выполняя лабораторные работы.