【実録】アクセスキー流出、攻撃者のとった行動とその対策
先日、弊社が管理しているAWSアカウントにてアクセスキー流出事故が発生しました。※弊社作業による流出ではありません。
そして、運悪く流出したアクセスキーが不正利用されてしまいました。
本ブログではなぜアクセスキーが流出したのか、そして、何が起こったのか、そうならないために何ができるのかを紹介したいと思います。
事象・経緯
弊社メンバーズをご利用のお客様は、PowerUser権限のアクセスキーを利用し開発を実施していました。その作業中に誤ってPublicなGitHubリポジトリにアクセスキーをPushしてしまったのが事の発端になります。その後アクセスキーが何者かに不正利用され仮想通貨のマイニングが行われました。最終的に流出したキー経由で作成されたリソースを全て削除する事で事態は収束しています。
発生した事象は以下の通りです。時間はおおよそです。
No | 時間 | 状況 |
---|---|---|
1 | 00:00 | お客様がPoweruser権限のアクセスキーをPublicなGitHubリポジトリにPush |
2 | 00:10 | 当該アクセスキーを利用した不正な操作が行われる |
3 | 00:30 | AWS様からの連絡を受け、弊社からお客様へアクセスキーが漏洩した旨、および、対応方法をご連絡(電話、メール) |
4 | 01:00 | 当該キー経由で作成されたリソースを全て削除 |
5 | XX:XX | IAMユーザーのアクセスキーをローテーション |
5 | XX:XX | IAMユーザーのパスワードをローテーション |
それぞれのフェーズの詳細は以下のようになります。
当該アクセスキーを利用した不正な操作が行われる
流出したアクセスキーを利用し以下の操作が行われました。APIレベルの操作です。一連の操作はスクリプト化されているように見受けられます。
- CreateAccessKey
- 流出したアクセスキーを利用し新規のアクセスキーを作成
- DeleteAccessKey
- 流出したアクセスキーを削除
- CreateUser
- IAMユーザーを作成(権限不足により失敗)
- CreateKeyPair
- 新規のアクセスキーを利用しキーペアを作成
- RunInstances
- 全リージョンでインスタンスを起動
- 各リージョンで20のインスタンスが立ちあがる(起動上限はデフォルトのまま)
m5.24xlarge
などインスタンスサイズが大きいものが優先される
- 全リージョンでインスタンスを起動
その後、起動したインスタンスにて仮想通貨Monero
のマイニングが行われました。※CPUでのマイニングが有効で、かつ、匿名性の高い通貨が対象となっているようです。
各リージョンでGuardDutyを有効化していたため、重要度HighでCryptoCurrency:EC2/BitcoinTool.B
の警告が大量に発生しました。警告が発生していたのは各インスタンスから海外のVPSを利用したマイニングプールへの通信です。
弊社からお客様へアクセスキーが漏洩した旨、および、対応方法をご連絡
具体的に以下の操作を実施していただくようご連絡しました。
- GitHubからの該当データの削除
- 対象IAMユーザーのアクセスキーを削除
- 不正利用されていないか CloudTrail 等で確認(全リージョン)
- 不正リソースの削除(不正利用が確認された場合)
- 他のIAM ユーザーのアクセスキーのローテーション
- 全てのIAMユーザーのパスワードのローテーション
お客様にて不正なリソースの削除が完了したのは、インスタンスが起動されてから約1時間後となります。
本事象による被害
問題が発生してから対処完了までの1時間で$500
ほどのAWS利用料が発生しました。初動が早かったということもあり金額的な被害はそれほどでもありませんでした。
しかし、その後の対応などを考えると被害が少なかったとは言えません。
原因・再発防止策について
直接的な原因は、開発者が誤ってアクセスキーをGitHubのPublicなリポジトリにPushしたことにあります。
ツールによる予防
この操作を防ぐにはgit-secretsが有効です。 AWSアクセスキーをGitリポジトリに混入させないためのツールになります。
権限を絞る
開発者がある程度強い権限のユーザーを利用し開発することはよくあることだと思います。しかし、全ての開発者がPowerUser、もしくはAdministratorである必要はないと思います。
必要な権限を必要な人に付与するべきです。
今回不正利用されたユーザーの権限はPowerUserだったのでIAMユーザーの作成はエラーとなっていましたが、Administratorの権限が漏れていたとなれば被害はもっと大きくなっていたかもしれません。
GuardDutyを有効化する
GuardDutyは疑わしいネットワーク通信を検知することができるサービスです。GuardDuty有効化することで、初動が早くなり被害を最小限に抑えることができます。また、GuardDutyは全リージョンで有効化することをお勧めします。仮に東京リージョンでのみ有効化していた場合、他のリージョンでの不正利用に気づけなかった可能性があります。コストもAWSの利用費全体からすればそれほど高くありません。
- Amazon GuardDutyによる疑わしいネットワーク通信の検知と初動対応の振り返り
- 【全員必須】GuardDutyがコスパ最強の脅威検知サービスであることを証明してみた
- 一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った
Budgetを設定する
BudgetはAWSアカウントのコストを監視するためのサービスです。予め設定したコストに到達したときにアラームがなるように設定しておきましょう。
弊社のメンバーズサービスに加入する
弊社のメンバーズサービスに加入していただくことで、このような事態に陥って弊社が通知を受け取った際には電話で状況を報告することが可能になります。また、「そもそもIAMはどのように管理をするべきなのか」などのコンサルティングを行うことも可能です。この辺りに不安がある方は以下よりお問い合わせをいただければと思います。
最後に
キーの流出事故はあとを絶ちません。キーを適切に管理し被害に合わないよう対策することをお勧めいたします。以下のブログも参考にしてください。 なお、本ブログは被害に遭われたお客様の許可を得た上で作成しております。