Роль экземпляра 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 ответ
Для меня проблема была двоякой:
- Если вы используете шифрование на стороне сервера через KMS, вам необходимо предоставить
--sse aws:kms
флаг кaws s3 cp [...]
команда. - Я устанавливал устаревшую версию
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]