Минимальные разрешения KMS для копирования моментального снимка базы данных

Я пытаюсь настроить минимальные разрешения для выполнения aws rds copy-db-snapshot с ключом шифрования KMS:

$ aws rds copy-db-snapshot --source-db-snapshot-identifier rds-backup-share-
mysql --target-db-snapshot-identifier rds-backup-share-mysql-reencrypted --kms-key-id <kms-arn>

(Все внутри <> удалено мной и содержит допустимые значения.)

К сожалению, я получаю эту ошибку:

An error occurred (KMSKeyNotAccessibleFault) when calling the CopyDBSnapshot operation: The target snapshot KMS key [<kms-arn>] does not exist, is not enabled or you do not have permissions to access it.

В настоящее время я разрешаю следующие действия:

  "Action": [
    "kms:ReEncrypt*",
    "kms:ListKeys",
    "kms:ListAliases",
    "kms:GenerateDataKey*",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:Decrypt"
  ],

Это работает, если я заменю его на kms:*{code}, так что это должно быть проблемой разрешения.

Я попытался выяснить правильные разрешения с помощью CloudTrail, но он просто содержит то же самое бесполезное сообщение об ошибке.

Итак, мои актуальные вопросы:

  • Каковы минимальные разрешения KMS для CopyDBSnapshot?
  • Есть ли общий способ выяснить необходимые разрешения? Всегда неприятно тратить свое время на гугление необходимых разрешений.

Изменить: это нижняя часть выходных данных журнала с включенным --debug:

2017-08-22 17:15:37,521 - MainThread - botocore.endpoint - DEBUG - Sending http request: <PreparedRequest [POST]>
2017-08-22 17:15:37,522 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): rds.eu-west-1.amazonaws.com
2017-08-22 17:15:37,927 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "POST / HTTP/1.1" 400 437
2017-08-22 17:15:37,934 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amzn-requestid': 'c097fe4e-874c-11e7-a56a-9d1acedaf516', 'content-type': 'text/xml', 'content-length': '437', 'date': 'Tue, 22 Aug 2017 15:15:37 GMT', 'connection': 'close'}
2017-08-22 17:15:37,936 - MainThread - botocore.parsers - DEBUG - Response body:
b'<ErrorResponse xmlns="http://rds.amazonaws.com/doc/2014-10-31/">\n  <Error>\n    <Type>Sender</Type>\n    <Code>KMSKeyNotAccessibleFault</Code>\n    <Message>The target snapshot KMS key [<kms-arn>] does not exist, is not enabled or you do not have permissions to access it. </Message>\n  </Error>\n  <RequestId>c097fe4e-874c-11e7-a56a-9d1acedaf516</RequestId>\n</ErrorResponse>\n'
2017-08-22 17:15:37,938 - MainThread - botocore.hooks - DEBUG - Event needs-retry.rds.CopyDBSnapshot: calling handler <botocore.retryhandler.RetryHandler object at 0x7f9c7ce84860>
2017-08-22 17:15:37,939 - MainThread - botocore.retryhandler - DEBUG - No retry needed.
2017-08-22 17:15:37,952 - MainThread - awscli.clidriver - DEBUG - Exception caught in main()
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/awscli/clidriver.py", line 200, in main
    return command_table[parsed_args.command](remaining, parsed_args)
  File "/usr/lib/python3.6/site-packages/awscli/clidriver.py", line 338, in __call__
    return command_table[parsed_args.operation](remaining, parsed_globals)
  File "/usr/lib/python3.6/site-packages/awscli/clidriver.py", line 508, in __call__
    call_parameters, parsed_globals)
  File "/usr/lib/python3.6/site-packages/awscli/clidriver.py", line 627, in invoke
    client, operation_name, parameters, parsed_globals)
  File "/usr/lib/python3.6/site-packages/awscli/clidriver.py", line 639, in _make_client_call
    **parameters)
  File "/usr/lib/python3.6/site-packages/botocore/client.py", line 310, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/lib/python3.6/site-packages/botocore/client.py", line 599, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.KMSKeyNotAccessibleFault: An error occurred (KMSKeyNotAccessibleFault) when calling the CopyDBSnapshot operation: The target snapshot KMS key [<kms-arn>] does not exist, is not enabled or you do not have permissions to access it. 
2017-08-22 17:15:37,955 - MainThread - awscli.clidriver - DEBUG - Exiting with rc 255

An error occurred (KMSKeyNotAccessibleFault) when calling the CopyDBSnapshot operation: The target snapshot KMS key [<kms-arn>] does not exist, is not enabled or you do not have permissions to access it.

FTR: я отправил сообщение на форум AWS: https://forums.aws.amazon.com/thread.jspa?messageID=801745


person svenwltr    schedule 22.08.2017    source источник
comment
Можете ли вы добавить --debug в команду aws rds и опубликовать?   -  person Rodrigo M    schedule 22.08.2017
comment
Я добавил вывод отладки из фактического HTTP-запроса.   -  person svenwltr    schedule 22.08.2017
comment
Пробовали ли вы использовать управляемую политику вместо указания собственной? Попробуйте добавить к роли следующую политику: См. arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser   -  person Rodrigo M    schedule 24.08.2017
comment
Я не нашел подходящей политики. К сожалению, AWSKeyManagementServicePowerUser далеко не минимальный набор разрешений.   -  person svenwltr    schedule 24.08.2017
comment
Это управляемая политика AWS. Моя идея состояла в том, чтобы подтвердить, работает ли это, и уменьшить оттуда. Он более минимален, чем kms:*, и таким образом может использоваться в качестве основы для дальнейшего сокращения ненужных разрешений.   -  person Rodrigo M    schedule 24.08.2017
comment
Да, метод проб и ошибок — это способ решить эту проблему. Я надеялся, что кто-то уже знает ответ или подскажет, как лучше это отлаживать. Может быть, у AWS где-то есть потрясающая скрытая документация (ха-ха), которую я еще не нашел. Такая проблема возникает не первый раз. К сожалению, мне кажется, что я должен понять это сам (снова).   -  person svenwltr    schedule 24.08.2017
comment
Я знаю, что делаю одно и то же упражнение каждый раз. ;-) В настоящее время я думаю, что сначала нужно найти управляемую политику, а затем работать с ней. Но, похоже, нет канонической ссылки на разрешения, основанные на операции. Меня тоже интересует этот конкретный случай. Напиши, если найдешь решение, сделаю так же   -  person Rodrigo M    schedule 24.08.2017
comment
Возможно, AWS что-то изменил, но при вызове copy_db_snapshot через boto3 (привязки Python API) мне нужно было только разрешение kms:ReEncrypt в целевом регионе. Это может быть связано с тем, что я использую ключ, управляемый клиентом, в исходном регионе и ключ, управляемый AWS, в целевом регионе (в одной и той же учетной записи AWS).   -  person mxmader    schedule 19.06.2019


Ответы (4)


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

Это необходимые разрешения для копирования моментального снимка RDS:

["kms:CreateGrant","kms:DescribeKey"]

Это сценарий, который я использовал. Может быть, это полезно для других людей, у которых есть аналогичная проблема. Он взломан вместе, поэтому не ожидайте, что он будет работать из коробки.

#!/bin/bash

set -euo pipefail

unknown=(
    kms:CancelKeyDeletion
    kms:CreateAlias
    kms:CreateAlias
    kms:CreateGrant
    kms:CreateKey
    kms:Decrypt
    kms:DeleteAlias
    kms:DeleteAlias
    kms:DescribeKey
    kms:DisableKey
    kms:DisableKeyRotation
    kms:EnableKey
    kms:EnableKeyRotation
    kms:Encrypt
    kms:GenerateRandom
    kms:GenerateDataKey
    kms:GenerateDataKeyWithoutPlaintext
    kms:GetKeyPolicy
    kms:GetKeyRotationStatus
    kms:ListAliases
    kms:ListGrants
    kms:ListKeyPolicies
    kms:ListKeys
    kms:ListRetirableGrants
    kms:PutKeyPolicy
    kms:ReEncryptFrom
    kms:ReEncryptTo
    kms:RetireGrant
    kms:RevokeGrant
    kms:ScheduleKeyDeletion
    kms:UpdateAlias
    kms:UpdateAlias
    kms:UpdateKeyDescription
)
required=()

KEY_ID=86a6300d-38f9-4892-b7a1-d8f821e8438c
export AWS_DEFAULT_OUTPUT=json

function check_copy {
    permissions=$( echo -n "${required[*]} ${unknown[*]}" | jq -R -s 'split(" ")' )

    policy=$( aws kms \
        get-key-policy \
        --key-id ${KEY_ID} \
        --policy-name default \
      | jq ".Policy" -r \
      | jq ".Statement[1].Action |= ${permissions}"
    )

    aws kms \
        put-key-policy \
        --key-id ${KEY_ID} \
        --policy-name default \
        --policy "${policy}"

    aws rds \
        delete-db-snapshot \
        --db-snapshot-identifier rds-backup-share-mysql-reencrypted \
        || true

    (
        set -x
        AWS_ACCESS_KEY_ID=XXX \
        AWS_SECRET_ACCESS_KEY=XXX \
        aws rds \
            copy-db-snapshot \
            --source-db-snapshot-identifier rds-backup-share-mysql \
            --target-db-snapshot-identifier rds-backup-share-mysql-reencrypted \
            --kms-key-id alias/rds-snapshot-share \
            || return 1

    aws rds \
        wait db-snapshot-completed \
        --db-snapshot-identifier rds-backup-share-mysql-reencrypted
    ) || return 1

    return 0
}

check_copy
while [ ${#unknown[@]} -gt 0 ]
do
    removed=${unknown[0]}
    unknown=(${unknown[@]:1})

    if ! check_copy
    then
        required+=($removed)
    fi

    echo "Required permissions so far: ${required[*]}"
    echo "Unknown permissions so far: ${unknown[*]}"
done

echo -n "Minimal permissions: "
echo -n "${required[*]}" | jq -R -s -c 'split(" ")'
person svenwltr    schedule 25.08.2017
comment
Стоит отметить, что они нужны как для исходного ключа KMS, так и для целевого ключа KMS. - person sihil; 01.05.2019

Я нашел другую основную причину этого и другое решение:

Просто создайте, а затем удалите RDS в целевом регионе!

AWS RDS просто отказывался копировать моментальный снимок, что бы я ни делал с ключевыми политиками, ПОКА я не создал небольшой автоматический RDS. Теперь любой ключ работает "из коробки", даже новые без смены политики!

person Aloysio Carvalho    schedule 22.10.2019
comment
Я тоже наткнулся на этот баг, потерял 3 часа. Спасибо за совет ! - person Ka.; 24.02.2020
comment
Стоит отметить, что RDS будет работать только с симметричным ключом. Асимметричные ключи не будут работать, но четкого сообщения у вас не будет. - person Ka.; 24.02.2020
comment
@Ka.Это было исправление для меня, спасибо! Сообщение об ошибке AWS было очень расплывчатым - person AWS Cloud Architect Rob; 10.03.2021

Я также делаю копию моментального снимка базы данных RDS, но использую Powershell, а моя база данных — MS SQL. Я получаю ту же ошибку:

The target snapshot KMS key [<kms-arn>] does not exist, 
is not enabled or you do not have permissions to access it.

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

Моя ошибка заключалась в том, что я не указал регион в Copy-RDSDBSnapshot (в Powershell; эквивалентно copy-db-snapshot в CLI). Поскольку я копирую между регионами для сценария аварийного восстановления, я должен указать KmsKeyId целевого региона (поскольку он будет откладываться от исходного региона). Исходный регион us-east-1 является моим регионом по умолчанию, поэтому выполнение этого не сработало, оно завершилось с ошибкой выше, так как я ничего не указывал, он работает в моем регионе по умолчанию us-east-1 и, следовательно, не могу найти ключ us-west-2, как говорит ошибка, он «не существует» в этом регионе, это не имеет отношения к разрешениям:

Copy-RDSDBSnapshot -SourceDBSnapshotIdentifier $dBSnapshotArn `
                   -SourceRegion 'us-east-1' `
                   -TargetDBSnapshotIdentifier $targetSnapshotName `
                   -KmsKeyId 'arn:aws:kms:us-west-2:xxxxx:key/xxxxx' `
                   -CopyTag $true -OptionGroupName 'myOptionGroup'

Добавление так называемого «Общего параметра» Region помогло:

Copy-RDSDBSnapshot -SourceDBSnapshotIdentifier $dBSnapshotArn `
                   -SourceRegion 'us-east-1' `
                   -TargetDBSnapshotIdentifier $targetSnapshotName `
                   -KmsKeyId 'arn:aws:kms:us-west-2:xxxxx:key/xxxxx' `
                   -CopyTag $true -OptionGroupName 'myOptionGroup' `
                   -Region 'us-west-2'  # <-- new line
person Thierry_S    schedule 10.04.2018
comment
В вашем случае ожидается, что для работы вызова CLI требуется Region, учитывая 1) возможно, что ваш регион по умолчанию в вашем профиле не us-west-2 2) вы ссылаетесь на us-west-2 в значении KmsKeyId и контекст команды, по-видимому, копирует снимок из источника. Для согласованности я копирую моментальные снимки EC2 EBS таким же образом (в моем случае ориентируясь на целевой регион из клиента boto3). - person mxmader; 19.06.2019

Помимо разрешений из других ответов, обязательно используйте симметричный ключ шифрования. Ошибки AWS неясны в том, что они означают, и то же самое сообщение об ошибке используется, когда вы пытаетесь сделать что-то с асимметричным ключом, что должно быть сделано с симметричным.

person ErvalhouS    schedule 24.03.2021