Роль экземпляра EC2 получает ошибку "Неизвестно" при попытке зашифрованного файла KMS aws s3 cp

У меня есть ASG который назначает IAM Role к каждому из экземпляров, которые присоединяются к нему. Поэтому каждый экземпляр имеет AWS_ACCESS_KEY_ID а также AWS_SECRET_ACCESS_KEY Переменные окружения, которые будут использоваться при создании экземпляра для загрузки и дешифрования учетных данных, которые хранятся в S3 ведро и зашифровано с помощью KMS ключи.

Поэтому у меня будут следующие компоненты:

  • S3 ведро называется top-secret.myapp.com
  • Все объекты в этом сегменте зашифрованы с использованием KMS ключ называется My-KMS-Key
  • IAM роль экземпляра со встроенными политиками, предоставляя ему возможность взаимодействовать как с ведром, так и с KMS ключ, используемый для шифрования / дешифрования содержимого корзины (см. ниже)
  • user data скрипт, который устанавливает aws-cli после создания экземпляра, а затем пытается загрузить и расшифровать объект из top-secret.myapp.com ведро.

Скрипт пользовательских данных

После создания экземпляра любой данный экземпляр запускает следующий скрипт:

#!/bin/bash

apt-get update
apt-get -y install python-pip
apt-get -y install awscli

cd /home/ubuntu
aws s3 cp s3://top-secret.myapp.com/secrets.sh . --region us-east-1
chmod +x secrets.sh
. secrets.sh
shred -u -z -n 27 secrets.sh


Ролевые политики IAM

IAM роль для моего ASG к экземплярам встроены три политики:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::top-secret.myapp.com"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::top-secret.myapp.com/secrets.sh"
            ]
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ],
            "Resource": "arn:aws:kms:us-east-1:UUID-OF-MY-SECRET-KEY-HERE"
        }
    ]
}

Первая политика по сути является политикой полного корневого доступа без ограничений. Или так я думал, но это не работает. Поэтому я подумал, что, возможно, мне нужно явно применять политики, которые позволяют взаимодействие с S3 шифрование и / или KMS, имеет смысл.

Поэтому я добавил вторую политику, которая позволяет IAM роль экземпляра, чтобы перечислить top-secret.myapp.com ведро, и LIST а также GET secrets.sh объект в ведре. Но это привело к ошибке, показанной ниже.

(Неизвестная) ошибка, которую я получаю

download failed: s3://top-secret.myapp.com/secrets.sh to ./secrets.sh
A client error (Unknown) occurred when calling the GetObject operation: Unknown

Кто-нибудь есть идеи, что может быть причиной этой ошибки?

Примечание. Этот метод передачи зашифрованных секретов из S3 и их дешифрования в экземпляре прекрасно работает с использованием стандартного Amazon S3 service master key

1 ответ

Для меня проблема была двоякой:

  1. Если вы используете шифрование на стороне сервера через KMS, вам необходимо предоставить --sse aws:kms флаг к aws s3 cp [...] команда.
  2. Я устанавливал устаревшую версию awscli (версия 1.2.9) через aptи эта версия не распознала --sse aws:kms команда
    • Бег apt-get remove awscli и установка через pip install awscli дал мне версию 1.10.51, которая работала.

РЕДАКТИРОВАТЬ:

Если вы используете для своей учетной записи ключ KMS, отличный от основного ключа по умолчанию, вам также необходимо добавить следующий флаг:

--sse-kms-key-id [YOUR KMS KEY ID]

Другие вопросы по тегам