IDs在IAM策略中使用用户进行访问控制和自动化 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

IDs在IAM策略中使用用户进行访问控制和自动化

由 Srinivas Ananda Babu (AWS) 和 Ram Kandaswamy () 创作 AWS

摘要

这种模式解释了在 AWS Identity and Access Management (IAM) 中使用基于用户名的策略的潜在缺陷、使用用户的IDs好处以及如何将这种方法与 AWS CloudFormation 集成以实现自动化。

在中 AWS Cloud,该IAM服务可帮助您精确地管理用户身份和访问控制。但是,在创建IAM策略时依赖用户名可能会导致不可预见的安全风险和访问控制问题。例如,考虑以下场景:新员工 John Doe 加入您的团队,您使用该用户名创建一个IAM用户帐户j.doe,该用户名通过引用用户名的IAM策略向他们授予权限。当 John 离开公司时,该帐户将被删除。当新员工 Jane Doe 加入你的团队并重新创建j.doe用户名时,麻烦就开始了。现有策略现在授予 Jane Doe 与 John Doe 相同的权限。这会带来一场潜在的安全和合规性噩梦。

手动更新每项策略以反映新的用户详细信息是一个耗时且容易出错的过程,尤其是在组织成长过程中。解决方案是使用唯一且不可变的用户 ID。创建IAM用户账户时,会为用户 AWS 分配一个唯一的IAM用户 ID(或委托人 ID)。您可以在IAM策略IDs中使用这些用户来确保一致而可靠的访问控制,而不会受到用户名更改或重复使用的影响。

例如,使用用户 ID 的IAM策略可能如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example-bucket", "Principal": { "AWS": "arn:aws:iam::123456789012:user/abcdef01234567890" } } ] }

在IAM策略IDs中使用用户的好处包括:

  • 独一无二。用户IDs在所有方面都是独一无二的 AWS 账户,因此他们提供正确且一致的权限申请。

  • 不变性。用户IDs无法更改,因此它们为在策略中引用用户提供了稳定的标识符。

  • 审计与合规。 AWS 服务 通常IDs在日志和审计跟踪中包含用户,这样可以轻松地将操作追溯到特定用户。

  • 自动化和集成。IDs在 AWS APIsSDKs、或自动化脚本中使用用户可以确保流程不受用户名更改的影响。

  • 经得起未来考验。从一开始就IDs在策略中使用用户可以防止潜在的访问控制问题或大量的策略更新。

自动化

当您使用诸如之类的基础设施即代码 (IaC) 工具时 AWS CloudFormation,基于用户名的IAM策略的陷阱仍可能导致问题。当您调用Ref内部函数时,IAM用户资源会返回用户名。随着组织基础架构的发展,如果您重复使用用户名,则创建和删除资源(包括IAM用户帐户)的周期可能会导致意想不到的访问控制问题。

要解决此问题,我们建议您将用户加入您的 CloudFormation 模板IDs中。但是,为此目的IDs获取用户可能具有挑战性。这正是自定义资源可以提供帮助的地方。您可以使用 CloudFormation 自定义资源通过与 AWS APIs外部服务集成来扩展服务的功能。通过创建用于获取给IAM定用户的用户 ID 的自定义资源,您可以使该用户 ID 在 CloudFormation 模板中可用。这种方法简化了引用用户的流程,IDs并确保您的自动化工作流程保持稳健且面向未来。

先决条件和限制

先决条件

  • 活跃的 AWS 账户

  • 云管理员运行 AWS CloudFormation 模板的IAM角色

限制

架构

目标架构

下图显示了如何 AWS CloudFormation 使用支持的自定义资源 AWS Lambda 来检索IAM用户 ID。

使用 CloudFormation 自定义资源获取IAM用户 ID。

自动化和扩缩

您可以为不同的 AWS 区域 账户多次使用该 CloudFormation 模板。您只需在每个区域或账户中运行一次。

工具

AWS 服务

  • IAM— AWS Identity and Access Management (IAM) 是一项 Web 服务,可帮助您安全地控制对 AWS 资源的访问。您可以使用 IAM 控制对哪个用户进行身份验证 (登录) 和授权 (具有权限) 以使用资源。

  • AWS CloudFormation— AWS CloudFormation 帮助您对 AWS 资源进行建模和设置,这样您就可以花更少的时间管理这些资源,而将更多的时间集中在运行的应用程序上 AWS。您可以创建一个描述 AWS 所需资源的模板,并 CloudFormation 负责为您配置和配置这些资源。

  • AWS Lambda— AWS Lambda 是一项计算服务,无需预置或管理服务器即可支持运行代码。只有在需要时 Lambda 才运行您的代码,并且能自动扩缩,从每天几个请求扩展到每秒数千个请求。 

最佳实践

如果您是从头开始或计划新建部署,我们强烈建议您使用集中AWS IAM Identity Center式用户管理。 IAMIdentity Center 可与您现有的身份提供商(例如 Active Directory 或 Okta)集成 AWS,从而无需直接创建和管理IAM用户。这种方法不仅可以确保一致的访问控制,还可以简化用户生命周期管理,并有助于增强整个 AWS 环境的安全性和合规性。

操作说明

任务描述所需技能

验证您的 AWS 账户 和IAM角色。

确认您的IAM角色具有在中部署 CloudFormation 模板的权限 AWS 账户。

如果您计划在本过程的最后一步中使用 AWS CLI 而不是 CloudFormation 控制台来部署模板,则还应设置临时证书以运行 AWS CLI 命令。有关说明,请参阅IAM文档

云架构师
任务描述所需技能

创建 CloudFormation 模板。

  1. 按照 CloudFormation 文档中的说明创建 CloudFormation 模板。您可以使用JSON或YAML格式。此模式假设您使用的是YAML格式。

  2. 使用名称保存模板get_unique_user_id.yaml

AWS DevOps,云架构师

为用户名添加输入参数。

将以下代码添加到 CloudFormation 模板的Parameters部分:

Parameters: NewIamUserName: Type: String Description: Unique username for the new IAM user

此参数提示用户输入用户名。

AWS DevOps,云架构师

添加自定义资源以创建IAM用户。

将以下代码添加到 CloudFormation 模板的Resources部分:

Resources: rNewIamUser: Type: 'AWS::IAM::User' Properties: UserName: !Ref NewIamUserName

此代码添加了一个 CloudFormation 资源,该资源使用NewIamUserName参数提供的名称创建IAM用户。

AWS DevOps,云架构师

为 Lambda 函数添加执行角色。

在此步骤中,您将创建一个向 AWS Lambda 函数授予获取权限的IAM角色IAMUserId。指定 Lambda 运行所需的最低权限如下:

  • logs:CreateLogStream

  • logs:PutLogEvents

  • CreateLogGroup

  • iam:GetUser

  • 适用于 lambda.amazonaws.comAssumeRole

有关创建执行角色的说明,请参阅 Lambda 文档。您将在下一步创建 Lambda 函数时引用此角色。

AWS管理员、云架构师

添加 Lambda 函数以获得唯一值。IAM UserId

在此步骤中,您将使用 Python 运行时定义一个 Lambda 函数以获得唯一值。IAM UserId为此,请将以下代码添加到 CloudFormation 模板的Resources部分。<<ROLENAME>>替换为您在上一步中创建的执行角色的名称。

GetUserLambdaFunction: Type: 'AWS::Lambda::Function' Properties: Handler: index.handler Role: <<ROLENAME>> Timeout: 30 Runtime: python3.11 Code: ZipFile: | import cfnresponse, boto3 def handler(event, context): try: print(event) user = boto3.client('iam').get_user(UserName=event['ResourceProperties']['NewIamUserName'])['User'] cfnresponse.send(event, context, cfnresponse.SUCCESS, {'NewIamUserId': user['UserId'], 'NewIamUserPath': user['Path'], 'NewIamUserArn': user['Arn']}) except Exception as e: cfnresponse.send(event, context, cfnresponse.FAILED, {'NewIamUser': str(e)})
AWS DevOps,云架构师

添加自定义资源。

将以下代码添加到 CloudFormation 模板的Resources部分:

rCustomGetUniqueUserId: Type: 'Custom::rCustomGetUniqueUserIdWithLambda' Properties: ServiceToken: !GetAtt GetUserLambdaFunction.Arn NewIamUserName: !Ref NewIamUserName

此自定义资源调用 Lambda 函数来获取. IAM UserID

AWS DevOps,云架构师

定义 CloudFormation 输出。

将以下代码添加到 CloudFormation 模板的Outputs部分:

Outputs: NewIamUserId: Value: !GetAtt rCustomGetUniqueUserId.NewIamUserId

这将显示IAMUserID新IAM用户的。

AWS DevOps,云架构师

保存模板。

保存对 CloudFormation 模板所做的更改。

AWS DevOps,云架构师
任务描述所需技能

部署 CloudFormation 模板。

要使用 CloudFormation 控制台部署get_unique_user_id.yaml模板,请按照CloudFormation 文档中的说明进行操作。

或者,您可以运行以下 AWS CLI 命令来部署模板:

aws cloudformation create-stack \ --stack-name DemoNewUser \ --template-body file://get_unique_user_id.yaml \ --parameters ParameterKey=NewIamUserName,ParameterValue=demouser \ --capabilities CAPABILITY_NAMED_IAM
AWS DevOps,云架构师

相关资源