我想使用 AWS Identity and Access Management (IAM) 角色来限制 API 调用对 AWS 管理控制台的访问。
简短描述
在 IAM 策略的条件元素中使用 aws:SourceIp 全局条件键来限制来自特定 IP 地址的 API 调用。但是,此操作会拒绝对代您进行调用的 AWS 服务(例如 AWS CloudFormation)的访问,除非您同时使用 aws:ViaAWSService 全局条件。有关详细信息,请参阅 AWS: 根据源 IP 拒绝对 AWS 的访问。
例如,假设您有一个 AWS 服务角色,该角色允许 AWS CloudFormation 调用 Amazon Elastic Compute Cloud (Amazon EC2) 来停止实例。请求将被拒绝,因为目标服务 (Amazon EC2) 看到的是调用服务 (AWS CloudFormation) 的 IP 地址,而不是源用户的 IP 地址。您无法通过调用服务将源 IP 地址传递给目标服务以在 IAM 策略中进行评估。
解决方法
创建一个 IAM 角色,为其附加与附加到 IAM 用户的 IAM 策略相同的一组权限。只有当请求来自指定 IP 地址时,这才允许 IAM 用户代入角色 sts:AssumeRole API。这是因为用户尝试代入角色时会执行 aws:SourceIp 限制检查。当用户代入 IAM 角色时,他们将获得附加到该角色的 IAM 策略的权限。由于附加到该角色的 IAM 策略不使用 aws:SourceIp 条件键,因此允许对 AWS 服务的访问。
创建下面的 IAM 策略,然后将此策略附加到具有编程访问权限的 IAM 用户。该 IAM 策略允许 IAM 用户代入名为 Bob 的角色。Bob 不需要额外权限。当 IAM 用户成功代入 Bob 角色时,其将获得所有其他必需的权限。
注意:
- 如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
- 将 Bob 替换为您的 IAM 角色名称,将 EXAMPLEIAMACCOUNTID 替换为您的账户 ID。
IAM 用户策略示例
该示例策略具有对账户中资源执行 API 调用的权限。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
}
}
创建 IAM 角色 Bob 以向 IAM 用户委派权限。然后,按照创建 IAM 角色(控制台)中的说明进行操作。您也可以使用 AWS CLI 或 API。
注意:
IAM 角色信任策略示例
如果请求来自 IP 地址范围 103.15.250.0/24 或 12.148.72.0/23,则此示例信任策略允许用户代入角色。
**注意:**请将 YOURIAMUSERNAME 替换为您的 IAM 用户名。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
},
"Action": "sts:AssumeRole",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"103.15.250.0/24",
"12.148.72.0/23"
]
}
}
}
]
}
**注意:**此解决方法会中断 AWS CloudTrail 日志,因为操作是由用户代入的 IAM 角色执行的,而不是 IAM 用户。由 IAM 用户执行的 assumeRole API 调用将记录在 CloudTrail 日志中的 IAM 用户下。由 IAM 角色执行的任何其他 API 调用将记录在 CloudTrail 日志中的角色名称下。
相关信息
AWS 全局条件上下文键