【问题标题】:AWS KMS key cannot be used by ECS container because access is deniedECS 容器无法使用 AWS KMS 密钥,因为访问被拒绝
【发布时间】:2019-10-29 23:31:31
【问题描述】:

初始状态: 我想使用 ECS 容器内的 KMS 密钥解密值。为了做到这一点,TaskDefinition 具有 ExecutionRoleArn,它引用了以下角色 RoleECSTaskContainer。角色和 KMS 密钥的设置如下所示:

    KMSKeyEncryption:
        Type: AWS::KMS::Key
        Properties:
          Enabled: true
          EnableKeyRotation: false
          KeyPolicy:
            Version: 2012-10-17
            Statement:
              - Principal:           
                  AWS:arn of the users/roles who are allowed to manage this key
                Effect: Allow
                Action:
                  - kms:Create*
                  - kms:Describe*
                  - kms:Enable*
                  - kms:List*
                  - kms:Put*
                  - kms:Update*
                  - kms:Revoke*
                  - kms:Disable*
                  - kms:Get*
                  - kms:Delete*
                  - kms:ScheduleKeyDeletion
                  - kms:CancelKeyDeletion
                  - kms:Encrypt*
                  - kms:Decrypt*
                Resource: "*"
              - Principal:
                  AWS: ecs-tasks.amazonaws.com
                Effect: Allow
                Action:
                  - kms:Decrypt*
                Resource: "*"
      PolicyDecryptKms:
        Type: AWS::IAM::ManagedPolicy
        Properties:
          ManagedPolicyName: DecryptKmsPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Sid: AllowDecryptValues
                Effect: Allow
                Action:
                  - kms:Decrypt*
                Resource: !GetAtt KMSKeyEncryption.Arn
      RoleECSTaskContainer:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: 2008-10-17
            Statement:
              - Effect: Allow
                Principal:
                  Service: ecs-tasks.amazonaws.com
                Action: sts:AssumeRole
          RoleName: ECSTaskContainerRole
          ManagedPolicyArns:
            - !Ref PolicyDecryptKms

当容器尝试使用 KMS 密钥解密值时,会出现以下异常:

User: arn:aws:sts::123123123:assumed-role/ECSTaskContainerRole/bc9a5782-9sf8-312a-8z76-0ef29a6e5631 is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:eu-west-1:123123123:key/8c9h2f44-bjvb-4l2d-fkj11-fjdahjEr564182

经过一番调查,我发现如果我稍微更改一下密钥策略以允许所有主体像这样解密,它就会开始工作:

Principal: "*"
Effect: Allow
Action:
  - kms:Decrypt*
Resource: "*"

但这不是定义密钥策略的安全方法,因为我允许每个人使用此 KMS 密钥解密值。

我认为使用 ecs-tasks.amazonaws.com 作为委托人是错误的。这个对吗?如果是这样,在这种情况下我应该使用哪种服务?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-ecs aws-kms


    【解决方案1】:

    有两种方法可以控制对 KMS 密钥的访问:

    1. 通过使用密钥策略,您可以在单个策略中定义访问控制。
    2. 通过将 IAM 策略与密钥策略结合使用 - 通过这种方式控制访问,您可以在 IAM 中管理您的 IAM 身份的所有权限。

    您可以单独使用密钥策略来控制访问。但是,IAM 策略本身不足以允许访问 CMK。您必须授予 AWS 账户对 CMK 的完全访问权限才能启用 IAM 策略。

    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:root"},
      "Action": "kms:*",
      "Resource": "*"
    }
    

    因此,这取决于您希望如何管理您的政策。为了简单起见,我通常更喜欢 KMS 密钥策略。因此,我只需将密钥策略设置为授予角色 kms:decrypt 权限并删除托管 IAM 策略。

    KMSKeyEncryption:
      Type: AWS::KMS::Key
      Properties:
        KeyPolicy:
          Version: 2012-10-17
          Statement:
          ...
             - Principal:
                 AWS: !GetAtt RoleECSTaskContainer.Arn
               Effect: Allow
               Action:
                 - kms:Decrypt*
               Resource: "*"
    
    RoleECSTaskContainer:
      Type: AWS::IAM::Role
      Properties:
        AssumeRolePolicyDocument:
          Version: 2008-10-17
          Statement:
            - Effect: Allow
              Principal:
                Service: ecs-tasks.amazonaws.com
              Action: sts:AssumeRole
        RoleName: ECSTaskContainerRole
    

    【讨论】:

    • 那么请将他的答案标记为“正确”答案
    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 2022-07-07
    • 2020-03-31
    • 2019-04-21
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多