Развёртывание федерации удостоверений в Yandex Cloud на базе решения Keycloak c помощью Container Optimized Image
Это fork репозитория yandex-cloud-examples/yc-iam-federation-with-keycloak-vm. Вы сможете быстро развернуть федерацию удостоверений внутри Docker контейнера на ВМ из образа Container Optimized Image.
Warning
Пример использования модулей оптимизирован для быстрого и дешевого равертывания. Пожалуйста, используйте его только в тестовом окружении. В сравнении с origin репозиторием проведено множество упрощений и рационализаций использования ресурсов, что повлияет на безопасность и надёжность. Keycloak также запускается в dev режиме, это необходимо чтобы избежать билда Docker образа, подробнее в документации Keycloak.
Note
В репозитории не реализована удобная конфигурация ролей пользователей, улучшение и переиспользование некоторых переменных. Coming soon...
- Fast start
- Описанние
- Порядок развёртывания
- Архитектура
-
Клонируйте репозиторий.
git clone https://github.com/maqmm/yc-coivm-federation.git
-
Создайте или убедитесь в корректности конфигурации профиля YC CLI, проверьте, что у аккаунта, используемого в профиле YC CLI есть необходимые роли; проверьте, что существуют ресурсы для быстрого запуска.
-
Сразу после клонирования репозитория, для создания федерации выполните команду:
cd yc-coivm-federation/examples/keycloak-deploy && terraform init && source ../env-yc.sh && terraform apply -auto-approve && cd ../keycloak-config && terraform init && bash ./sync.sh && bash ./wait_for_keycloak.sh && terraform apply -auto-approve ; cd ..
После инициализации, находясь в каталоге examples можно:
-
создавать ресурсы
cd keycloak-deploy && source ../env-yc.sh && terraform apply -auto-approve && cd ../keycloak-config && bash ./sync.sh && bash ./wait_for_keycloak.sh && terraform apply -auto-approve ; cd ..
-
удалять ресурсы
cd keycloak-config && source ../env-yc.sh && terraform destroy -auto-approve && cd ../keycloak-deploy && terraform destroy -auto-approve ; cd ..
Подробную информацию о схеме работы и функционировании федераций можно прочитать в origin репозитории или документации Yandex Cloud. Примерное взаимодействие браузера пользователя, SP и IdP при входе показано на схеме:
-
Пользователь переходит по ссылке
https://console.yandex.cloud/federations/<FED_ID>. Происходит несколько редиректов кauth.yandex.cloud. Генерируется SAMLRequest. В браузер возвращается редирект к SSO URL, указанный в федерации удостоверений. -
Браузер переходит по указанному location в редиректе. В URL query params подставлен SAMLRequest. IdP валидирует SAMLRequest и отправляет форму ввода аутентификационных данных в HTML странице.
-
Пользователь заполняет форму. После нажатия кнопки отправляется POST запрос. IdP валидирует введенные данные. Если проверка прошла успешно, на стороне IdP генерируется SAMLResponse, подставляется в готовый POST запрос, который в свою очередь подставляется в HTML auto-submit форму, которая выполняется при загрузке HTML документа.
-
Браузером загружается страница с формой и POST запрос с SAMLResponse отправляется к SP по ASC USL. Происходит редирект на
https://console.yandex.cloud/.
Плюсы относительно origin репозитория:
---
config:
themeVariables:
xyChart:
backgroundColor: "#00000000"
plotColorPalette: "#858585, #4492f7"
---
xychart-beta
title "Время развертывания"
x-axis ["origin", "this rep"]
y-axis "Time (in min)" 2 --> 15
bar [15, -999]
bar [-999, 3]
---
config:
themeVariables:
xyChart:
backgroundColor: "#00000000"
plotColorPalette: "#858585, #4492f7"
---
xychart-beta
title "Примерная стоимость ресурсов"
x-axis ["origin", "this rep"]
y-axis "Cost (in ₽ per day)" 2 --> 330
bar [327, -999]
bar [-999, 36]
Отличия от origin репозитория
- Вместо Managed PostgreSQL кластера используется dev-file самого Keycloak.
- Keycloak запускается в виде Docker контейнера на ВМ из образа Container Optimized Image.
- Поддерживается переиспользование и определение уже выпущенного Let's Encrypt сертификата, что увеличивает скорость развертывания.
Important
Для корректной работы скрипта env-yc.sh используйте версию YC CLI >= 0.134.0. В ней добавили глобальный флаг --jq. Посмотреть версию: yc version
Для начала рекомендую создать отдельный профиль YC CLI.
Почему?
При выполнении скриптаenv-yc.sh устанавливается множество переменных. В их числе есть IAM-токен, если вы захотите запустить apply через 12 часов, вам снова необходимо обновить переменные с помощью source ../env-yc.sh, так как IAM-токен к этому времени истекет. По умолчанию в скрипте используется текущий профиль YC CLI, если за эти 12 часов вы использовали и активировали другой профиль, то потребуется изменить профиль обратно. Это может быть не совсем удобно. Для определения в скрипте конкрентного профиля, независимо от текущего, воспользуйтесь советом ниже.
Note
Вы можете создать отдельный профиль YC CLI для использования с этой конфигурацией. После этого указать его имя в переменной YC_PROFILE="" файла env-yc.sh, а потом активировать любой необходимый. После сохранения файла во всех его командах будет использоваться указанный профиль вместо текущего по умолчанию.
При настройке профиля помимо аутентификационных данных укажите:
- ID облака -
yc config set cloud-id <id> - ID каталога -
yc config set folder-id <id> - ID организации, если не указать будет использована организация облака -
yc config set organization-id <id>
Если в профиле используется сервисный аккаунт или пользователь без роли resource-manager.clouds.member на облако, советую указать ID организации явно yc config set organization-id <id> или выдать эту роль. Это нужно, чтобы избежать проблем с этой переменной в модуле keycloak-config.
Если в профиле используется федеративный пользователь, перед запуском скрипта env-yc.sh убедитесь, что аутентификация через браузер пройдена, сделать это можно, выполнив любую команду.
-
Если такая зона единственная в каталоге, скрипт env-yc.sh установит её id в значение переменной
dns_zone_exist. В иных случаях, нужно указать ID или имя зоны в файле examples/keycloak-deploy/main.tf в переменныхdns_zone_idилиdns_zone_nameсоответственно. ID будет использовано с высшим приоритетом, чем имя. -
Скрипт env-yc.sh установит значение переменной самостоятельно. Будет использован
organization-idуказанный в используемом профиле или получаит ID организации используемого облака. -
Скрипт env-yc.sh установит значение переменной самостоятельно. Будет использован
cloud-idуказанный в используемом профиле. -
Скрипт env-yc.sh установит значение переменной самостоятельно. Будет использован
folder-idуказанный в используемом профиле.
-
Скрипт env-yc.sh установит значение переменной
kc_cert_existсамостоятельно, если для FQDN Kycloak'а существует выпущенный сертификат в каталоге. В этой же переменной можно указать ID любого другого подходящего сертфиката. Сильно уменьшает время развертывания.Если переменная
kc_cert_existне указана или пустая, то нужный сертификат будет создан с именем из переменнойle_cert_name, необходимая CNAME запись создастся в DNS-зоне. Terraform будет ожидать валидацию и выпуск сертификата. При выполненииdestroyтакой сертификат и его валидирующая DNS-запись имеют параметрprevent_destroy = trueи будут запрещатьdestroyс ошибкой. Чтобы оставить сертификат для дальнейших деплоев выполните командуterraform state rm module.keycloak-deploy.yandex_cm_certificate.kc_le_cert module.keycloak-deploy.yandex_dns_recordset.validation_dns_recили измените в файле keycloak-deploy/dns-cm.tf наprevent_destroy = falseдля удаления сертификата и записи. -
Не устанавливается самостоятельно в примере. Можно указать ID существующей подсети в файле examples/keycloak-deploy/main.tf в переменной
kc_subnet_exist, тогда новые сеть и подсеть создаваться не будут.
Минимальные необходимые роли при использовании созданных ресурсов:
dns.editorна DNS-зону или каталогcompute.editorна каталогvpc.publicAdminна каталогvpc.securityGroups.adminна каталогcertificate-manager.certificates.downloaderна каталогorganization-manager.federations.adminна организацию
Если kc_subnet_exist не указан и вместо существующей подсети создается сеть и подсеть, понадобится:
-
роль
vpc.privateAdminили
-
роль
vpc.adminвместо трёх ролейvpc.publicAdmin,vpc.privateAdmin,vpc.securityGroups.admin
Если kc_cert_exist не указан и вместо существующего сертификата будет создан новый, понадобится:
-
роль
certificate-manager.editorили
-
роль
certificate-manager.adminвместо двух ролейcertificate-manager.certificates.downloaderиcertificate-manager.editor
Caution
Отсутствие у аккаунта роли resource-manager.clouds.member на облако позволит создать все ресурсы, но негативно повлияет на получение ID организации для облака в скрипте env-yc.sh. В таком случае укажите ID организации в используемом профиле CLI командой yc config set organization-id <id> или в переменной org_id файла examples/keycloak-config/main.tf.
Caution
Использование роли dns.editor на конкретной необходимой зоне вместо каталога отнимает у аккаунта возможность получить список зон каталога. В таком случае автоустановка единственной в каталоге зоны с помощью скрипта env-yc.sh будет не работать. Укажите ID или имя зоны в файле examples/keycloak-deploy/main.tf в переменных dns_zone_id или dns_zone_name соответственно.
Caution
При проблемах с удалением федеративных пользователей из организации добавьте аккаунту роль organization-manager.admin на организацию, вместо/к роли organization-manager.federations.admin. Это связано с особенностями провайдера.
Конфигурация пользователей задана в JSON-файле users.json и передается в модуль через переменную users.
Схема переменных
object({
templates = optional(map(object({
first_name = optional(string)
last_name = optional(string)
email_domain = optional(string)
phone = optional(string)
full_name = optional(string)
password = optional(string)
photo_path = optional(string)
temporary_password = optional(bool)
enabled = optional(bool)
})))
users = map(object({
template = optional(string)
first_name = optional(string)
last_name = optional(string)
email_domain = optional(string)
phone = optional(string)
full_name = optional(string)
password = optional(string)
photo_path = optional(string)
temporary_password = optional(bool)
enabled = optional(bool)
}))
})В examples/keycloak-config/users.json используется одна из самых простых конфигураций пользователей:
{
"users": {"user1":{}, "user2":{}}
}Указаны только username двух пользователей.
Но файл конфигурации examples/keycloak-config/users.json также может выглядеть так:
{
"templates": {
"default": {
"first_name": "Default",
"last_name": "User",
"email_domain": "example.com",
"full_name": "Default User",
"password": "DefaultPass123",
"enabled": true,
"photo_path": "~/Pictures/company_logo.jpg",
"temporary_password": false
},
"admin": {
"first_name": "Admin",
"last_name": "User",
"email_domain": "admin.example.com ",
"phone": "+70000000001",
"full_name": "Admin User",
"password": "AdminPass123",
"enabled": true,
"temporary_password": false
},
"": {
"phone": "+70000000000"
}
},
"users": {
"user1": {
"template": "admin",
"first_name": "Иван",
"last_name": "Иванов",
"email_domain": "example.com",
"phone": "+71234567890",
"full_name": "Иван Иванов",
"password": "password123",
"photo_path": "~/Pictures/cats/ava.jpg"
},
"user2": {
"template": "default",
"password": "password456"
}
}
}Шаблоны из templates имеют теже параметры что и пользователи, но не создаются как пользователи. Для пользователя из users можно указать название шаблона в параметре template. Значения из этого шаблона будут использованы при создании такого пользователя, если конкретный параметр явно не указан в объекте самого пользователя. Это нужно для уменьшения объявления однотипных параметров.
- В общем случае, при создании пользователя будет использовано значение параметра явно сконфигурированного в его объекте, например
"password": "password456"дляuser2. - Если для пользователя указан шаблон(
template), то все значения для не указанных явно параметров будут взяты из шаблона с таким именем, например дляuser2будет использовано"full_name": "Default User"из соответствующего шаблона(default). - Если необходимый параметр не указан ни в объекте пользователя, ни в шаблоне, привязанном этому пользователю, то есть ультимативный шаблон
"", его можно не указывать у пользователя, он проверяется для всех пользователей, например дляuser2будет использовано"phone": "+70000000000"из шаблона"". - В завершении проверок, если значения не было объявлено и найдено в предыдущих пунктах, устанавливается нулевое значение и этот параметр не используется у пользователя. Для некоторых параметров есть значения по умолчанию, подробнее в таблице ниже.
| Параметр | Описание | Порядок исползования |
|---|---|---|
first_name |
Имя. Ограничение по длине: 64 символа. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как null |
last_name |
Фамилия. Ограничение по длине: 64 символа. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как null |
email_domain |
Домен, который будет указан в итоговом email пользователя username@email_domain. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Используется FQDN Keycloak из переменной kc_fqdn 5. Устанавливается как null |
phone |
Номер телефона. Ограничение по длине: 64 символа. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как null |
full_name |
Полное имя. Ограничение по длине: 64 символа. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как null |
password |
Пароль пользователя. Если пароль нигде в users.json не указан явно, будет использован сгенерированный. Подробнее про то, как узнать пароли пользователей ниже таблицы. | 1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается сгенерированный в ресурсе random_password.user_password пароль |
photo_path |
Путь к аватару пользователя. Файл будет конвертирован в base64, его длина не должна превышать 204800 символов. |
1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как null |
temporary_password |
Флаг, является ли пароль временным. | 1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как false |
enabled |
Флаг, включен ли пользователь. | 1. Указан у конкретного пользователя в users2. Указан у конкретного, привязанного к пользователю, шаблона из templates3. Указан у ультимативного шаблона "" из templates4. Устанавливается как true |
Команда получения пароля для конкретного пользователя user1 из файла terraform.tfstate в директории examples/keycloak-config/:
cat terraform.tfstate | jq -r '.resources[] | select(.module=="module.keycloak-config" and .type=="keycloak_user" and .name=="users") | .instances[] | select(.index_key=="user1") | .attributes.initial_password[0].value'Команда получения паролей всех пользователей в формате username:password из файла terraform.tfstate в директории examples/keycloak-config/:
cat terraform.tfstate | jq -r '.resources[] | select(.module=="module.keycloak-config" and .type=="keycloak_user" and .name=="users") | .instances[] | "\(.attributes.username):\(.attributes.initial_password[0].value)"'cd yc-coivm-federation/examples/keycloak-deploy && terraform init && source ../env-yc.sh && terraform apply -auto-approve && cd ../keycloak-config && terraform init && bash ./sync.sh && bash ./wait_for_keycloak.sh && terraform apply -auto-approve ; cd ..Переход в директорию examples/keycloak-deploy и инициализация
Изменение директории после git clone https://github.com/maqmm/yc-coivm-federation.git:
cd yc-coivm-federation/examples/keycloak-deployИнициализация провайдеров модуля keycloak-deploy:
terraform initКоманда source использует текущий shell для экспорта переменных окружений, на основе которых будет выполняться terraform plan & apply. При изменении shell'а или истечения 12 часов валидности IAM токена, выполняйте команду:
source ../env-yc.sh| Переменная | Значение |
|---|---|
YC_TOKEN |
IAM-токен, полученный с помощью команды yc iam create-token |
TF_VAR_YC_CLOUD_ID |
ID облака, указанного в профиле |
TF_VAR_YC_FOLDER_ID |
ID каталога, указанного в профиле |
TF_VAR_YC_ORGANIZATION_ID |
ID организации |
TF_VAR_YC_ZONE_ID |
ID публичной DNS зоны |
TF_VAR_CERTIFICATE_ID |
ID сертификата |
- Использует для выполнения команд текущий профиль YC CLI. Подробнее про настройку профиля YC CLI.
- Устанавливает переменную
YC_TOKENкомандойyc iam create-token. - Устанавливает переменную
TF_VAR_YC_CLOUD_IDкомандойyc config get cloud-id. - Устанавливает переменную
TF_VAR_YC_FOLDER_IDкомандойyc config get folder-id. - Устанавливает переменную
TF_VAR_YC_ORGANIZATION_IDкомандойyc config get organization-id, но еслиorganization-idне указана в используемом профиле получает ID организации используемого выше облака командойyc resource-manager cloud get. - Устанавливает переменную
TF_VAR_YC_ZONE_ID, если в указанном выше каталоге одна публичная зона. - Ищет файлы
main.tf, если в обоих файлахkc_adm_pass = "", генерирует и подставляет значения между кавычек. (нужно для безопасности при клонировании репозитория) - Использует зону из следующих источников (отсортировано по уменьшению приоритета): сначала
dns_zone_idиз файла examples/keycloak-deploy/main.tf;dns_zone_nameиз файла examples/keycloak-deploy/main.tf;TF_VAR_YC_ZONE_IDустановленный в пункте 6, если в каталоге единственная публичная DNS зона. Получаетkc_hostnameиз файла examples/keycloak-deploy/main.tf. Устанавливает переменнуюTF_VAR_CERTIFICATE_ID, записывая в неё idISSUEDсертификата, если такой существует в каталоге для полученного ранее в этом пункте FQDN:<kc_hostname>.<ZONE>. - Выводит переменные, которые удалось установить с помощью
echo.
Развертывание модуля keycloak-deploy
Находясь в директории examples/keycloak-deploy:
terraform apply -auto-approveКоманда запускает развертывание ресурсов с автоподтверждением. Ресурсы поднимаются в порядке, соответствующем графу зависимостей.
Переход в директорию examples/keycloak-config и инициализация
Изменение директории после директории examples/keycloak-deploy:
cd ../keycloak-configИнициализация провайдеров модуля keycloak-config:
terraform initbash ./sync.shПроизводит перенос некоторых переменных из файла examples/keycloak-deploy/main.tf в examples/keycloak-config/main.tf.
| Переменная | Значение |
|---|---|
kc_fqdn |
FQDN Keycloak из output прошлого модуля, получает командой terraform -chdir="../keycloak-deploy" output -raw kc_fqdn |
kc_port |
Порт Keycloak из main.tf прошлого модуля. |
kc_adm_user |
Имя пользователя администратора Keycloak из main.tf прошлого модуля. |
kc_adm_pass |
Пароль администратора Keycloak из main.tf прошлого модуля. |
org_id |
ID организации из переменной окружения TF_VAR_YC_ORGANIZATION_ID, установленной скриптом env-yc.sh. |
bash ./wait_for_keycloak.sh- Получает FQDN и порт из файла main.tf.
- Проверят доступность Keycloak в цикле каждую секунду командой
curl --head -k -fsS "https://${KC_FQDN}:${HTTPS_PORT}" 2>/dev/null |sed -n '3p'| grep -q "HTTP/[1-2].*[[:space:]]\(200\|302\)". - Завершается успешно как только Keycloak ответит на запрос корректно или завершается с ошибкой через 360 секунд.
Развертывание модуля keycloak-config
Находясь в директории examples/keycloak-config:
terraform apply -auto-approveКоманда запускает развертывание ресурсов с автоподтверждением. Ресурсы поднимаются в порядке, соответствующем графу зависимостей.
Возврат в директорию examples
Изменение директории после директории examples/keycloak-config:
cd ..Команда выполняется независимо от статуса выполнения предыдущих команд, так как сразу после первого изменения директории и до конца сборной команды рабочей директорией является вложенная в examples директория.
В примере используется образ Container Optimized Image, для виртуальной машины. Keycloak запускается из Docker образа, переданного в Docker Compose спецификацию, в виде метаданных ВМ.
Решение разбито на два модуля, поскольку Keycloak Terraform провайдер требует уже работающего (alive) Keycloak, а блоки provider не поддерживают depends_on.
Граф зависимостей ресурсов модуля. Полузакрашенные ресурсы не будут созданы, если есть и указаны уже существующие.
| Ресурс | Описание | |||
|---|---|---|---|---|
data.yandex_resourcemanager_folder.kc_folder |
Data-source для получения информации о каталоге. | T | M | Y |
null_resource.copy_certificates |
Ресурс для копирования сертификата LE на ВМ. Внутри себя использует provisioners и данные от созданной ВМ для копирования via SSH. | T | ||
| VPC | ||||
yandex_vpc_network.kc_net |
Ресурс создания облачной сети с именем kc_network_name, в каталоге data.yandex_resourcemanager_folder.kc_folder. Не будет создана при указывании в модуле переменной kc_subnet_exist. |
T | M | Y |
yandex_vpc_subnet.kc_subnet |
Ресурс создания облачной подсети с именем kc_subnet_name, с CIDR 10.10.10.0/24, в сети = yandex_vpc_network.kc_net, в зоне доступности kc_zone_id, в каталоге data.yandex_resourcemanager_folder.kc_folder. Не будет создана при указывании в модуле переменной kc_subnet_exist. |
T | M | Y |
data.yandex_vpc_subnet.kc_subnet_existing |
Data-source для получения информации о существующей подсети с id kc_subnet_exist. При объявлении переменной kc_subnet_exist не создаются ресурсы yandex_vpc_network.kc_net и yandex_vpc_subnet.kc_subnet. В examples/ не используется. |
T | M | Y |
yandex_vpc_security_group.kc_sg |
Ресурс создания группы безопасности, которая будет привязана на интерфейс ВМ. Создаётся в сети yandex_vpc_network.kc_net или в сети, которой принадлежит подсеть data.yandex_vpc_subnet.kc_subnet_existing. Разрешает весь исходящий трафик, разрешает TCP трафик с портов 22 и kc_port, разрешает ICMP трафик. |
T | M | Y |
yandex_vpc_address.kc_pub_ip |
Ресурс создания публчиного IP-адреса в зоне доступности kc_zone_id, в каталоге data.yandex_resourcemanager_folder.kc_folder. |
T | M | Y |
| Compute | ||||
data.yandex_compute_image.kc_image |
Data-source для получения информации о последнем образе семейства kc_image_family из каталога standard-images. |
T | M | Y |
yandex_compute_instance.kc_vm |
Ресурс создания виртуальной машины платформы standard-v3 в зоне доступности kc_zone_id. Используется kc_vm_cores ядер, kc_vm_memory оперативной памяти. Загрузочный диск типа network-ssd создается из образа data.yandex_compute_image.kc_image размером min_disk_size образа + 18GB. Сетевой интерфейс использует SG yandex_vpc_security_group.kc_sg и адрес yandex_vpc_address.kc_pub_ip. В метаданные ВМ после заполнения шаблонов передаются: user-data из файла keycloak-deploy/kc-vm-user-data.tpl и спецификация docker-compose из файла keycloak-deploy/kc-vm-docker-compose.tpl. |
T | M | Y |
| Cloud DNS | ||||
data.yandex_dns_zone.kc_dns_zone |
Data-source для получения информации о DNS зоне из каталога data.yandex_resourcemanager_folder.kc_folder. Использует dns_zone_id для получения зоны по id, если эта переменная пустая использует dns_zone_name для получения зоны по имени. Если обе переменные пустые, скрипт env-yc.sh заполняет переменную dns_zone_exist самостоятельно, если в каталоге существует только одна публичная зона. |
T | M | Y |
yandex_dns_recordset.kc_dns_rec |
Ресурс создания A DNS-записи. Устанавливает субдомен из переменной kc_hostname. Запись ведет на публичный IP-адрес ВМ из ресурса yandex_vpc_address.kc_pub_ip. |
T | M | Y |
yandex_dns_recordset.validation_dns_rec |
Ресурс создания DNS-записи для валидации LE сертификата yandex_cm_certificate.kc_le_cert. Значения для записи используются из челленджа ресурса сертификата. |
M | Y | |
| Certificate Manager | ||||
yandex_cm_certificate.kc_le_cert |
Ресурс создания сертификата LE с именем le_cert_name. Использует домен из переменной kc_fqdn, составленный из kc_hostname + DNS-зона. Не создаётся если id существующего сертификата передается в переменную kc_cert_exist. По умолчанию в модуле установлено prevent_destroy = true у сертификата и валидирующей записи, чтобы при destroy нельзя было их удалить и возникала ошибка. Чтобы оставить сертификат для дальнейших деплоев выполните команду terraform state rm module.keycloak-deploy.yandex_cm_certificate.kc_le_cert module.keycloak-deploy.yandex_dns_recordset.validation_dns_rec или измените в файле keycloak-deploy/dns-cm.tf на prevent_destroy = false для удаления сертификата и записи. |
T | M | Y |
data.yandex_cm_certificate.cert_existing |
Data-source для получения информации о существующем сертификате с id kc_cert_exist. Скрипт env-yc.sh заполняет переменную kc_cert_exist самостоятельно, если в каталоге существует ISSUED сертификат с подходящим под kc_fqdn доменом. |
T | M | Y |
data.yandex_cm_certificate.cert_validated |
Data-source для получения информации о существующем сертификате. Использует wait_validation = true для ожидания выпущенного сертификата (yandex_cm_certificate.kc_le_cert или data.yandex_cm_certificate.cert_existing), прошедшего проверку. |
T | M | Y |
data.yandex_cm_certificate_content.cert |
Data-source для получения контента (certificate, private key) сертификата. | T | M | Y |
local_file.cert |
Ресурс создания локального файла cert.pem c certificates из data.yandex_cm_certificate_content.cert. |
T | ||
local_file.key |
Ресурс создания локального файла key.pem c private_key из data.yandex_cm_certificate_content.cert. |
T |
Чтобы получить название в state, нужно добавить префикс перед названием ресурса:
module.keycloak-deploy.<название_ресурса_из_первого_столбца>
В столбце Порядок получения в примере указаны варианты получения этой переменной в examples/ при применении манифеста, от самого приоритетного к менее.
| Переменная | Дефолтное значение | Тип | Описание | Порядок получения в примере |
|---|---|---|---|---|
| Input variables | ||||
cloud_id |
- | string |
ID облака | 1. var.YC_CLOUD_ID указанное в examples/keycloak-deploy/main.tf из переменной TF_VAR_YC_CLOUD_ID, экспортированной скриптом env-yc.sh |
folder_id |
- | string |
ID облака | 1. var.YC_FOLDER_ID указанное в examples/keycloak-deploy/main.tf из переменной TF_VAR_YC_FOLDER_ID, экспортированной скриптом env-yc.sh |
labels |
null | map(string) |
Пары ключ/значения меток для ресурсов | 1. { tag = "keycloak-deploy" } указанное в examples/keycloak-deploy/main.tf2. null как значение модуля по умолчанию |
| VM variables | ||||
kc_image_family |
null | string |
Семейство образов, используемых для ВМ | 1. container-optimized-image указанное в examples/keycloak-deploy/main.tf |
kc_preemptible |
false |
bool |
Прерываемая ли ВМ | 1. true указанное в examples/keycloak-deploy/main.tf2. false как значение модуля по умолчанию |
kc_zone_id |
ru-central1-d |
string |
Зона размещения ВМ | 1. ru-central1-d указанное в examples/keycloak-deploy/main.tf2. ru-central1-d как значение модуля по умолчанию |
kc_hostname |
sso |
string |
Будет использовано для name и hostname ВМ, а также как субдомен. |
1. fed указанное в examples/keycloak-deploy/main.tf2. sso как значение модуля по умолчанию |
kc_vm_cores |
2 |
number |
Количество vCPU ВМ | 1. 2 как значение модуля по умолчанию |
kc_vm_memory |
2 |
number |
Количество RAM ВМ в GB | 1. 2 как значение модуля по умолчанию |
kc_vm_core_fraction |
100 |
number |
Уровень производительности ВМ в процентах | 1. 100 как значение модуля по умолчанию |
kc_vm_username |
admin |
string |
Имя пользователя ВМ, передаваемое в метаданные | 1. admin указанное в examples/keycloak-deploy/main.tf2. admin как значение модуля по умолчанию |
kc_vm_ssh_pub_file |
null | string |
Путь и имя файла публичного SSH-ключа | 1. ~/.ssh/id_rsa.pub указанное в examples/keycloak-deploy/main.tf |
kc_vm_ssh_priv_file |
null | string |
Путь и имя файла публичного SSH-ключа | 1. Использует указанное в examples/keycloak-deploy/main.tf значени 2. Если не указано, то подставляется null по умолчанию, в модуле используется значение переменной kc_vm_ssh_pub_file с удаленным .pub |
| Keycloak variables | ||||
kc_ver |
24.0.0 |
string |
Используемая версия Keycloak | 1. 26.1.1 указанное в examples/keycloak-deploy/main.tf2. 24.0.0 как значение модуля по умолчанию |
kc_adm_user |
null | string |
Имя пользователя администратора Keycloak | 1. admin указанное в examples/keycloak-deploy/main.tf |
kc_adm_pass |
null | string |
Пароль администратора Keycloak | 1. Генерируется и подставляется значение при запуске скрипта env-yc.sh при условии что в обоих main.tf эта переменная равна "" 2. "" указанное в examples/keycloak-deploy/main.tf |
| VPC variables | ||||
kc_network_name |
null | string |
Имя сети | 1. forkc указанное в examples/keycloak-deploy/main.tf |
kc_subnet_name |
null | string |
Имя подсети | 1. forkc-ru-central1-d указанное в examples/keycloak-deploy/main.tf |
kc_subnet_exist |
null | string |
ID существующей подсети. Если указать эту переменную подсеть и сеть создаваться не будут, а будет использоваться указанная подсеть. | - |
kc_port |
8443 |
string |
Порт Keycloak | 1. 8443 указанное в examples/keycloak-deploy/main.tf2. 8443 как значение модуля по умолчанию |
kc_vm_sg_name |
kc-sg |
string |
Имя группы безопасности | 1. kc-sg указанное в examples/keycloak-deploy/main.tf2. kc-sg как значение модуля по умолчанию |
| DNS zone variables | ||||
dns_zone_id |
null | string |
ID DNS зоны | Для создания DNS зоны: 1. Значение из dns_zone_id2. Имя из dns_zone_name3. Если публичная DNS зона одна в каталоге, то используется она из переменной dns_zone_exist = var.YC_ZONE_ID при запуске скрипта env-yc.sh. |
dns_zone_name |
null | string |
Имя DNS зоны | Для создания DNS зоны: 1. Значение из dns_zone_id2. Имя из dns_zone_name3. Если публичная DNS зона одна в каталоге, то используется она из переменной dns_zone_exist = var.YC_ZONE_ID при запуске скрипта env-yc.sh. |
dns_zone_exist |
null | string |
ID единственной в каталоге DNS зоны | Для создания DNS зоны: 1. Значение из dns_zone_id2. Имя из dns_zone_name3. Если публичная DNS зона одна в каталоге, то используется она из переменной dns_zone_exist = var.YC_ZONE_ID при запуске скрипта env-yc.sh. |
| LE Certificate variables | ||||
kc_cert_exist |
null | string |
ID готового сертификата, если указать сертификат не будет создаваться и валидироваться | 1. var.CERTIFICATE_ID указанное в examples/keycloak-deploy/main.tf из переменной TF_VAR_CERTIFICATE_ID, экспортированной скриптом env-yc.sh |
le_cert_name |
null | string |
Имя сертификата, который будет создан | 1. kc указанное в examples/keycloak-deploy/main.tf |
le_cert_descr |
null | string |
Описание сертификата, который будет создан | - |
Граф зависимостей ресурсов модуля. Множественными элементами обозначены ресурсы, количество которых зависит от конфигурации пользователей.
| Ресурс | Описание | |||
|---|---|---|---|---|
| Cloud Organization | ||||
data.yandex_client_config.client |
Data-source для получения атрибутов провайдера. Токен, полученный таким способом используется в null_resource.federation_cert для API-запроса установки сертификата. |
T | M | |
yandex_organizationmanager_saml_federation.kc_fed |
Ресурс создания федерации удостоверений с именем fed_name в организации org_id. |
T | M | Y |
null_resource.federation_cert |
Ресурс для получения сертификата realm'а по URL https://${kc_fqdn}:${kc_port}/realms/${kc_realm_name}/protocol/saml/descriptor. Затем сертификат устанавливается в федерацию удостоверений POST-запросом к https://organization-manager.api.cloud.yandex.net/organization-manager/v1/saml/certificates. |
T | Y | |
yandex_organizationmanager_saml_federation_user_account.org_users |
Ресурс создания федеративных пользователей в организации. Создается по такому ресурсу для каждого пользователя в users. Передаётся Name ID и ID федерации, которой пренадлежит пользователь. |
T | M | Y |
| Keycloak | ||||
keycloak_realm.realm |
Ресурс создания realm'а с именем kc_realm_name и отображаемым именем kc_realm_descr. |
T | K | |
keycloak_saml_client.client |
Ресурс создания SAML-клиента. Подставляет ACS URL со страницы федерации в параметры client_id, base_url, valid_redirect_uris, idp_initiated_sso_relay_state. |
T | K | |
keycloak_realm_user_profile.user_profile |
Ресурс кофигурирования схемы профиля пользователя. Устанавливаются атрибуты и их правила валидации. Атрибуты можно будет установить созданным пользователям. | T | K | |
random_password.user_password |
Ресурс создания паролей для всех пользователей из users. Пароль будет использован только для пользователей без указанного пароля, подробнее в конфигурировании пользователей. |
T | ||
keycloak_user.users |
Ресурс создания пользователей, перечисленных в users. Подробнее в конфигурировании пользователей. |
T | K | |
keycloak_saml_user_property_protocol_mapper.property_email |
Ресурс создания протокол-маппера, позволяющего мапить свойства из Keycloak модели пользователя в атрибут SAML assertion. email |
T | Y | |
keycloak_saml_user_property_protocol_mapper.property_surname |
Ресурс создания протокол-маппера, позволяющего мапить свойства из Keycloak модели пользователя в атрибут SAML assertion. lastName |
T | Y | |
keycloak_saml_user_property_protocol_mapper.property_givenname |
Ресурс создания протокол-маппера, позволяющего мапить свойства из Keycloak модели пользователя в атрибут SAML assertion. firstName |
T | Y | |
keycloak_saml_user_attribute_protocol_mapper.attribute_fullname |
Ресурс создания протокол-маппера, позволяющего мапить кастомный атрибут пользователя в атрибут SAML assertion. name |
T | Y | |
keycloak_saml_user_attribute_protocol_mapper.attribute_phone |
Ресурс создания протокол-маппера, позволяющего мапить кастомный атрибут пользователя в атрибут SAML assertion. phone |
T | Y | |
keycloak_saml_user_attribute_protocol_mapper.attribute_avatar |
Ресурс создания протокол-маппера, позволяющего мапить кастомный атрибут пользователя в атрибут SAML assertion. thumbnailPhoto |
T | Y | |
keycloak_generic_protocol_mapper.role_list_mapper |
Ресурс создания универсального протокол-маппера. Role |
T | ||
keycloak_generic_protocol_mapper.group_membership |
Ресурс создания универсального протокол-маппера. member |
T |
Чтобы получить название в state, нужно добавить префикс перед названием ресурса:
module.keycloak-config.<название_ресурса_из_первого_столбца>
В столбце Порядок получения в примере указаны варианты получения этой переменной в examples/ при применении манифеста, от самого приоритетного к менее.
| Переменная | Дефолтное значение | Тип | Описание | Порядок получения в примере |
|---|---|---|---|---|
| Input variables | ||||
labels |
null | map(string) |
Пары ключ/значения меток для ресурсов | 1. { tag = "keycloak-config" } указанное в examples/keycloak-config/main.tf2. null как значение модуля по умолчанию |
| Organization variables | ||||
org_id |
null | string |
ID организации, в которой будет создана федерация | 1. Установленное в examples/keycloak-config/main.tf с помощью скрипта sync.sh значение переменной окружения TF_VAR_YC_ORGANIZATION_ID. Как устанавливается эта переменная скриптом env-yc.sh подробнее в соответствующем разделе2. Если переменная не установлена (например скрипт env-yc.sh запускался в другом shell), можно указать ID организации вручную в examples/keycloak-config/main.tf или запустить source ../env-yc.sh |
fed_name |
null | string |
Имя федерации yandex_organizationmanager_saml_federation.kc_fed. |
1. kc указанное в examples/keycloak-config/main.tf |
| Keycloak variables | ||||
kc_fqdn |
null | string |
FQDN развернутого Keycloak | 1. Установленное в examples/keycloak-config/main.tf с помощью скрипта sync.sh значение output kc_fqdn модуля keycloak-deploy |
kc_port |
null | string |
Порт развернутого Keycloak | 1. Перенесенное в examples/keycloak-config/main.tf с помощью скрипта sync.sh значение переменной из модуля keycloak-deploy |
kc_adm_user |
null | string |
Имя пользователя администратора Keycloak | 1. Перенесенное в examples/keycloak-config/main.tf с помощью скрипта sync.sh значение переменной из модуля keycloak-deploy |
kc_adm_pass |
null | string |
Пароль администратора Keycloak | 1. Перенесенное в examples/keycloak-config/main.tf с помощью скрипта sync.sh значение переменной из модуля keycloak-deploy |
kc_realm_name |
null | string |
Имя realm'а keycloak_realm.realm, отображается в URL страницы входа. |
1. My Keycloak Realm указанное в examples/keycloak-config/main.tf |
kc_realm_descr |
null | string |
Описание realm'а keycloak_realm.realm, отображается на страннице входа. |
1. kc указанное в examples/keycloak-config/main.tf |
| Users configuration | ||||
users |
null | object({ templates = optional(map(object({ first_name = optional(string) last_name = optional(string) email_domain = optional(string) phone = optional(string) full_name = optional(string) password = optional(string) photo_path = optional(string) temporary_password = optional(bool) enabled = optional(bool) }))) users = map(object({ template = optional(string) first_name = optional(string) last_name = optional(string) email_domain = optional(string) phone = optional(string) full_name = optional(string) password = optional(string) photo_path = optional(string) temporary_password = optional(bool) enabled = optional(bool) }))}) |
Конфигурация, по которой будут созданы пользователи Keycloak. Подробности схемы описаны в этом разделе. | 1. JSON-файл users.json, в котором определены два пользователя user1 и user2: {"users": {"user1":{}, "user2":{}}}; пароли пользователей, для которых они не указаны явно, будут сгенерированы ресурсом random_password.user_password; подробнее в разделе конфигурации пользователей. |