Другой пользователь AWS (ошибочно) может получить доступ к секретному значению My AWS SecretsManager, зашифрованному с помощью My AWS KMS CMK

Я использую свой AWS KMS CMK для шифрования и AWS SecretsManager Secret, но мой коллега может видеть секретное значение !!

  • Моя политика в отношении моего KMS CMK гласит, что только я могу делать kms:Decrypt.
  • My coworker (who does not have those permissions on my CMK), is able to...
    • Open the AWS Console to SecretsManager >>>
    • Нажмите Retrieve Secret Value ›››
    • И посмотрите мою секретную ценность!

Есть идеи, почему?

Технические подробности:

Я использую AWS SAM CLI для развертывания этого.

Вот мой шаблон AWS SAM:

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

Моя текущая отладка:

  • Я искал serverfault.com и практически не получил результатов. Я искал переполнение стека и нашел только одно сообщение, которое, похоже, связано, но проблема не сформулирована, и решение не в том, что происходит в моем случае: AWS KMS CMK для шифрования и дешифрования с помощью симметричного и асимметричного

  • Я использую симметричный CMK, потому что он требует SecretsManager. (SecretsManager не позволяет использовать асимметричные CMK для шифрования секретных значений).

  • Я подтвердил, что нажатие кнопки Retrieve Secret Value в консоли AWS SecretsManager действительно выполняет вызов API с secretsmanager:GetSecretValue.

  • AWS говорит, что secretsmanager:GetSecretValue должен работать только в том случае, если вызывающий также имеет kms:Decrypt на CMK, который использовался для шифрования секрета (что имеет смысл). (См. https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)

  • Я подтвердил, что моя симметричная KMS CMK действительно используется для шифрования секрета.

  • Мой коллега НЕ вошел в AWS с учетной записью root. Он вошел в систему под своей учетной записью. У него есть множество разрешений, потому что он администратор, но я не вижу причин, почему это должно позволить ему использовать мой CMK.

  • Если вам интересно, почему у моего коллеги есть действия KMS для ключевых администраторов, то это потому, что он наш системный администратор.

  • Политика моего KMS CMK была автоматически сгенерирована хорошим мастером, который вы выполняете в Консоли AWS при создании 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"
                }
            }
        }
    ]
}

person mountHouli    schedule 13.05.2021    source источник
comment
Вы говорите, что он админ. Возможно ли, что у вашего коллеги есть * разрешения на все службы? Например, могут ли они получить доступ к другим ключам KMS? Если да, то у них есть другая политика, которая предоставляет им разрешения KMS. Возможно, вам потребуется добавить Deny раздел в KMS CMK, чтобы другие люди не могли его использовать.   -  person John Rotenstein    schedule 14.05.2021
comment
Похоже, это была проблема! Спасибо, @JohnRotenstein! Основываясь на вашем предложении, я опубликовал ответ ниже.   -  person mountHouli    schedule 14.05.2021


Ответы (1)


Большое спасибо @JohnRotenstein за то, что указал мне в правильном направлении, своим ответом на мой вопрос выше!

Предпосылки решения 1

Как спросил Джон, когда я сказал выше, что мой коллега является администратором нашей учетной записи, я имею в виду, что его учетная запись пользователя IAM имеет AWS Managed Policy Administrator Access, которая дает полный доступ (насколько мне известно) ко всему или почти ко всему. в AWS (включая KMS !!).

Предпосылки решения 2

Действительно, в моем вопросе выше моя ключевая политика (которая является ключевой политикой по умолчанию) включает следующее утверждение:

{
    "Sid": "Enable IAM User Permissions",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::REDACTED:root"
    },
    "Action": "kms:*",
    "Resource": "*"
},

И согласно комментариям @JohnRotenstein и в этих документах AWS, это заявление политики позволяет политикам IAM получать доступ к этому ключу и использовать его, если в этих политиках указаны правильные разрешения.

Таким образом (насколько я могу судить) это позволило бы большому количеству людей (любому, кто может редактировать политики IAM в учетной записи моей компании) возможность дать себе политику, которая позволяет им делать все, что они хотят, с моим ключом KMS! (что небезопасно!)

Мне нужно подавить это. (решение ниже!)

Предпосылки решения 3

В ключевой политике KMS по умолчанию (которую я опубликовал в своем вопросе выше) вы увидите, что ключевые администраторы могут kms:Put*. Позволяет им kms:PutKeyPolicy, что позволит им изменить политику, чтобы дать себе (или кому-либо) kms:Decrypt, что позволит им расшифровать мой секрет Менеджера секретов и получить секретное значение!

Мне тоже нужно обуздать это ...

Решение

Ключевая политика ниже:

  • Гарантирует, что только моя функция Lambda может (через оператор политики, который я передаю роли IAM, которая выполняет функцию Lambda) использовать политику IAM для использования этого ключа, и они могут только делать kms:Decrypt

  • Позволяет только ключевому пользователю (мне) выполнять операции шифрования и дешифрования (за исключением, конечно, лямбда-функции; см. Выше)

  • Хотя ключевые администраторы не могут использовать мой ключ для шифрования или дешифрования вещей (или kms:PutKeyPolicy), они могут выполнять все административные задачи, такие как удаление ключа KMS или его прав.

{
  "Id": "mount-houlis-secure-kms-key-policy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": THE_ARN_OF_THE_IAM_USER_WHO_OWNS_THE_SECRET____WHICH_IS_ME
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:GetKeyPolicy",
        "kms:PutKeyPolicy"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Admins",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          ARNS_OF_VARIOUS,
          KEY_ADMINISTRATORS,
          AND_ME
        ]
      },
      "Action": [
        "kms:CancelKeyDeletion",
        "kms:CreateAlias",
        "kms:DeleteAlias",
        "kms:DescribeKey",
        "kms:DisableKey",
        "kms:DisableKeyRotation",
        "kms:EnableKey",
        "kms:EnableKeyRotation",
        "kms:GetKeyPolicy",
        "kms:GetKeyRotationStatus",
        "kms:ListGrants",
        "kms:ListKeyPolicies",
        "kms:ListResourceTags",
        "kms:ListRetirableGrants",
        "kms:RetireGrant",
        "kms:RevokeGrant",
        "kms:ScheduleKeyDeletion",
        "kms:TagResource",
        "kms:UntagResource",
        "kms:UpdateAlias",
        "kms:UpdateKeyDescription"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow Lambda function to do Action secretsmanager:GetSecretValue",
      "Effect": "Allow",
      "Principal": {
        "AWS": ARN_OF_THE_ROLE_THAT_YOUR_LAMBDA_FUNCTION_EXECUTES_AS____SHOULD_BE_arn:aws:iam::ACCOUNT_NUMBER:role/your-lambda-function-role-name
      },
      "Action": "kms:Decrypt",
      "Resource": "*"
    }
  ]
}
person mountHouli    schedule 14.05.2021