0

每天我都会看到一些未经授权的 KMS 解密操作的 CloudTrail 日志,但我无法弄清楚是什么原因造成的。以下是日志示例:

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "*********************:LambdaDescribeHandlerSession",
        "arn": "arn:aws:sts::************:assumed-role/AWSServiceRoleForConfig/LambdaDescribeHandlerSession",
        "accountId": "************",
        "accessKeyId": "********************",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": ""********************",
                "arn": "arn:aws:iam::************:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig",
                "accountId": "************",
                "userName": "AWSServiceRoleForConfig"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2021-11-28T12:53:33Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "config.amazonaws.com"
    },
    "eventTime": "2021-11-28T12:53:33Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "eu-west-1",
    "sourceIPAddress": "config.amazonaws.com",
    "userAgent": "config.amazonaws.com",
    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::************:assumed-role/AWSServiceRoleForConfig/LambdaDescribeHandlerSession is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:eu-west-1:************:key/********-****-****-****-************ because no resource-based policy allows the kms:Decrypt action",
    "requestParameters": null,
    "responseElements": null,
    "requestID": "7bb5bcac-29ab-4d03-b2b9-fc9d7125286e",
    "eventID": "5308c08c-2f09-4fbe-bd10-32e7aa9ee43c",
    "readOnly": true,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "************",
    "eventCategory": "Management"
}

我尝试使用以下内容更新 KMS 政策,但这似乎没有帮助:

        {
            "Sid": "Grant AWS Config Decrypt Access To Avoid Unauthorised Errors",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "kms:Decrypt",
            "Resource": "*"
        }

我检查了 IAM 角色arn:aws:iam::************:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig,我可以看到这不允许该kms:Decrypt操作。但是,这是 AWS 的托管角色,我无法更新该策略。

这是 AWS 需要解决的问题吗?是否可以将 Config 切换为使用kms:Decrypt允许操作的自定义角色?当 AWS 更新托管角色并且我没有向自定义角色添加任何内容时,这是否值得,或者它只会在未来引起更多问题?

4

2 回答 2

1

这可能有点棘手,因为 KMS 是如何工作的。首先,KMS 密钥策略对于控制对 KMS 密钥的访问至关重要:

https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html

“在 AWS KMS 中,您必须将基于资源的策略附加到您的 KMS 密钥。这些称为密钥策略。所有 KMS 密钥都有一个密钥策略......您必须使用密钥策略来控制对 KMS 密钥的访问。您可以单独使用密钥策略来控制访问,这意味着对 KMS 密钥的全部访问范围都定义在单个文档(密钥策略)中。”

因此,KMS 密钥策略必须存在并且必须允许对给定 IAM 角色的权限 - 而您确实通过kms:Decrypton实现了这一点*。然后,IAM 角色不必指定任何其他权限。因此,AWSServiceRoleForConfig没有任何权限应该不是问题。

根据https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html ,关键政策只是区域性的

每个 KMS 密钥都必须有一个密钥策略。此密钥策略仅控制对其关联的 KMS 密钥以及 IAM 策略和授权的访问。与全局性的 IAM 策略不同,关键策略是区域性的。每个密钥策略仅在托管 KMS 密钥的 Region 中有效。

因此,另一个区域的配置服务不应该具有访问权限 - 不确定是否是您的情况,因为我无法在您的 Cloudtrail 中看到所有 arn 的区域。

接下来是关于如何使用 KMS 密钥的常见误解。许多人认为您应该直接使用 KMS 密钥解密数据,但事实并非如此。主要用例是加密数据密钥,然后将其用于数据加密,例如https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys

这就是为什么加密数据的限制只有 4 KB - 这对于任何合理的数据密钥的加密应该没问题https://aws.amazon.com/kms/faqs/?nc1=h_ls

问:发送到 AWS KMS 以进行非对称操作的数据大小限制是多少?大小限制为 4KB。如果您想对大于 4KB 的数据进行数字签名,您可以选择创建数据的消息摘要并将其发送到 AWS KMS。数字签名在数据摘要上创建并返回。您指定是发送完整消息还是消息摘要作为签名 API 请求中的参数。提交给需要使用非对称操作的加密、解密或重新加密 API 的任何数据也必须小于 4KB。

这意味着,为了使密钥有用,策略通常需要允许的不仅仅是kms:Decrypt操作。对于所有 AWS 服务,所需的权限都在文档中,对于配置,它似乎是以下 KMS 资源策略:

https://docs.aws.amazon.com/config/latest/developerguide/s3-kms-key-policy.html 使用服务相关角色时 KMS 密钥所需的权限(S3 存储桶交付)

如果您使用服务相关角色设置 AWS Config,则需要将以下权限策略附加到 KMS 密钥。

    {
    "Id": "Policy_ID",
    "Statement": [
        {
            "Sid": "AWSConfigKMSPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "myKMSKeyARN",
            "Condition": { 
                "StringEquals": {
                    "AWS:SourceAccount": "sourceAccountID"
                   }
               }
            }
        ]
    }

在我看来,该错误可能具有误导性,并且您的错误可能意味着该错误可能是kms:Decryptkms:GenerateDataKey实施引起的。让您尝试添加kms:GenerateDataKey您的 KMS 资源策略。

如果不是 - 请检查您是否在同一地区。如果服务在另一个区域,让您查找有关跨区域实现的文档。

于 2021-11-28T16:15:49.860 回答
1

您需要授予假定角色访问密钥的权限,而不仅仅是配置服务本身。通常,您的密钥策略将包含以下部分,您需要对其进行编辑,类似于以下策略片段:

    "Statement": [
    {
        "Sid": "Allow use of the key",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:sts::0123456789:assumed-role/AWSServiceRoleForConfig/LambdaDescribeHandlerSession",
                "arn:aws:iam::0123456789:root"
            ]
        },
        "Action": [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey"
      ],
        "Resource": "*"
    }

只需将您现有的 Principal:AWS 元素变成一个列表,然后添加 AWSServiceRoleForConfig 的条目以及您在该节中已有的其他条目。

于 2021-11-28T16:41:41.243 回答