尽管有政策,胶水作业跨账户秘密访问失败
Glue Job Cross-Account secret access failing despite policies
注意:我查看了其他问题并认为这是独一无二的,因为它特别涉及使用粘合作业的跨帐户机密访问。
我遇到一个问题,即在一个帐户中担任服务角色的粘合工作无法访问存储在另一个帐户中的秘密,尽管我认为我的政策应该允许它这样做。
我看到的错误(带有编辑值):An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed. This version of secret is not encrypted with the current KMS key.
问题
以下设置导致权限失败怎么办?
现状图
我对需要做什么的理解
基于the AWS docs and a 2018 blog post,我认为我们要做的是:
- 添加机密策略以允许访问服务角色
- 在 CMK 上添加策略以允许服务角色解密
- 添加服务角色策略以允许访问机密
- 添加服务角色策略以允许 CMK 解密
现行政策
保密政策
{
"Version" : "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Principal" : {
"AWS" : "arn:aws:iam::GLUE_ACCOUNT:role/GLUE_SERVICE_ROLE"
},
"Action" : "secretsmanager:GetSecretValue",
"Resource" : "*",
"Condition" : {
"ForAnyValue:StringEquals" : {
"secretsmanager:VersionStage" : "AWSCURRENT"
}
}
} ]
}
关于 CMK 的政策
请注意,下面经过编辑的 SECRET_NAME
包含 AWS 在 ARN 中附加的几个字符,我们似乎需要包含这些字符。
{
"Sid": "AllowUseOfTheKey",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GLUE_ACCOUNT:role/GLUE_SERVICE_ROLE"
},
"Action": ["kms:Decrypt","kms:DescribeKey"],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.us-east-1.amazonaws.com"
},
"StringLike": {
"kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:SECRET_ACCOUNT:secret:SECRET_NAME"
}
}
}
附加到 Glue 帐户中的 Glue 服务角色的政策声明
{
"Sid": "AllowGetSecretValue",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:SECRET_ACCOUNT:secret:SECRET_NAME"
]
},
{
"Sid": "AllowKMSDecrypt",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:SECRET_ACCOUNT:key/CMK_KEY_ID"
]
},
服务角色的信任策略
只是为了确认胶水作业似乎确实有权承担服务角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
可能的后续步骤
作为思想实验,我正在考虑进行以下操作,看看它是否有效:
- 正在删除保密政策中的条件
- 正在删除 CMK 策略中的条件
- 也将
kms:DescribeKey
添加到服务帐户策略中,但我认为这不会解决问题。
由于这些相关问题有时会发生,尽管我尽了最大努力,但在我提供的信息之外找到了回答问题的信息。
解决方案有两个:
- 原始问题中的授权错误根本不是由于身份验证访问造成的。这是因为使用 boto3 的代码指定了密钥的名称而不是完整的 ARN。当然,机密管理员不会神奇地知道机密在不同的帐户中。
- 在这种情况下,令人惊讶的是 AWS 抛出了一个未经授权的异常,而不是一个未找到的异常,这对我们的工作会更有用。
- 修复该问题后,我们看到了票证中当前存在的错误,与加密 CMK 相关。显然,当我们更改 CMK 时,我们没有 select 使用该 CMK 自动创建新版本的密钥。授权用户对密钥进行简单编辑和保存就足以使用所选 CMK 对其重新加密并解决问题。
注意:我查看了其他问题并认为这是独一无二的,因为它特别涉及使用粘合作业的跨帐户机密访问。
我遇到一个问题,即在一个帐户中担任服务角色的粘合工作无法访问存储在另一个帐户中的秘密,尽管我认为我的政策应该允许它这样做。
我看到的错误(带有编辑值):An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed. This version of secret is not encrypted with the current KMS key.
问题
以下设置导致权限失败怎么办?
现状图
我对需要做什么的理解
基于the AWS docs and a 2018 blog post,我认为我们要做的是:
- 添加机密策略以允许访问服务角色
- 在 CMK 上添加策略以允许服务角色解密
- 添加服务角色策略以允许访问机密
- 添加服务角色策略以允许 CMK 解密
现行政策
保密政策
{
"Version" : "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Principal" : {
"AWS" : "arn:aws:iam::GLUE_ACCOUNT:role/GLUE_SERVICE_ROLE"
},
"Action" : "secretsmanager:GetSecretValue",
"Resource" : "*",
"Condition" : {
"ForAnyValue:StringEquals" : {
"secretsmanager:VersionStage" : "AWSCURRENT"
}
}
} ]
}
关于 CMK 的政策
请注意,下面经过编辑的 SECRET_NAME
包含 AWS 在 ARN 中附加的几个字符,我们似乎需要包含这些字符。
{
"Sid": "AllowUseOfTheKey",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::GLUE_ACCOUNT:role/GLUE_SERVICE_ROLE"
},
"Action": ["kms:Decrypt","kms:DescribeKey"],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.us-east-1.amazonaws.com"
},
"StringLike": {
"kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:SECRET_ACCOUNT:secret:SECRET_NAME"
}
}
}
附加到 Glue 帐户中的 Glue 服务角色的政策声明
{
"Sid": "AllowGetSecretValue",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:SECRET_ACCOUNT:secret:SECRET_NAME"
]
},
{
"Sid": "AllowKMSDecrypt",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:SECRET_ACCOUNT:key/CMK_KEY_ID"
]
},
服务角色的信任策略
只是为了确认胶水作业似乎确实有权承担服务角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
可能的后续步骤
作为思想实验,我正在考虑进行以下操作,看看它是否有效:
- 正在删除保密政策中的条件
- 正在删除 CMK 策略中的条件
- 也将
kms:DescribeKey
添加到服务帐户策略中,但我认为这不会解决问题。
由于这些相关问题有时会发生,尽管我尽了最大努力,但在我提供的信息之外找到了回答问题的信息。
解决方案有两个:
- 原始问题中的授权错误根本不是由于身份验证访问造成的。这是因为使用 boto3 的代码指定了密钥的名称而不是完整的 ARN。当然,机密管理员不会神奇地知道机密在不同的帐户中。
- 在这种情况下,令人惊讶的是 AWS 抛出了一个未经授权的异常,而不是一个未找到的异常,这对我们的工作会更有用。
- 修复该问题后,我们看到了票证中当前存在的错误,与加密 CMK 相关。显然,当我们更改 CMK 时,我们没有 select 使用该 CMK 自动创建新版本的密钥。授权用户对密钥进行简单编辑和保存就足以使用所选 CMK 对其重新加密并解决问题。