Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 您如何管理假定角色的IAM策略以访问AWS secret manager中的机密?_Amazon Web Services_Aws Secrets Manager - Fatal编程技术网

Amazon web services 您如何管理假定角色的IAM策略以访问AWS secret manager中的机密?

Amazon web services 您如何管理假定角色的IAM策略以访问AWS secret manager中的机密?,amazon-web-services,aws-secrets-manager,Amazon Web Services,Aws Secrets Manager,我开始将我们的秘密从AWS参数存储迁移到AWS秘密管理器,目前我面临一个我不知道如何解决的问题,有人能提供一些见解吗 我们有一个AWS帐户(我们称之为identity帐户),我们管理所有IAM用户和组。我们还有另一个AWS帐户,它托管我们的infra(我们称之为infra帐户)。我们希望管理identity帐户中的所有用户,并让用户承担infra帐户中的poweruser角色,以便我们可以在一个位置管理所有用户 在infra帐户中,我们运行RDS,我们希望为我们的开发人员创建DB用户,以便他们可

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

我们有一个AWS帐户(我们称之为identity帐户),我们管理所有IAM用户和组。我们还有另一个AWS帐户,它托管我们的infra(我们称之为infra帐户)。我们希望管理identity帐户中的所有用户,并让用户承担infra帐户中的
poweruser
角色,以便我们可以在一个位置管理所有用户

在infra帐户中,我们运行RDS,我们希望为我们的开发人员创建DB用户,以便他们可以登录数据库进行调试,但我们还希望审计他们所做的工作,以防有人对我们的数据库做了坏事,因此我们需要为每个开发人员创建一个DB用户。所有这些DB凭据都保存到AWS secret中,并使用如下命名约定

/dev/rds/mysql/users/foo
/dev/rds/mysql/users/bar
所以这里有一个问题:我如何管理用户的IAM策略来限制用户的权限,以便他们只能访问自己的秘密?因此,当用户使用假定角色访问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
,但它应该是这样的(假定用户
foo
在身份帐户中的用户名是
foo@emaildomain.com

另外,
role id
aroajhlp6keryi375pjy
在本例中)是随机的,前缀为
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/*"
]
这意味着,只要用户假定使用infra帐户,他们就可以访问其他开发人员的DB凭据

我已经查看了CloudWatch指标,看看是否可以设置一个过滤器来过滤掉用户
foo
正在调用
GetSecretValue
API以获取用户
bar
的凭据的API调用,但CloudWatch过滤器不支持用户REGEX从JSON中提取特定值。下面是CloudTrail日志中的
GetSecretValue
事件示例:

{
    "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
在用户试图获取其他人的凭据时触发警报,但我无法


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

从您的第一个示例开始,对于每个用户,您是否可以尝试在其用户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"
]
 ...
你会有同样的酒吧结构


如果您有许多用户,此解决方案将无法扩展。问题似乎是您正在为所有用户使用一个共同的假定角色。另一种方法是在每个机密上创建一个资源策略,该策略将访问权限授予身份帐户中的所有者用户。这将允许用户直接访问机密,而无需调用assumerole。这不会阻止他们继续担任infra account poweruser角色并访问机密,因此您必须从角色中删除机密管理器权限,或者在添加到机密的资源策略中明确拒绝infra power用户

这样设置跨帐户访问也意味着您不能使用默认的KMS加密密钥。您需要设置一个自定义KMS密钥,将密钥授予标识帐户,并使用该新密钥重新加密机密


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

你找到答案了吗?杜德,你是个聪明人
{
    "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"
}
 ...
    actions   = [
  "secretsmanager:DescribeSecret",
  "secretsmanager:GetSecretValue",
  "secretsmanager:PutSecretValue",
  "secretsmanager:UpdateSecretVersionStage"
]
resources = [
  "arn:aws:secretsmanager:us-east-1:12345678912:secret:/dev/rds/mysql/users/foo"
]
 ...