При настройке моей организации в 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 этому вновь созданному пользователю, который deny
s любой доступ к IAM для пользователя функции.
Моя проблема - это ARN этой политики. Он находится в главной учетной записи организации. Поэтому пользователь не может ссылаться на него в суб-учетной записи при создании пользователя.
Есть ли способ разрешить субсчетам доступ к IAM Policys другой учетной записи? Другой вариант - написать лямбда-функцию, которая запускается при создании учетной записи, которая создает политику FunctionUserBoundary в каждой новой учетной записи и изменяет iam:PermissionsBoundary
ценность для arn:aws:iam::*:policy/FunctionUserBoundary
но когда я изменю политику позже, у меня будут разные Версии политики в разных учетных записях.
Есть ли способ реализовать мой план или он в корне неверен?
Я использовал вариант Ответ MLu:
Я создал CloudFormation StackSet, который выполняет роль всех политик и настраиваемую лямбда-функцию, которая вызывается каждый раз, когда создается новая учетная запись для добавления ее в StackSet.
Вот что я сделал:
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": "*"
}
]
}
Добавьте эту Политику в AWSCloudFormationStackSetAdministrationRole
создавая его, если он не существует.
Создайте новый набор StackSet CloudFormation со следующими свойствами:
AccountInitalization
как имяOrganizationAccountAccessRole
как роль исполнения. Эта роль автоматически создается организациями при создании новой учетной записи.AWSCloudFormationStackSetAdministrationRole
как роль администратораСоздать новую лямбда-функцию 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
Создать тему в соц.сетях OrganizationsCreateAccount
с лямбда-функцией в качестве подписчика
Создание правила события 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), и всякий раз, когда вы обновляете главный файл политики в центральном репозитории, он должен автоматически повторно развертываться / распространяться на все учетные записи вашей организации.
Надеюсь, это поможет :)