2

我开始将我们的秘密从 AWS 参数存储迁移到 AWS 秘密管理器,目前我面临一个我不知道如何解决的问题,谁能提供任何见解?

我们有一个 AWS 账户(我们称之为身份账户),我们管理所有 IAM 用户和组。我们还有另一个 AWS 账户托管我们的基础设施(我们称之为基础设施账户)。我们想管理身份帐户中的所有用户,并让用户承担poweruser基础设施帐户中的角色,以便我们可以在一个地方管理所有用户。

在 infra 帐户中,我们运行 RDS,我们想为我们的开发人员创建数据库用户,以便他们可以登录到数据库进行调试,但我们也想审核他们所做的事情,以防有人对我们的数据库做了坏事,所以我们需要为每个开发人员创建一个数据库用户。所有这些数据库凭证都使用命名约定保存到 AWS 机密中, /dev/rds/mysql/users/foo /dev/rds/mysql/users/bar 因此问题是:如何管理用户的 IAM 策略以限制用户的权限,以便他们只能访问自己的机密?当用户使用假定角色访问 AWS 时,我们无法从这个 AWS 文档中获得因此以下策略永远不会起作用aws:username

actions   = [
  "secretsmanager:DescribeSecret",
  "secretsmanager:GetSecretValue",
  "secretsmanager:PutSecretValue",
  "secretsmanager:UpdateSecretVersionStage"
]
resources = [
  "arn:aws:secretsmanager:us-east-1:12345678912:secret:/dev/rds/mysql/users/${aws:username}"
]

我可以用于假定角色的唯一 IAM 变量是,aws:userid但它会是这样的(假设 userfoo在身份帐户中的用户名是foo@emaildomain.com

"AROAJGHLP6KERYI375PJY:foo@emaildomain.com"

看起来role-id(AROAJGHLP6KERYI375PJY在这个例子中) 是随机的,带有前缀AROA,这意味着我也不能使用以下策略(而且,AROAJGHLP6KERYI375PJY:foo@emaildomain.com在秘密管理器中作为秘密名称非常难看)

actions   = [
  "secretsmanager:DescribeSecret",
  "secretsmanager:GetSecretValue",
  "secretsmanager:PutSecretValue",
  "secretsmanager:UpdateSecretVersionStage"
]
resources = [
  "arn:aws:secretsmanager:us-east-1:12345678912:secret:/dev/rds/mysql/users/${aws:userid}"
]

目前我的政策以这个结束

actions   = [
  "secretsmanager:DescribeSecret",
  "secretsmanager:GetSecretValue",
  "secretsmanager:PutSecretValue",
  "secretsmanager:UpdateSecretVersionStage"
]
resources = [
  "arn:aws:secretsmanager:us-east-1:12345678912:secret:/dev/rds/mysql/users/*"
]

这意味着只要用户假设使用基础设施帐户,他们也可以访问其他开发人员的数据库凭据。

我查看了 CloudWatch 指标,看看我是否可以设置一个过滤器来过滤掉用户foo调用GetSecretValueAPI 以获取用户bar凭据的 API 调用,但 CloudWatch 过滤器不支持用户 REGEX 从 JSON 中提取某些值。以下是GetSecretValueCloudTrail 日志中的事件示例:

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAJGHLP6KERYI375PJY:foo@emaildomain.com",
        "arn": "arn:aws:sts::12345678912:assumed-role/poweruser/foo@emaildomain.com",
        "accountId": "12345678912",
        "accessKeyId": "ASIATA5XIF7AFC2CQ7NO",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "true",
                "creationDate": "2018-07-11T21:31:20Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAJGHLP6KERYI375PJY",
                "arn": "arn:aws:iam::12345678912:role/poweruser",
                "accountId": "12345678912",
                "userName": "poweruser"
            }
        }
    },
    "eventTime": "2018-07-11T21:32:56Z",
    "eventSource": "secretsmanager.amazonaws.com",
    "eventName": "GetSecretValue",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "1.2.3.4",
    "userAgent": "aws-internal/3",
    "requestParameters": {
        "secretId": "/dev/rds/mysql/users/foo"
    },
    "responseElements": null,
    "requestID": "f98ad2c2-8551-11e8-8a3f-751b0a8a6ca5",
    "eventID": "73b8de89-bc8c-41a3-a172-58dd8d79a026",
    "eventType": "AwsApiCall",
    "recipientAccountId": "12345678912"
}

如果我可以从中提取foo@emaildomain.com{ $.userIdentity.principalId }提取foo{ $.requestParameters}然后我可以尝试一些魔法来比较foo@emaildomain.com == foo如果用户试图获取其他人的凭证来触发警报,但是,我不能......

那么,在这种情况下,我该如何管理我的策略来锁定用户的权限呢?

4

2 回答 2

0

问题似乎是您正在为所有用户使用一个共同的假定角色。对此的替代方法是在每个秘密上创建一个资源策略,该策略向身份帐户中的拥有用户授予访问权限。这将让用户直接访问机密而不调用假设角色。这不会阻止他们仍然承担 infra account poweruser 角色并访问机密,因此您必须从角色中删除 Secrets Manager 权限,或者在您添加到机密的资源策略中明确拒绝 infra power user。

像这样设置跨账户访问也意味着您不能使用默认的 KMS 加密密钥。您将需要设置一个自定义 KMS 密钥,该密钥授予身份帐户正确的访问权限,并使用该新密钥重新加密秘密。

由于无法在 Secrets Manager 控制台中设置资源策略和自定义 KMS 密钥,因此这一切都需要使用 CLI 或 SDK 之一。

于 2018-11-16T01:05:17.550 回答
0

从您的第一个示例中,对于每个用户,您可以尝试在他们的用户 iam 策略中硬编码密码吗?

所以对于用户 foo,用户策略看起来像

 ...
    actions   = [
  "secretsmanager:DescribeSecret",
  "secretsmanager:GetSecretValue",
  "secretsmanager:PutSecretValue",
  "secretsmanager:UpdateSecretVersionStage"
]
resources = [
  "arn:aws:secretsmanager:us-east-1:12345678912:secret:/dev/rds/mysql/users/foo"
]
 ...

您将具有相同的 bar 结构,...

如果您有很多用户,此解决方案将无法扩展

于 2018-08-25T09:07:02.463 回答