【发布时间】:2016-08-02 22:47:41
【问题描述】:
我有一个ASG,它为每个加入它的实例分配一个IAM Role。因此,每个实例都内置了AWS_ACCESS_KEY_ID 和AWS_SECRET_ACCESS_KEY 环境变量,它们将在实例化时用于下载和解密存储在S3 存储桶中并使用KMS 密钥加密的凭据。
所以我将拥有以下组件:
- 一个名为
top-secret.myapp.com的S3存储桶 - 此存储桶中的所有对象都使用名为
My-KMS-Key的KMS密钥加密 - 一个带有内联策略的
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 角色政策
我的ASG 实例的IAM 角色内联附加了三个策略:
{
"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
【问题讨论】:
-
因此,您的问题似乎与“aws s3 cp”命令有关,并且(目前)不涉及 KMS 的任何问题。该错误消息并不表明存在与权限相关的问题。您是否能够复制任何其他文件(例如从公共 S3 存储桶)?您是否尝试过 AWS CLI 的
--debug选项? -
感谢您的建议,约翰。但绝对是
KMS这就是这里的问题。它适用于默认的S3 SSE键,但不适用于我通过KMS分配的任何键。这一定与任何给定资源所附带的政策有关,但我很难理解这些。本周晚些时候我将不得不回到这个话题。
标签: security encryption amazon-ec2 amazon-s3