GitHub に AWS キーペアを上げると抜かれるってほんと???

:thinking: 前書き

稀によくある 、AWS を不正利用されちゃう話ですが、

初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 - Qiita
AWSで不正利用され80000ドルの請求が来た話 - Qiita

ブコメ等で GitHub にはアクセスキーを検索するBOTがいて、公開するとすぐに抜かれる 的なコメントがつくのを何度か目にしたのですが、

  • 本当にそんな BOT が動いているの?
  • どのくらいの時間でキーを抜かれて、不正利用が始まるの?

というのが気になったので、検証してみました。
GitHub にそれっぽいパブリックリポジトリを作成、権限が一つもついてない AWS のアクセスキー&シークレットアクセスキーをうっかり公開、外部から利用されるまでの時間を計測します。

🎉 結果

本当だった。めっちゃはやい。git push から 13分 でご利用開始でした。ギフハブこわいから気をつけて!

じゃなく、みなさん、必ず git-secrets を使って間違いコミットを防止しましょう。

アクセスキーのコミットを抑止できて安全便利な awslabs/git-secrets - kakakakakku blog

その後、58分で AWS サポートより連絡 があり、GitHub のココに上がってるぞ消せー と警告されました。
なんと、GitHubをクロールしているのは、悪意のある BOT だけではなかったのです、新たな発見!!

✋ 検証手順

ソース作成

Cloudtrail を有効にした後、インスタンスを停止する Lambda ファンクションを超適当に作る。
ソースには押すなよ絶対に押すなよ方式でコメントを添えてみる。

lambda_function.py
import logging
import boto3
from boto3.session import Session

print('Loading function... ')
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# set your access key here, don't use my key!!
AWS_ACCESS_KEY = 'AKIAJTR62TDCMHIFOH3A'
# set your secret access key here!!, don't use my key!!
AWS_ACCESS_SECRET = '9Z/jzM0C+haty7f2hwroK9ADmw06wq/EcnMgrcEj'

# option
AWS_REGION = 'ap-northeast-1'
EC2_TARGET_NAME_TAG = 'StopTargetInstance'

def handler(event, context):
    実際の処理はどうでもいいので割愛~、stop instance するだけです

アクセスできないこと確認

Lambda ファンクションの動作確認テストをしたあと、IAM ポリシーをすべて外して Lambda ファンクションでエラーがでるようになること確認。
こわいので該当のキーで何もできないことも CLI でも一応確認。

S3使えない

aws-cli
$ aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

$ aws s3 ls s3://s3-ap-northeast-1.amazo
naws.com/SOMEBUCKET/
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

インスタンス一覧取得できない

aws-cli
$ aws ec2 describe-instances
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

インスタンス作成できない

aws-cli
$ aws ec2 run-instances --image-id ami-XXXXXXXX --security-group-ids sg-XXXXXXXX --count 1 --instance-type t2.nano --
key-name SOMEKEYPAIR --query 'Instances[0].InstanceId'
An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: xxx

CloudTrail に Deny ログも出てます。
検索条件:{ $.errorCode = "AccessDenied" }
image.png

よし。露出プレイの準備はできたぞ。

時は来た!それだけだ!

Push していきます、頭悪そうな README も付けてみました。
検知されるまでの時間が大事なので、狙いを定めてキリの良い時間に・・・Push!!!
あれ認証通らないなんでd・・・モタモタモタ・・・

:octocat: saitota/AutomateStopEC2Instances

😱 結果

はや!トップバッターは Push から 13分 での到着、カナダの方でした!
image.png
操作を見ると、アクセスキーを生成しようとして失敗しています。boto3 を使っているので一連の操作は自動化されているんでしょう。
確かに、全リージョンで上限までマイニング用インスタンスで埋める為には、他人より先に鮮度の良いキーを手に入れないとだめですからねー。
カナダの方、一着おめでとうございまーす。

続いて以下、ランキングです。

  • 2位 14分 アメリカの方、ec2インスタンス一覧を取得しようとしました!
  • 3位 38分 ニュージーランドの方、S3バケット一覧を取得しようとしました!
  • 4位 45分 ニュージーランドの方(別のIP)、アクセスキーを生成しようとしました!
  • 5位 58分 AWSの方

!?

なんと、サポートチケットが切られてメールが届きました。

AWSSupportCase
Dear AWS Customer,
Your AWS Account is compromised! Please review the following notice and take immediate action to secure your account.

(意訳)
あんたのキーペア GitHub に上がってんで!
はよ消して、IAM見直せ!
インスタンス知らないのあったら止めろ!はよやれ!
https://github.com/saitota/AutomateStopEC2Instances/ ~~~

(以下対応するべきことががいっぱい書かれてる)

おお、リポジトリまで把握してるよこの子!
実は AWS も GitHub をクロールしているのだった!!!
ちょう親切!!

📖 感想

AWS が検知してくれるからといっても不正利用を止めてくれるわけではないので、
普段からキーペアの流出などしないよう、面倒臭がらずに必ずきちんと対策をとりましょう。
キーペアの流出防止は、awslabs/git-secrets がベストプラクティスです。
そのほかルートアカウント使用しないとか、コストエクスプローラで通知設定など、基礎のキですよ!
なんもやってねーという方はよくまとまっている記事があるので、速攻でご参照ください。

AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ - Qiita

3contribution

単なる日記にとどまらない危険度が伝わる記事だと思います。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.