将EC2用户数据shell脚本存储在专用S3存储桶中是否安全?

时间:2015-04-29 00:36:07

标签: bash shell amazon-ec2 amazon-s3 user-data

我在AWS上有一个EC2 ASG,我有兴趣存储用于实例化S3存储桶中任何给定实例的shell脚本,并将其下载并在实例化时运行,但这一切都让我感觉不舒服即使我使用IAM Instance Role,通过HTTPS进行传输,并使用KMS 使用{{使用IAM Instance Role 在S3桶中静止时加密脚本本身,这有点摇摇晃晃3}}(S3 Server Side Encryption)。

设置

  • 创建ENV,在实例化时将其分配给我的ASG中的任何实例,从而导致我的AWS信誉以Instance-Init.sh vars
  • 的形式出现在实例中
  • 将我的User-Data脚本上传并加密到S3,产生如下所示的私有端点:because the KMS method was throwing an 'Unknown' error

User Data字段

在创建{I}要我使用的Launch Configuration时,我将以下内容输入#!/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 字段:

aws-cli

以上做了以下内容:

  • 更新包列表
  • 安装Python(运行aws-cli所需)
  • 安装/home/ubuntu
  • aws-cli用户目录
  • 的更改
  • 使用Instance-Init.shS3下载IAM Role文件。由于aws-cli分配给我的实例,我的AWS信用卡由IAM Role自动发现。 Instance-Init.sh还授予我的实例解密文件所需的权限。
  • 使其可执行
  • 运行脚本
  • 完成脚本后删除脚本。

env脚本

脚本本身会执行诸如设置docker run vars和#!/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变量从代码库中移出并进入一个狭窄的可控空间(env脚本本身)。

但这一切都感觉有点不安全。将我的主数据库信誉放入S3中​​的文件的想法至少令人不安。

问题

  1. 这是一种常见的做法,还是我在这里做了一个坏主意?
  2. 文件是否在新实例上下载和存储(尽管是短暂的)这一事实构成了一个漏洞吗?
  3. 是否有更好的方法以更安全的方式删除文件?
  4. 文件在运行后是否被删除是否重要?考虑到秘密被转移到Instance-Init.sh变量,删除jspm install materialize=github:Dogfalo/materialize@master 文件几乎是多余的。
  5. 在我刚开始的操作中,有什么东西可以丢失吗?

  6. 感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:6)

您所描述的几乎正是我们用来从我们的注册表实例化Docker容器(我们现在使用v2自托管/私有,s3支持的docker-registry而不是Quay)到生产中。 FWIW,我有同样的“感觉摇摇晃晃”的感觉,你在第一次踏上这条道路时会有所描述,但是经过近一年的努力 - 并且与将这些敏感的配置数据存储在仓库或烘焙到image - 我确信这是处理这些数据的更好方法之一。现在,我们正在考虑使用Hashicorp's new Vault software来部署配置机密来替换这个“共享”加密的秘密shell脚本容器(比如快五倍)。我们认为Vault将等同于将加密外包给开源社区(它所属的地方),但是用于配置存储。

用更少的话来说,我们已经使用了大约一年的非常类似的情况,但是我们现在正在寻找使用外部开源项目(Hashicorp的Vault)来取代我们自己开发的产品。方法。祝你好运!

答案 1 :(得分:2)

Vault的替代方法是使用credstash,它利用AWS KMS和DynamoDB实现类似的目标。

我实际上使用credstash通过简单的入口点脚本动态导入容器启动时的敏感配置数据 - 这样,敏感数据不会通过docker inspect或docker logs等公开。

这是一个示例入口点脚本(对于Python应用程序) - 这里的美妙之处在于您仍然可以通过环境变量为非AWS / dev环境传递凭据。

#!/bin/bash
set -e

# Activate virtual environment
. /app/venv/bin/activate

# Pull sensitive credentials from AWS credstash if CREDENTIAL_STORE is set with a little help from jq
# AWS_DEFAULT_REGION must also be set
# Note values are Base64 encoded in this example
if [[ -n $CREDENTIAL_STORE ]]; then
  items=$(credstash -t $CREDENTIAL_STORE getall -f json | jq 'to_entries | .[]' -r)
  keys=$(echo $items | jq .key -r)
  for key in $keys
  do
    export $key=$(echo $items | jq 'select(.key=="'$key'") | .value' -r | base64 --decode)
  done
fi

exec $@