Skip to content

maqmm/yc-coivm-federation

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Развёртывание федерации удостоверений в 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

  1. Клонируйте репозиторий.

    git clone https://github.com/maqmm/yc-coivm-federation.git
  2. Создайте или убедитесь в корректности конфигурации профиля YC CLI, проверьте, что у аккаунта, используемого в профиле YC CLI есть необходимые роли; проверьте, что существуют ресурсы для быстрого запуска.

  3. Сразу после клонирования репозитория, для создания федерации выполните команду:

    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 при входе показано на схеме:

SAML

  1. Пользователь переходит по ссылке https://console.yandex.cloud/federations/<FED_ID>. Происходит несколько редиректов к auth.yandex.cloud. Генерируется SAMLRequest. В браузер возвращается редирект к SSO URL, указанный в федерации удостоверений.

  2. Браузер переходит по указанному location в редиректе. В URL query params подставлен SAMLRequest. IdP валидирует SAMLRequest и отправляет форму ввода аутентификационных данных в HTML странице.

  3. Пользователь заполняет форму. После нажатия кнопки отправляется POST запрос. IdP валидирует введенные данные. Если проверка прошла успешно, на стороне IdP генерируется SAMLResponse, подставляется в готовый POST запрос, который в свою очередь подставляется в HTML auto-submit форму, которая выполняется при загрузке HTML документа.

  4. Браузером загружается страница с формой и 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]
Loading
---
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]
Loading

Отличия от origin репозитория

  • Вместо Managed PostgreSQL кластера используется dev-file самого Keycloak.
  • Keycloak запускается в виде Docker контейнера на ВМ из образа Container Optimized Image.
  • Поддерживается переиспользование и определение уже выпущенного Let's Encrypt сертификата, что увеличивает скорость развертывания.

Порядок развёртывания

Настройка профиля YC CLI

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 убедитесь, что аутентификация через браузер пройдена, сделать это можно, выполнив любую команду.

Необходимые ресурсы

Обязательные ресурсы:

  • Публичная DNS зона

    Если такая зона единственная в каталоге, скрипт 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 указанный в используемом профиле.

Необязательные ресурсы, ускоряющие равзвертывание:

  • Сертификат LE

    Скрипт 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. Значения из этого шаблона будут использованы при создании такого пользователя, если конкретный параметр явно не указан в объекте самого пользователя. Это нужно для уменьшения объявления однотипных параметров.

Параметры пользователей

  1. В общем случае, при создании пользователя будет использовано значение параметра явно сконфигурированного в его объекте, например "password": "password456" для user2.
  2. Если для пользователя указан шаблон(template), то все значения для не указанных явно параметров будут взяты из шаблона с таким именем, например для user2 будет использовано "full_name": "Default User" из соответствующего шаблона(default).
  3. Если необходимый параметр не указан ни в объекте пользователя, ни в шаблоне, привязанном этому пользователю, то есть ультимативный шаблон "", его можно не указывать у пользователя, он проверяется для всех пользователей, например для user2 будет использовано "phone": "+70000000000" из шаблона "".
  4. В завершении проверок, если значения не было объявлено и найдено в предыдущих пунктах, устанавливается нулевое значение и этот параметр не используется у пользователя. Для некоторых параметров есть значения по умолчанию, подробнее в таблице ниже.
Параметр Описание Порядок исползования
first_name Имя.
Ограничение по длине: 64 символа.
1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как null
last_name Фамилия.
Ограничение по длине: 64 символа.
1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как null
email_domain Домен, который будет указан в итоговом email пользователя username@email_domain. 1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Используется FQDN Keycloak из переменной kc_fqdn
5. Устанавливается как null
phone Номер телефона.
Ограничение по длине: 64 символа.
1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как null
full_name Полное имя.
Ограничение по длине: 64 символа.
1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как null
password Пароль пользователя. Если пароль нигде в users.json не указан явно, будет использован сгенерированный. Подробнее про то, как узнать пароли пользователей ниже таблицы. 1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается сгенерированный в ресурсе random_password.user_password пароль
photo_path Путь к аватару пользователя.
Файл будет конвертирован в base64, его длина не должна превышать 204800 символов.
1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как null
temporary_password Флаг, является ли пароль временным. 1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как false
enabled Флаг, включен ли пользователь. 1. Указан у конкретного пользователя в users
2. Указан у конкретного, привязанного к пользователю, шаблона из templates
3. Указан у ультимативного шаблона "" из templates
4. Устанавливается как 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

Скрипт env-yc.sh, устанавливающий переменные окружения

Команда 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 сертификата
Шаги
  1. Использует для выполнения команд текущий профиль YC CLI. Подробнее про настройку профиля YC CLI.
  2. Устанавливает переменную YC_TOKEN командой yc iam create-token.
  3. Устанавливает переменную TF_VAR_YC_CLOUD_ID командой yc config get cloud-id.
  4. Устанавливает переменную TF_VAR_YC_FOLDER_ID командой yc config get folder-id.
  5. Устанавливает переменную TF_VAR_YC_ORGANIZATION_ID командой yc config get organization-id, но если organization-id не указана в используемом профиле получает ID организации используемого выше облака командой yc resource-manager cloud get.
  6. Устанавливает переменную TF_VAR_YC_ZONE_ID, если в указанном выше каталоге одна публичная зона.
  7. Ищет файлы main.tf, если в обоих файлах kc_adm_pass = "", генерирует и подставляет значения между кавычек. (нужно для безопасности при клонировании репозитория)
  8. Использует зону из следующих источников (отсортировано по уменьшению приоритета): сначала 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, записывая в неё id ISSUED сертификата, если такой существует в каталоге для полученного ранее в этом пункте FQDN: <kc_hostname>.<ZONE>.
  9. Выводит переменные, которые удалось установить с помощью echo.

Развертывание модуля keycloak-deploy

Находясь в директории examples/keycloak-deploy:

terraform apply -auto-approve

Команда запускает развертывание ресурсов с автоподтверждением. Ресурсы поднимаются в порядке, соответствующем графу зависимостей.

Переход в директорию examples/keycloak-config и инициализация

Изменение директории после директории examples/keycloak-deploy:

cd ../keycloak-config

Инициализация провайдеров модуля keycloak-config:

terraform init

Скрипт sync.sh, синхронизирующий переменные между модулями

bash ./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.

Скрипт wait_for_keycloak.sh, ожидающий поднятие Keycloak

bash ./wait_for_keycloak.sh
Шаги
  1. Получает FQDN и порт из файла main.tf.
  2. Проверят доступность Keycloak в цикле каждую секунду командой curl --head -k -fsS "https://${KC_FQDN}:${HTTPS_PORT}" 2>/dev/null |sed -n '3p'| grep -q "HTTP/[1-2].*[[:space:]]\(200\|302\)".
  3. Завершается успешно как только 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.

Модуль keycloak-deploy

Ресурсы модуля keycloak-deploy

Граф зависимостей ресурсов модуля. Полузакрашенные ресурсы не будут созданы, если есть и указаны уже существующие.

deploy

Ресурс Описание
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.<название_ресурса_из_первого_столбца>

Переменные модуля 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.tf
2. 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.tf
2. false как значение модуля по умолчанию
kc_zone_id ru-central1-d string Зона размещения ВМ 1. ru-central1-d указанное в examples/keycloak-deploy/main.tf
2. ru-central1-d как значение модуля по умолчанию
kc_hostname sso string Будет использовано для name и hostname ВМ, а также как субдомен. 1. fed указанное в examples/keycloak-deploy/main.tf
2. 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.tf
2. 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.tf
2. 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.tf
2. 8443 как значение модуля по умолчанию
kc_vm_sg_name kc-sg string Имя группы безопасности 1. kc-sg указанное в examples/keycloak-deploy/main.tf
2. kc-sg как значение модуля по умолчанию
DNS zone variables
dns_zone_id null string ID DNS зоны Для создания DNS зоны:
1. Значение из dns_zone_id
2. Имя из dns_zone_name
3. Если публичная DNS зона одна в каталоге, то используется она из переменной dns_zone_exist = var.YC_ZONE_ID при запуске скрипта env-yc.sh.
dns_zone_name null string Имя DNS зоны Для создания DNS зоны:
1. Значение из dns_zone_id
2. Имя из dns_zone_name
3. Если публичная DNS зона одна в каталоге, то используется она из переменной dns_zone_exist = var.YC_ZONE_ID при запуске скрипта env-yc.sh.
dns_zone_exist null string ID единственной в каталоге DNS зоны Для создания DNS зоны:
1. Значение из dns_zone_id
2. Имя из dns_zone_name
3. Если публичная 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 Описание сертификата, который будет создан -

Модуль keycloak-config

Ресурсы модуля keycloak-config

Граф зависимостей ресурсов модуля. Множественными элементами обозначены ресурсы, количество которых зависит от конфигурации пользователей.

config

Ресурс Описание
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.<название_ресурса_из_первого_столбца>

Переменные модуля keycloak-config

В столбце Порядок получения в примере указаны варианты получения этой переменной в examples/ при применении манифеста, от самого приоритетного к менее.

Переменная Дефолтное значение Тип Описание Порядок получения в примере
Input variables
labels null map(string) Пары ключ/значения меток для ресурсов 1. { tag = "keycloak-config" } указанное в examples/keycloak-config/main.tf
2. 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; подробнее в разделе конфигурации пользователей.

About

Развёртывание федерации удостоверений в Yandex Cloud на базе решения Keycloak c помощью Container Optimized Image

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • HCL 97.7%
  • Smarty 2.3%