首页 > 解决方案 > 为 IAM 角色的操作定义两个语句

问题描述

是否可以在 IAM 角色中有两个语句用于同一操作?对于不同的操作,它可以正常工作,但是在为相同的操作创建新语句时它不起作用。

例子:

  IamDeploymentRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: "iam-deployment"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              AWS:
                - !Sub "arn:aws:iam::${ManagementAccountID}:root"
            Action:
              - "sts:AssumeRole"
            Condition:
              IpAddress:
                X
          - Effect: "Allow"
            Principal:
              Service:
                - "some service"
            Action:
              - "sts:AssumeRole"

我正在尝试这样做,但这就像声明中的第二项被忽略了。我不知道这个过滤器究竟是如何工作的。例如,当一个语句匹配动作但不匹配条件时,它会继续吗?还是在第一次知道没有它停止?

我尝试了很多文档,但找不到答案。

条件: https ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html

条件运算符: https ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN

条件键: https ://docs.aws.amazon.com/IAM/latest/UserGuide/list_awscloudformation.html#awscloudformation-aws_ResourceTag___TagKey_

全局条件键: https ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalarn

政策和权限:https ://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html

标签: amazon-web-servicesamazon-iam

解决方案


您似乎正在定义IAM 角色AssumeRolePolicyDocument信任策略

我通过使用信任 Amazon EC2 和 AWS Lambda 的信任策略创建 IAM 角色来测试这一点:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

然后,我为该角色分配了 Amazon S3 权限。

测试:

  • EC2:我尝试使用此角色启动 Amazon EC2 实例,但该角色未出现在下拉列表中
  • Lambda:我能够成功地将角色附加到 AWS Lambda 函数并访问 Amazon S3。

然后我交换了信任关系的顺序:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

没有任何影响— Lambda 运行良好,但 EC2 无法识别该角色。

然后我从信任关系中删除了 Lambda:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

这导致该角色从 Lambda 控制台中消失,而且奇怪的是,它也没有出现在 EC2 控制台中使用。

然后我创建了一个相同的角色(只有 EC2 作为受信任的实体),它运行良好

底线:当信任策略中有多个服务时,服务似乎会混淆。几乎就好像它“记住”了第一个服务而忽略了其他服务,即使修改了信任策略也是如此。因此,您似乎只能在信任策略中指定一项服务。


推荐阅读