我在AWS上有一个EC2 ASG,我想把用于实例化任何给定实例的shell脚本存储在S3存储桶中,并在实例化时下载和运行它,但即使我使用IAM Instance Role
,通过HTTPS传输并在S3存储桶中静止加密脚本,整个过程仍感觉有些不稳定。 使用 我使用 KMS
S3服务器端加密
(因为KMS
方法会引发“未知”错误)。
设置
- 创建了一个
IAM 实例角色
,在任何实例被实例化时都会分配给我的 ASG,从而将我的 AWS 凭证作为ENV
变量嵌入到实例中 - 将我的
Instance-Init.sh
脚本上传并加密到 S3 中,结果是生成了一个私有终端节点,如下所示:https://s3.amazonaws.com/super-secret-bucket/Instance-Init.sh
在 User-Data
字段中
当我想要使用 Launch Configuration
创建我的 ASG 时,我将以下内容输入到 User Data
字段中:
#!/bin/bash
apt-get update
apt-get -y install python-pip
apt-get -y install awscli
cd /home/ubuntu
aws s3 cp s3://super-secret-bucket/Instance-Init.sh . --region us-east-1
chmod +x Instance-Init.sh
. Instance-Init.sh
shred -u -z -n 27 Instance-Init.sh
上面的操作会执行以下内容:
- 更新包列表
- 安装Python(运行
aws-cli
所需) - 安装
aws-cli
- 切换到
/home/ubuntu
用户目录 - 使用
aws-cli
从S3
下载Instance-Init.sh
文件。由于我的实例分配了IAM Role
,因此aws-cli
自动发现了我的 AWS 凭据。该IAM Role
还授予我的实例解密文件所需的权限。 - 将其设为可执行文件
- 运行脚本
- 完成后删除脚本。
Instance-Init.sh
脚本
脚本本身将执行诸如设置 env
变量和在我的实例上部署所需的容器等操作。就像这样:
#!/bin/bash
export MONGO_USER='MyMongoUserName'
export MONGO_PASS='Top-Secret-Dont-Tell-Anyone'
docker login -u <username> -p <password> -e <email>
docker run - e MONGO_USER=${MONGO_USER} -e MONGO_PASS=${MONGO_PASS} --name MyContainerName quay.io/myQuayNameSpace/MyAppName:latest
非常方便
这样可以非常方便地更新User-Data
脚本,而不需要每次需要进行微小更改时创建新的Launch Config
。它能够很好地将env
变量从代码库中取出,并放入一个狭窄、可控的空间(Instance-Init.sh
脚本本身)。
但是所有这一切都感觉有点不安全。把我的主数据库凭据放在S3上的文件中让人不安。
问题
- 这是常见的做法还是我在想一个坏主意?
- 事实上,该文件被下载并存储(虽然是暂时的),是否构成漏洞?
- 是否有更好的方法以更安全的方式删除文件?
- 是否在运行后删除该文件甚至重要?考虑到密码正在传输到
env
变量中,删除Instance-Init.sh
文件似乎是多余的。 - 在我刚开始运维的日子里,是否有我忽略的东西?
提前感谢任何帮助。