Сценарий для развертывания IdP KeyCloak с хранением и получением пар логин/пароль в Yandex Cloud Lockbox.
При запуске KeyCloak на ВМ как сервис, в конфигурацию /lib/systemd/system/keycloak.service необходимо прописывать логин и пароль в базе данных и логин с паролем администратора в явном виде. При обычном развертывании таких сценариев, приходится передавать секреты в user-data так же в явном виде.
Назначенный на виртуальную машину сервисный аккаунт может аутентифицироваться и авторизоваться в IAM изнутри гостевой ОС по упрощенной схеме. Т.е. достаточно просто получить IAM-токен через yc cli или REST API, не передавая никакой информации о субъекте. Это дает возможность при минимально необходимых правах безопасно передать в гостевую ОС пару ключ/значение (секретная часть) из Lockbox с помощью сервисного аккаунта.
- Сервисный аккаунт обращается к секрету Lockbox через REST
- Lockbox проверяет права на секрет и на ключ, расшифровывает секрет
- В гостевую ОС возвращается JSON с секретом
После применения сценария развертывания скрипт удаляет все промежуточные файлы с секретами и удаляет сервисный аккаунт.
Предполагаем, что у вас уже есть доступ в Yandex Cloud, вы знаете идентификатор своего облака (cloud-id
) и идентификатор каталога (folder-id
) в вашем облаке где будут создаваться облачные ресурсы.
Для развёртывания рабочего окружения установим инструмент Yandex Cloud CLI (yc)
на свой компьютер (подробная инструкция).
Для загрузки рецепта Terraform установите git по инструкции.
Установите инструмент Terraform
на свой компьютер (если он уже не установлен) по (инструкции).
Распакуйте архив и скопируйте файл terraform.exe в каталог C:\Windows\System32
Для корректной установки всех необходимых ресурсов Terraform создайте в домашнем каталоге (/home/<username>
- для MacOS и Linux, C:\Users\Administrator\AppData\Roaming
- для Windows) файл .terraformrc
(для Windows terraform.rc
) с содержимым:
provider_installation {
network_mirror {
url = "https://terraform-mirror.yandexcloud.net/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
- Подключение к Web консоли облака с помощью Яндекс ID (Option A)
- Подключение к Web консоли облака с помощью Федерации удостоверений сервиса Организации (Option B)
- Откроем в новой вкладке браузера консоль облака и, слева внизу, выберем
Учетная запись
и выйдем из всех текущих аккаунтов облака. В результате на экране должна показаться страница с кнопкойВойти в аккаунт на Яндексе
. Закроем эту страницу. - Откроем в новой вкладке ссылку где будет предложено авторизоваться в Яндекс ID
- Введём имя и пароль пользователя для учётной записи Яндекс ID, после чего произойдёт перенаправление в консоль Yandex Cloud
- Перейдём по ссылке для получения OAuth Token. Значение token будет выглядеть примерно так
AQAAAAAABQ0pAATrwPdubkJPerC4mJyaRELWbUY
- Сохраним полученное значение Token в переменной окружения (для Windows – PowerShell, MacOS и Linux – bash)
$env:YC_TOKEN="<ваш OAuth Token>"
export YC_TOKEN=<ваш OAuth Token>
Создадим профиль в yc для работы с облаком
yc config profile create lockbox
yc config set cloud-id <cloud-id>
yc config set folder-id <folder-id>
yc config set token $YC_TOKEN
yc config profile create lockbox
yc config set cloud-id <cloud-id>
yc config set folder-id <folder-id>
yc config set token $env:YC_TOKEN
где вместо <cloud-id>
нужно указать идентификатор своего облака, а вместо <folder-id>
нужно указать идентификатор каталога в облаке. Идентификаторы можно получить из консоли облака через веб интерфейс.
- Создадим профиль в
yc
для работы с облакомгде вместо <cloud-id> нужно указать идентификатор своего облака, например,yc config profile create lockbox yc config set cloud-id <cloud-id> yc config set folder-id <folder-id> yc config set federation-id <federation-id>
b1g8d7gjpvedf23hg3sv
, вместо <folder-id> нужно указать идентификатор каталога в облаке, например,b1guv7crr32qfgiimxwp
, а вместо <federation-id> нужно указать идентификатор федерации, например,yc.your-org-name.federation
. Идентификаторы можно получить из консоли облака через веб интерфейс в разделе сервиса Organizations.
git clone https://github.com/Sayanaro/YandexCloud-Security-Course-KeyCloackVersion.git
cd YandexCloud-Security-Course-KeyCloackVersion
Имена виртуальных машин, домена, и пользователей задаются переменными в файле terraform.tfvars
. Остальные переменные заданы в файле variables.tf
в параметрах по умолчанию.
Для начала зададим переменные окружения:
- Запустите консоль PowerShell
- Выполните:
yc config profile activate security
$env:YC_TOKEN = "ваш OAuth токен"
$env:YC_CLOUD_ID=$(yc config get cloud-id)
$env:YC_FOLDER_ID=$(yc config get folder-id)
- Запустите консоль bash
- Выполните:
yc config profile activate security
export YC_TOKEN="ваш OAuth токен"
export YC_CLOUD_ID=$(yc config get cloud-id)
export YC_FOLDER_ID=$(yc config get folder-id)
- Запустите консоль PowerShell
- Выполните:
yc config profile activate security
$env:YC_TOKEN = $(yc iam create token)
$env:YC_CLOUD_ID=$(yc config get cloud-id)
$env:YC_FOLDER_ID=$(yc config get folder-id)
- Запустите консоль bash
- Выполните:
yc config profile activate security
export YC_TOKEN=$(yc iam create token)
export YC_CLOUD_ID=$(yc config get cloud-id)
export YC_FOLDER_ID=$(yc config get folder-id)
Инициализируйте Terraform:
terraform init
terraform apply
Сценарий попросит ввести 2 пароля: администратора и администратора базы данных PostgreSQL. Паролb должны быть не менее 8 символов, содержать строчные и заглавные буквы, минимум одну цифру 0-9 и минимум один спецсимвол (@#$%&*/:;"',.?+=-_).
Спустя 4 минуты после завершения сценария сервер будет настроен и готов к работе.
# keycloak:
ssh ubuntu@<keycloak_vm_public_ip> -i pt_key.pem