当前位置: 首页 > 知识库问答 >
问题:

其他AWS用户(不正确)能够访问我的AWS SecretsManager秘密值,该值用我的AWS KMS CMK加密

沈俊明
2023-03-14
  • 我的KMS CMK策略规定,只有我可以执行KMS:decrypt
  • 我的同事(在我的CMK上没有这些权限)可以...
    • 打开SecretsManager的AWS控制台>>>
    • 单击检索机密值>>>
    • 查看我的秘密值!

    知道为什么吗?

    技术细节:

    AWSTemplateFormatVersion: "2010-09-09"
    Transform: AWS::Serverless-2016-10-31
    
    Parameters:
      SecretValue:
        Type: String
      KmsCmkId: 
        Type: String
    
    Resources:
      MySecret:
        Type: AWS::SecretsManager::Secret
        Properties:
          SecretString:
            Ref: SecretValue
          KmsKeyId: !Ref KmsCmkId
    
    sam build ; sam deploy --guided --parameter-overrides SecretValue=ABC KmsCmkId=REDACTED
    

    我确认单击AWS SecretsManager控制台中的Retrieve Secret Value按钮确实执行了带有SecretsManager:getSecretValue的API调用。

    AWS说,SecretsManager:getSecretValue只有在调用方在用于加密秘密的CMK上也有kms:decrypt的情况下才会起作用(这是有道理的)。(请参阅https://docs.aws.amazon.com/secretsmanager/latest/apireference/api_getsecretvalue.html)

    我确认我的对称KMS CMK确实是被用来加密秘密的CMK。

    注意:注意不要将kms:get*操作与secretsmanager:get*操作混淆。

    以下是我的KMS CMK策略:

    {
        "Id": "key-consolepolicy-3",
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Enable IAM User Permissions",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::REDACTED:root"
                },
                "Action": "kms:*",
                "Resource": "*"
            },
            {
                "Sid": "Allow access for Key Administrators",
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::REDACTED:user/MY_COWORKER"
                    ]
                },
                "Action": [
                    "kms:Create*",
                    "kms:Describe*",
                    "kms:Enable*",
                    "kms:List*",
                    "kms:Put*",
                    "kms:Update*",
                    "kms:Revoke*",
                    "kms:Disable*",
                    "kms:Get*",
                    "kms:Delete*",
                    "kms:TagResource",
                    "kms:UntagResource",
                    "kms:ScheduleKeyDeletion",
                    "kms:CancelKeyDeletion"
                ],
                "Resource": "*"
            },
            {
                "Sid": "Allow use of the key",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::REDACTED:user/ME"
                },
                "Action": [
                    "kms:Encrypt",
                    "kms:Decrypt",
                    "kms:ReEncrypt*",
                    "kms:GenerateDataKey*",
                    "kms:DescribeKey"
                ],
                "Resource": "*"
            },
            {
                "Sid": "Allow attachment of persistent resources",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::REDACTED:user/ME"
                },
                "Action": [
                    "kms:CreateGrant",
                    "kms:ListGrants",
                    "kms:RevokeGrant"
                ],
                "Resource": "*",
                "Condition": {
                    "Bool": {
                        "kms:GrantIsForAWSResource": "true"
                    }
                }
            }
        ]
    }
    

共有1个答案

邓声
2023-03-14

非常感谢@JohnRotenstein,他给我指明了正确的方向,并回答了我的问题,如上图所示!

我刚发现下面的答案有问题。我正在调查和修复。我会更新我的答案在这里,当它是固定的。请忽略下面的答案,直到我修复它并删除此警告消息。

正如John所问的,当我在上面说我的同事在我们的帐户上“是管理员”时,我的意思是他的IAM用户帐户具有AWS托管策略管理员访问(据我所知),该策略给予AWS(包括KMS!!)中的所有内容或几乎所有内容的“完全访问”。

json prettyprint-override">{
    "Sid": "Deny use of the key (such as to encrypt and decrypt) for everyone",
    "Effect": "Deny",
    "Principal": "*",
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
},
 类似资料:
  • 我有一个使用Bosh部署的concourse环境。它配置有AWS机密管理器。管道机密模板的格式为 我在AWS秘密管理器(其他类型的秘密)中创建了一个秘密,其值如下。 我在团队中设置了一个总汇管道。

  • 如何在不使用Azure函数属性的情况下检索Azure函数中的“秘密值”? null 我有一个应用程序,它在Azure KeyVault中秘密地存储了密钥/值对。在存储数据时,我保留标识符以备以后检索: 存储该值的代码为:

  • 我想授予服务帐户访问Google Secrets Manager中的秘密的权限。 我可以像这样获得这个秘密: 但是当我的服务号尝试相同的命令时,gCloud会发出以下错误: 错误:(gcloud.beta.secrets.versions.access)权限被拒绝:请求的身份验证范围不足。 主要问题是:我还需要做些什么来确保服务帐户可以访问该机密? 我已授予该服务帐户“roles/secretma

  • 我试图编译代码时遇到了这个异常。我已经安装了eclips工具包,我正在使用EclipseKepler 异常线程"main"java.lang.NoClassDefFoundError: org/apache/共用/日志/LogFactory在com.amazonaws.Amazon WebServiceClient.(Amazon WebServiceClient.java:56)在test_to

  • 我有一个相当标准的应用程序写在Java它也运行查询对数据库。应用程序位于GCP上,数据库位于Atlas上。 出于可以理解的原因,我不想在代码中保留数据库的用户名和密码。 所以我想到的选项1是将用户名和密码作为环境变量传递给GCP中的应用程序容器。 选项2是在GCP中使用秘密管理器,并将我的用户名和密码存储在那里,并将GCP凭据作为环境变量传递给GCP中的应用程序容器。 我的问题是,如果2号选项有附

  • 我正在尝试使用运行python3(kivy)的独立应用程序检索AWS Secret(boto3-config)。 客户端使用boto3,使用硬编码的凭据可以正常工作。 我试图在boto3中使用获取文件夹。 我已创建了一个联合身份池,并为其分配了访问机密管理器的策略: 我也使用通用Cognito角色做了同样的事情。(知道这不是问题所在,但我相信我们都在努力解决一些问题)。 给我错误的和它提供的那些我