プログラマでありたい

おっさんになっても、プログラマでありつづけたい

AWSのアクセスキー・シークレットアクセスキーをプログラムに安全に埋め込む(埋め込まない)方法

 AWSでやらかす系の事故で、もっとも恐ろしいものの一つに、アクセスキー・シークレットアクセスキーの流出があります。これは、多くの場合プログラム中にアクセスキー・シークレットアクセスキーを埋め込んだままGitHub等の公開リポジトリに登録することで起こります。GitHubを監視しているBotがカモを待ち受けているので、キーを発見するやいなや不正利用して可能な限りのインスタンスを立ち上げます。そして、BitCoin等の採掘などに利用します。気が付かないと、一晩で100万円近くの請求という話もあったようです。

 

AWSのアクセスキーの流出を防ぐ方法


 このアクセスキーの流出は、AWSの仕組みを知っていると、ほぼ被害は防げます。という事、基本的な部分をおさらいしましょう。アクセスキーではなく、IAMロールを使うというのが基本ですが、どうしても使わざるをえない場合は、下記のルールを守ってください。

 

 守るべきシンプルなルールは、たったの一つです。

 

AWSのアクセスキーは、プログラムに直接書き込まない。環境変数から読み込む

 

 この環境変数というところがミソで、実はAWSのSDK,CLIは特定の環境変数名を自動で読み込むようになっています。アクセスキーは、AWS_ACCESS_KEY_IDで、シークレットアクセスキーは、AWS_SECRET_ACCESS_KEYです。

Linuxの設定例
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key

 

Windowsの設定例
set AWS_ACCESS_KEY_ID=your_access_key_id
set AWS_SECRET_ACCESS_KEY=your_secret_access_key

 

AWSの認証情報の検索順


  この辺りの情報は、AWSの認証情報の検索順等で検索すると出てきます。例えばRubyの例だと次のように定義されています。

 

AWS SDK for Ruby は、次の手順で認証情報を検索します。

 

1. クライアントオブジェクト内で認証情報を設定する

2. Aws.config を使用して認証情報を設定する

3. 環境変数を使用して認証情報を設定する

4. 共有認証情報の設定

5. IAM を使用して認証情報を設定する

 

 

 言語によっては多少違いますが、優先順位や設定可能項目は概ね同じです。つまりプログラムで設定したものが最優先で、次に環境変数系、最後にIAMロールという順です。

 

AWSのアクセスキー運用のベスト・プラクティス


 

 上記の最低限のルールの他に、下記のようなアクセスキーの運用を守ってください。いわゆるベストプラクティスの一部です。

 

- AWSサイドで利用する場合は、IAMロールを利用し、アクセスキーを利用しない

- アクセスキーを使う場合は、該当のIAMユーザには最小権限を付与する

- 可能な限りIPアドレスで絞る

- git-secretsを利用して、誤操作時に気付けるようにする

- Assume Roleを利用して、一時的なアクセスキーを利用すると、なお良い

 

 ただし、初めての人にこれ全部最初にやれというのも現実的ではないので、最低限守っておくべきというのが最初に説明したプログラムに埋め込まないという対応になります。

 

まとめ 


 実務的な部分では、もっと考慮しないといけない部分は沢山あります。ただ、手始めにローカルで試す場合、最低限この方法を守っていれば危険を回避します。本当は、サーバーサイドでロール使ってが良いですが、環境面の制約があり、キーを使わざるをえない場合の話です。

 こういった話も、3/23発売の改定第2版 Amazon Web Services パターン別構築・運用ガイドにまとめています。転ばぬ先の杖として、ぜひご活用ください。

 

Amazon Web Services パターン別構築・運用ガイド 改訂第2版

Amazon Web Services パターン別構築・運用ガイド 改訂第2版

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/03/23
  • メディア: 単行本
  • この商品を含むブログを見る