Version:1.0
Задача: Полное управление организацией через terraform. На каждый проект должно выделяться одно облако с назначенной группой ответственных администраторов за облако. Должно быть отдельное облако security со своей ответственной группой админов. В каждом облаке отдельное управление через TF. Нарезаются dev, non-prod, prod каталоги с разными правами. Управление уровнем организации должно происходить в одном tf state через git, а управление уровнем облаков в своих собственных state также через git.
Summary:
- Существует организация
- В организации есть первый bootstrap владелец с правами "organization-manager.organizations.owner" (после bootstrap он не используется)
- Руками создается первое облако "cloud-org-admin"
- В облаке создается каталог и сервисный аккаунт с правами "organization-manager.admin" и "resource-manager.admin" на уровне организации.
- Далее под этим сервисным аккаунтом создается 1-ый org-level terrafrom state
- Создаются организационные сущности: saml федерация, группы для администраторов облаков, облака и биндинги групп
- В облаке "cloud-org-admin" также опционально создается IDP Keycloak и наполняется пользователями для входа через федерацию удостоверений
- В облаке security создается sa и audit trails для мониторинга всех событий иб уровня облака с организации
- Далее админы своих облаков создают собственные state terraform с конфигурацией их облаков
- Все управление tf происходит через git подход. Каждое изменение (PR) должны проверять ответственные за tf соответствующего уровня
Пререквизиты:
- Платежный аккаунт yandex cloud
- Созданная организация
- Если выбрана установка keycloaс то необходимо иметь публичную зону dns делегированнную в yandex cloud
Уровень организации 0) Скачайте репозиторий и перейдите в папку
git clone https://github.com/yandex-cloud/yc-solution-library-for-security.git
cd yc-solution-library-for-security/auth_and_access/org_iac_iam
- Настроить yc cli
- Создать руками первое облако cloud-org-admin
- Укажите в yc cli ваше первое облако
yc config set cloud-id <id облака>
- Создать в нем каталог org-admin (без default сети)
yc resource-manager folder create --name org-admin
- Создать руками sa sa-org-admin для управления tf в этом каталоге
yc iam service-account create --name sa-org-admin --folder-name org-admin
- Убедиться, что в сервисе Cloud DNS папки org-admin уже создана публичная DNS-зона с которой будем работать дальше. Имя этой зоны далее указывается в переменной DNS_ZONE_NAME
- Перейдите в папку ./module_keycloak . Запускаем kc-users-gen.sh - получаем файл со списком учетных записей пользователей федерации с автогенерированными паролями. Имя файла в переменной kc_user_file.
- Укажите переменные dns_zone_name, folder_id и kc_fqdn согласно вашим значениям в файле module_keycloak/variables.tf . Это необходимо для генерации сертификата.
- Запускаем kc-le-cert.sh - получаем Let's Encrypt сертификаты для нужного домена в виде пары .pem файлов. Имена файлов в переменных le_cert_pub_key и le_cert_priv_key соответственно из папки module_keycloak/variables.tf
- Вернитесь в исходную общую папку. Заполните файл terraform.tfvars !не забудьте поменять имя файла на terrafrom.tfvars
- Выдать права sa на оргу через cli (пока не поддержана возможность выдачи через UI)
yc organization-manager organization add-access-binding \
--role organization-manager.admin \
--id bpf4c0lctf2t734l95ui \
--service-account-name sa-org-admin
yc organization-manager organization add-access-binding \
--role resource-manager.admin \
--id bpf4c0lctf2t734l95ui \
--service-account-name sa-org-admin
yc organization-manager organization add-access-binding \
--role viewer \
--id bpf4c0lctf2t734l95ui \
--service-account-name sa-org-admin
- Создать ключ для sa-org-admin
yc iam key create --service-account-name sa-org-admin --output sa-key.json
-
Заполните terraform.tfvars своими значениями
-
Запустить terrafrom init, terrafrom plan, terraform apply
-
Ссылка в консоль UI в созданную федерацию и на idp keycloak будет в output
-
Зайдите в облако security в каталог cloud_admin и создайте Audit Trails согласно инструкции с записью в S3 бакет используя сервисный аккаунт предсозданный . Используйте это решение для создания безопасного s3 бакета
-
Не забудьте подключить s3 remote storage для terraform по инструкции. Также информация есть в вебинаре
-
Также строго рекомендуется поместить tf конфиг в защищенный git репозиторий и управлять выкаткой изменений в state с помощью PR и согласования
-
Передайте ответственному администратору за облако "web-app-project" его логин/пароль и ссылку на вход в федерацию из output вида "https://console.cloud.yandex.ru/federations/bpf3pc05joidt9it7l0m" . Ответственный администратор назначается в группе "web-admin-group-members" в файле org_level_groups_and_users.tf
Уровень облаков
- Войдите в UI консоль под ответственным администратором за облако "web-app-project" с помощью ссылки в output, например https://console.cloud.yandex.ru/federations/bpf3pc05joidt9it7l0m
- Настройте yc cli под федеративным пользователем, которого вам выдали согласно инстуркции
- Создайте новый каталог "network-folder" (уберите галочку создать сеть по умолчанию)
yc resource-manager folder create --name network-folder
- Создайте в нем сервисный аккаунт "sa-web-app-tf"
yc iam service-account create --name sa-web-app-tf --folder-name network-folder
- Выдайте ему права "resource-manager.admin" и "viewer" именно на облако web-app-project, а не на каталог
yc resource-manager cloud add-access-binding \
--role resource-manager.admin \
--id <ваш cloud id> \
--service-account-name sa-web-app-tf
yc resource-manager cloud add-access-binding \
--role viewer \
--id <ваш cloud id> \
--service-account-name sa-web-app-tf
- В основном каталоге данного решения и раскомментируйте строки в файле org_level_grant_viewer.tf (начиная со строки номер 3). Затем запустите еще раз terrafrom plan, terraform apply. Этим вы предоставите сервисной учетной записи sa-web-app-tf роль organization-manager.viewer (необходимо для доступа к данным по группам).
- Скачайте репозиторий по аналогии с п. 0 организационного уровня выше. Перейдите в папку "/cloud-level-state"
- Создайте авторизованный ключ
yc iam key create --service-account-name sa-web-app-tf --output sa-key.json
- Вернитесь в каталог /cloud-level-state. Заполните файл terraform.tfvars своими значениями
- Запустите terraform init, terraform plan, terrafrom apply
- Установите managed gitlab в каталоге network-folder и поместите туда terrafrom config и credentials от sa sa-web-app-tf