AWSでやらかす系の事故で、もっとも恐ろしいものの一つに、アクセスキー・シークレットアクセスキーの流出があります。これは、多くの場合プログラム中にアクセスキー・シークレットアクセスキーを埋め込んだままGitHub等の公開リポジトリに登録することで起こります。GitHubを監視しているBotがカモを待ち受けているので、キーを発見するやいなや不正利用して可能な限りのインスタンスを立ち上げます。そして、BitCoin等の採掘などに利用します。気が付かないと、一晩で100万円近くの請求という話もあったようです。
AWSのアクセスキーの流出を防ぐ方法
このアクセスキーの流出は、AWSの仕組みを知っていると、ほぼ被害は防げます。という事、基本的な部分をおさらいしましょう。
守るべきシンプルなルールは、たったの一つです。
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版
- 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/03/23
- メディア: 単行本
- この商品を含むブログを見る