2017-08-22 1 views
0

Je suis en train de configurer les autorisations minimales pour faire aws rds copy-db-snapshot avec une clé de chiffrement KMS:autorisations KMS minimales pour copier un instantané de base de données

$ 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> 

(Tout à <> est dépouillé par moi et contient des valeurs valides.)

Malheureusement, je reçois cette erreur:

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. 

Actuellement j'autorise ces actions:

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

Cela fonctionne si je le remplace par kms:*{code}, donc cela doit être un problème de permission.

J'ai essayé de déterminer les permissions correctes avec CloudTrail, mais il contient juste le même message d'erreur inutile.

Mes questions réelles:

  • Quelles sont les autorisations KMS minimales pour CopyDBSnapshot?
  • Existe-t-il un moyen générique de déterminer les autorisations requises? Il est toujours difficile de perdre mon temps en recherchant les permissions requises.

Edit: Ceci est la est la partie inférieure de la sortie du journal avec --debug activé:

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: Je l'ai fait une croix post sur le forum AWS: https://forums.aws.amazon.com/thread.jspa?messageID=801745

+0

Pouvez-vous ajouter --debug à la commande aws rds et poster? –

+0

J'ai ajouté la sortie de débogage de la requête HTTP réelle. – svenwltr

+0

Avez-vous essayé une politique gérée comme alternative à la spécification de la vôtre? Essayez d'ajouter la règle suivante au rôle: Voir 'arn: aws: iam :: aws: policy/AWSKeyManagementServicePowerUser' –

Répondre

0

Maintenant, je l'ai compris par essais et erreurs. Comme je n'aime pas faire la même tâche plus d'une fois, je l'ai automatisée (voir le script ci-dessous).

Ce sont les autorisations requises pour la copie d'un instantané RDS:

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

Voici le script que j'ai utilisé. Peut-être que c'est utile pour d'autres personnes qui ont un problème similaire. Il est piraté ensemble, alors ne vous attendez pas à ce qu'il fonctionne hors de la boîte.

#!/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(" ")'