Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Latest commit

 

History

History

Развертывание и управление организацией и правами доступа через IaC terraform

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 соответствующего уровня

Схема и скриншот результата

iam_iac-IaC1 drawio

iam_iac-Multifolder VPC drilldown drawio

скрин

Инстуркция:

Пререквизиты:

  • Платежный аккаунт 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
  1. Настроить yc cli
  2. Создать руками первое облако cloud-org-admin
  3. Укажите в yc cli ваше первое облако
yc config set cloud-id <id облака>
  1. Создать в нем каталог org-admin (без default сети)
yc resource-manager folder create --name org-admin
  1. Создать руками sa sa-org-admin для управления tf в этом каталоге
yc iam service-account create --name sa-org-admin --folder-name org-admin
  1. Убедиться, что в сервисе Cloud DNS папки org-admin уже создана публичная DNS-зона с которой будем работать дальше. Имя этой зоны далее указывается в переменной DNS_ZONE_NAME
  2. Перейдите в папку ./module_keycloak . Запускаем kc-users-gen.sh - получаем файл со списком учетных записей пользователей федерации с автогенерированными паролями. Имя файла в переменной kc_user_file.
  3. Укажите переменные dns_zone_name, folder_id и kc_fqdn согласно вашим значениям в файле module_keycloak/variables.tf . Это необходимо для генерации сертификата.
  4. Запускаем kc-le-cert.sh - получаем Let's Encrypt сертификаты для нужного домена в виде пары .pem файлов. Имена файлов в переменных le_cert_pub_key и le_cert_priv_key соответственно из папки module_keycloak/variables.tf
  5. Вернитесь в исходную общую папку. Заполните файл terraform.tfvars !не забудьте поменять имя файла на terrafrom.tfvars
  6. Выдать права 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
  1. Создать ключ для sa-org-admin
yc iam key create --service-account-name sa-org-admin --output sa-key.json  
  1. Заполните terraform.tfvars своими значениями

  2. Запустить terrafrom init, terrafrom plan, terraform apply

  3. Ссылка в консоль UI в созданную федерацию и на idp keycloak будет в output

  4. Зайдите в облако security в каталог cloud_admin и создайте Audit Trails согласно инструкции с записью в S3 бакет используя сервисный аккаунт предсозданный . Используйте это решение для создания безопасного s3 бакета

  5. Не забудьте подключить s3 remote storage для terraform по инструкции. Также информация есть в вебинаре

  6. Также строго рекомендуется поместить tf конфиг в защищенный git репозиторий и управлять выкаткой изменений в state с помощью PR и согласования

  7. Передайте ответственному администратору за облако "web-app-project" его логин/пароль и ссылку на вход в федерацию из output вида "https://console.cloud.yandex.ru/federations/bpf3pc05joidt9it7l0m" . Ответственный администратор назначается в группе "web-admin-group-members" в файле org_level_groups_and_users.tf

Уровень облаков

  1. Войдите в UI консоль под ответственным администратором за облако "web-app-project" с помощью ссылки в output, например https://console.cloud.yandex.ru/federations/bpf3pc05joidt9it7l0m
  2. Настройте yc cli под федеративным пользователем, которого вам выдали согласно инстуркции
  3. Создайте новый каталог "network-folder" (уберите галочку создать сеть по умолчанию)
yc resource-manager folder create --name network-folder
  1. Создайте в нем сервисный аккаунт "sa-web-app-tf"
yc iam service-account create --name sa-web-app-tf --folder-name network-folder
  1. Выдайте ему права "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 
  1. В основном каталоге данного решения и раскомментируйте строки в файле org_level_grant_viewer.tf (начиная со строки номер 3). Затем запустите еще раз terrafrom plan, terraform apply. Этим вы предоставите сервисной учетной записи sa-web-app-tf роль organization-manager.viewer (необходимо для доступа к данным по группам).
  2. Скачайте репозиторий по аналогии с п. 0 организационного уровня выше. Перейдите в папку "/cloud-level-state"
  3. Создайте авторизованный ключ
yc iam key create --service-account-name sa-web-app-tf --output sa-key.json  
  1. Вернитесь в каталог /cloud-level-state. Заполните файл terraform.tfvars своими значениями
  2. Запустите terraform init, terraform plan, terrafrom apply
  3. Установите managed gitlab в каталоге network-folder и поместите туда terrafrom config и credentials от sa sa-web-app-tf