Назад | Перейти на главную страницу

Совместное использование политики IAM в учетных записях организаций

При настройке моей организации в AWS я столкнулся с проблемой. Мы планируем использовать AWS Organizations для разделения разных отделов (разработчиков, операций, ИТ, проектов) на разные учетные записи AWS и AWS SSO для управления доступом между учетными записями. В некоторых отделах (Dev, Projects)

Я хочу, чтобы некоторые пользователи могли создавать собственных пользователей IAM (называемых «Пользователи функций») для использования для программного доступа. Эти пользователи функций не должны иметь права создавать пользователей самостоятельно или устанавливать какие-либо ключи доступа для обновления. Кроме того, эти пользователи (или их ключи доступа) должны быть действительны только в течение ограниченного времени. Идея состоит в том, что если сотрудник покидает компанию, созданная функция user остается действительной только в течение ограниченного времени (если не обнаруживается при деактивации пользователя-сотрудника).

Я планирую реализовать ограничение по времени, вызывая лямбда-функцию один раз в день, чтобы деактивировать ключи доступа всех пользователей функции, которые старше заданного времени.

Моя проблема в том, чтобы установить ограничение на права созданных пользователей. Я создал набор разрешений SSO (который сопоставлен с ролью в каждой учетной записи), к которому прикреплена управляемая AWS политика «IAMReadOnlyAccess». Кроме того, он имеет следующую встроенную политику:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "CreateUsersWithTag",
        "Effect": "Allow",
        "Action": [
            "iam:CreateUser",
            "iam:DeleteUserPolicy",
            "iam:AttachUserPolicy",
            "iam:DetachUserPolicy",
            "iam:PutUserPermissionsBoundary"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:RequestTag/Owner": "${aws:username}",
                "iam:PermissionsBoundary": "arn:aws:iam::12356789012:policy/FunctionUserBoundary"
            }
        }
    }
]
}

С помощью этой политики я пытаюсь заставить всех созданных пользователей иметь тег с пользователем, создавшим (для идентификации функциональных пользователей и разрешения этому пользователю обновлять ключи доступа). Я также пытаюсь навязать политику IAM этому вновь созданному пользователю, который denys любой доступ к IAM для пользователя функции.

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

Есть ли способ разрешить субсчетам доступ к IAM Policys другой учетной записи? Другой вариант - написать лямбда-функцию, которая запускается при создании учетной записи, которая создает политику FunctionUserBoundary в каждой новой учетной записи и изменяет iam:PermissionsBoundary ценность для arn:aws:iam::*:policy/FunctionUserBoundary но когда я изменю политику позже, у меня будут разные Версии политики в разных учетных записях.

Есть ли способ реализовать мой план или он в корне неверен?

Я использовал вариант Ответ MLu:

Я создал CloudFormation StackSet, который выполняет роль всех политик и настраиваемую лямбда-функцию, которая вызывается каждый раз, когда создается новая учетная запись для добавления ее в StackSet.

Вот что я сделал:

  1. Сначала создайте настраиваемую политику под названием OrganizationAdministrator со следующим политическим документом:

  {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "organizations:ListAccounts",
                "organizations:DescribeOrganization"
            ],
            "Resource": "*"
        }
    ]
  }

  1. Добавьте эту Политику в AWSCloudFormationStackSetAdministrationRole создавая его, если он не существует.

  2. Создайте новый набор StackSet CloudFormation со следующими свойствами:

    • AccountInitalization как имя
    • шаблон, содержащий все ваши профили
    • OrganizationAccountAccessRole как роль исполнения. Эта роль автоматически создается организациями при создании новой учетной записи.
    • AWSCloudFormationStackSetAdministrationRole как роль администратора
    • Добавьте все ваши существующие учетные записи
  3. Создать новую лямбда-функцию InitiateAccounts со следующим кодом:


require 'json'

def lambda_handler(event:, context:)
  require 'aws-sdk-organizations' 
  require 'aws-sdk-cloudformation' 

  #First get the accounts already in the stackset
  cloudformation = Aws::CloudFormation::Client.new(region: 'eu-central-1')
  resp = cloudformation.list_stack_instances({ stack_set_name: 'AccountInitalization',})
  stack_set_accounts = []
  resp[:summaries].each do |summary|
    stack_set_accounts << summary.account
  end

  #Iterate over existing accounts and collect accounts to add
  organizations = Aws::Organizations::Client.new(region: 'us-east-1')
  accounts = organizations.list_accounts({})
  orga = organizations.describe_organization({})
  add_accounts = []
  accounts[:accounts].each do |account|
    #First assume role in Account
    next if account.arn == orga[:organization].master_account_arn
    next if account.status == 'SUSPENDED'
    add_accounts << account.id if ! stack_set_accounts.include?(account.id)
  end

  if add_accounts.any? then
    cloudformation.create_stack_instances({
      stack_set_name: "AccountInitalization",
      accounts: add_accounts,
      regions: ['eu-central-1'],
    })
  end

  #return added accounts
  add_accounts
end


  1. Создать тему в соц.сетях OrganizationsCreateAccount с лямбда-функцией в качестве подписчика

  2. Создание правила события Cloudwatch OrganizationsCreateAccount с Темой SNS в качестве целей и следующим шаблоном событий:


{
  "source": [
    "aws.organizations"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "organizations.amazonaws.com"
    ],
    "eventName": [
      "CreateAccount"
    ]
  }
}

Я не думаю, что вы можете ссылаться на политику IAM в основной учетной записи из своих дочерних учетных записей. Вам нужно будет создать FunctionUserBoundary в каждой дочерней учетной записи.

Однако это следует делать с помощью некоторых инструменты автоматизации (например, CloudFormation, Ansible или некоторый CI / CD), и всякий раз, когда вы обновляете главный файл политики в центральном репозитории, он должен автоматически повторно развертываться / распространяться на все учетные записи вашей организации.

Надеюсь, это поможет :)