如何在单个 EC2 实例上管理多个 IAM 用户?
How to manage multiple IAM users on a single EC2 instance?
对于不同的AWS服务,我需要不同的IAM用户来保护访问控制。有时,我什至需要在 EC2 实例的单个项目中使用不同的 IAM 用户凭证。管理此问题的正确方法是什么?我如何 deploy/attach 将这些 IAM 用户凭据发送到单个 EC2 实例?
向 Amazon EC2 实例上的应用程序 运行 提供凭据的正常方法是为实例分配一个 IAM 角色。然后通过实例元数据提供与角色关联的临时凭证。 AWS 开发工具包将自动使用这些凭证。
但是,这仅适用于一组凭据。如果您希望使用 多个凭据 ,您需要在 凭据文件 .
中提供这些凭据
AWS 凭证文件可以包含多个配置文件,例如:
[default]
aws_access_key_id = AKIAaaaaa
aws_secret_access_key = abcdefg
[user2]
aws_access_key_id = AKIAbbbb
aws_secret_access_key = xyzzzy
为方便起见,也可以通过 AWS CLI 进行配置:
$ aws configure --profile user2
AWS Access Key ID [None]: AKIAbbbb
AWS Secret Access Key [None]: xyzzy
Default region name [None]: us-east-1
Default output format [None]: text
可以通过环境变量设置要使用的配置文件:
- Linux:
export AWS_PROFILE="user2"
- Windows:
set AWS_PROFILE="user2"
或者,当通过 SDK 调用 AWS 服务时,只需指定要使用的配置文件。这是 Credentials — Boto 3 documentation 中 Python 的示例:
session = boto3.Session(profile_name='user2')
# Any clients created from this session will use credentials
# from the [user2] section of ~/.aws/credentials.
dev_s3_client = session.client('s3')
其他语言的 SDK 中也有等效的功能。
虽然我完全同意接受的答案,即使用静态凭证是解决此问题的一种方法,但我想提出一些改进建议(并提议 Secrets Manager)。
作为实现凭证的完全隔离、使其动态且不存储在中心位置(上面提出的 Secrets Manager)的架构步骤,我建议的是在 AWS Elastic Container Service 上对应用程序和 运行 进行码头化(ECS)。这样您就可以将不同的 IAM 角色分配给不同的 ECS 任务。
优于 Secrets Manager 解决方案
- 完全避免有人在 Secrets Manager 中篡改凭据的用例,因为凭据具有动态性质(临时的,并通过 SDK 自动假定)
- 凭据在 AWS 端为您管理
- 只有 ECS 服务可以担任此 IAM 角色,这意味着您不能让实际人员窃取凭据,也不能让开发人员使用此凭据从他的本地计算机连接到生产环境。
对于不同的AWS服务,我需要不同的IAM用户来保护访问控制。有时,我什至需要在 EC2 实例的单个项目中使用不同的 IAM 用户凭证。管理此问题的正确方法是什么?我如何 deploy/attach 将这些 IAM 用户凭据发送到单个 EC2 实例?
向 Amazon EC2 实例上的应用程序 运行 提供凭据的正常方法是为实例分配一个 IAM 角色。然后通过实例元数据提供与角色关联的临时凭证。 AWS 开发工具包将自动使用这些凭证。
但是,这仅适用于一组凭据。如果您希望使用 多个凭据 ,您需要在 凭据文件 .
中提供这些凭据AWS 凭证文件可以包含多个配置文件,例如:
[default]
aws_access_key_id = AKIAaaaaa
aws_secret_access_key = abcdefg
[user2]
aws_access_key_id = AKIAbbbb
aws_secret_access_key = xyzzzy
为方便起见,也可以通过 AWS CLI 进行配置:
$ aws configure --profile user2
AWS Access Key ID [None]: AKIAbbbb
AWS Secret Access Key [None]: xyzzy
Default region name [None]: us-east-1
Default output format [None]: text
可以通过环境变量设置要使用的配置文件:
- Linux:
export AWS_PROFILE="user2"
- Windows:
set AWS_PROFILE="user2"
或者,当通过 SDK 调用 AWS 服务时,只需指定要使用的配置文件。这是 Credentials — Boto 3 documentation 中 Python 的示例:
session = boto3.Session(profile_name='user2')
# Any clients created from this session will use credentials
# from the [user2] section of ~/.aws/credentials.
dev_s3_client = session.client('s3')
其他语言的 SDK 中也有等效的功能。
虽然我完全同意接受的答案,即使用静态凭证是解决此问题的一种方法,但我想提出一些改进建议(并提议 Secrets Manager)。
作为实现凭证的完全隔离、使其动态且不存储在中心位置(上面提出的 Secrets Manager)的架构步骤,我建议的是在 AWS Elastic Container Service 上对应用程序和 运行 进行码头化(ECS)。这样您就可以将不同的 IAM 角色分配给不同的 ECS 任务。
优于 Secrets Manager 解决方案 - 完全避免有人在 Secrets Manager 中篡改凭据的用例,因为凭据具有动态性质(临时的,并通过 SDK 自动假定)
- 凭据在 AWS 端为您管理
- 只有 ECS 服务可以担任此 IAM 角色,这意味着您不能让实际人员窃取凭据,也不能让开发人员使用此凭据从他的本地计算机连接到生产环境。