EC2 ユーザーデータ シェル スクリプトをプライベート S3 バケットに保存するのは安全ですか? 質問する

EC2 ユーザーデータ シェル スクリプトをプライベート S3 バケットに保存するのは安全ですか? 質問する

AWS に EC2 ASG があり、任意のインスタンスをインスタンス化するために使用されるシェルスクリプトを S3 バケットに保存し、インスタンス化時にダウンロードして実行することに興味がありますが、を使用して、HTTPS経由で転送し、S3 バケットに保存されて いる IAM Instance Role間にスクリプト自体を暗号化しているに もかかわらず、すべてが少し不安定に感じられます。 KMS S3 Server Side EncryptionKMSメソッドが「不明」エラーをスローしていたため)。

セットアップ

  • インスタンス化時に ASG 内の任意のインスタンスに割り当てられるを作成し、その結果、AWS 認証情報が変数IAM Instance Roleとしてインスタンスに組み込まれます。ENV
  • スクリプトを S3 にアップロードして暗号化すると、Instance-Init.sh次のようなプライベート エンドポイントが作成されます。https://s3.amazonaws.com/super-secret-bucket/インスタンスInit.sh

User-Data現場で

ASG で使用するUser Dataものを作成するときに、次の内容をフィールドに入力します。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

上記は以下を実行します:

  • パッケージリストを更新
  • Pythonをインストールします(実行に必要aws-cli
  • インストールaws-cli
  • /home/ubuntuユーザーディレクトリの変更
  • は からファイルをaws-cliダウンロードするためにを使用します。インスタンスに割り当てられているにより、AWS 認証情報は によって自動的に検出されます。 は、ファイルの復号化に必要な権限もインスタンスに付与します。Instance-Init.shS3IAM Roleaws-cliIAM Role
  • 実行可能にする
  • スクリプトを実行する
  • 完了したらスクリプトを削除します。

スクリプトInstance-Init.sh

スクリプト自体は、インスタンスにデプロイする必要があるenv変数やコンテナの設定などの処理を実行します。次のようになります。docker run

#!/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のにも役立ちます。envInstance-Init.sh

しかし、少し不安な気がします。マスター DB 認証情報を S3 上のファイルに保存するというのは、控えめに言っても不安です。

質問

  1. これは一般的な慣行ですか、それとも私が悪い考えを思いついているのでしょうか?
  2. ファイルが新しいインスタンスにダウンロードされ、(たとえ短時間であっても)保存されるという事実は、脆弱性を構成するのでしょうか?
  3. より安全にファイルを削除するより良い方法はありますか?
  4. 実行後にファイルが削除されるかどうかは重要ですか? シークレットがenvvars に転送されていることを考慮すると、ファイルを削除するのは冗長に思えますInstance-Init.sh
  5. オペレーションの初期段階で私が見逃している何かがあるのでしょうか?

ご協力いただければ幸いです。

ベストアンサー1

あなたが説明している内容は、私たちがレジストリからDockerコンテナをインスタンス化するために使用しているものとほぼ同じです(現在、Quayではなく、v2セルフホスト/プライベート、s3バックアップdocker-registryを使用しています)。参考までに、私も最初にこの道を歩み始めたときにあなたが説明したのと同じ「これは不安定な感じがする」という感覚を覚えましたが、ほぼ1年経った今、そしてこの機密構成データをリポジトリに保存したりイメージに焼き込んだりする代替手段と比較して、これがこのデータを処理するより良い方法の1つであると確信しています。そうは言っても、現在、Hashicorp の新しい Vault ソフトウェアこの「共有」暗号化されたシークレット シェル スクリプト コンテナを置き換えるために、構成シークレットを展開します (5 回素早く言ってみてください)。Vault は、構成ストレージを除けば、暗号化をオープン ソース コミュニティ (本来の場所) にアウトソーシングするのと同等になると考えています。

簡単に言うと、私たちは約 1 年間、非常に似た状況で多くの問題に遭遇していませんが、現在、自社開発の方法を置き換えるために外部のオープン ソース プロジェクト (Hashicorp の Vault) の使用を検討しています。幸運を祈ります!

おすすめ記事