GitHub
AWS

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

🤔 前書き

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

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

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

 というのが気になったので、検証してみました。

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

🎉 結果

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

 じゃなく、みなさん、必ず awslabs/git-secrets を使って間違いコミットを防止しましょう。人間はミスをするものです。

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

✋ 検証手順

ソース作成

 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):
    実際の処理はどうでもいいので割愛~、インスタンス停止とかするだけです

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

 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

EC2インスタンス一覧取得できないし作成できない、うん、このキーペアはゴミクズになりましたね。

aws-cli
$ aws ec2 describe-instances
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
$ 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

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

時は来た!それだけだ…

 git push していきます、頭悪そうな README も付けてみました。検知されるまでの時間がわかりやすいよう、狙いを定めてキリの良い時間に…Push!!!

あれコマンド間違えた、んー認証通らない……なんでだろ……モタモタモタ……

:octocat: saitota/AutomateStopEC2Instances

😱 結果

 はや!トップバッターは Push から 13分 での到着、カナダの方でした!

image.png

 操作を見ると、IAM のアクセスキーを生成しようとして失敗しています。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 をクロールしているのだった!!ちょう親切!!

 また、機能制限をかけることで過度の課金がなされないよう制御をかけてくれたようです。(GPUインスタンスとか作れないのかな、未確認)まあ AWS 的にも好き放題マイニングされるとスポットインスタンス価格にも関わるし、返金になったらそれこそ損失だし、嫌でしょうねぇ。自動化されているということは日常茶飯事にこういう事態が置きているのが推し量られます。

📖 感想

 AWS が多少検知してくれるからといっても不正利用を止めてくれるわけではありません、普段からキーペアの流出などしないよう、面倒臭がらずにきちんと事前の対策をとっておきましょう。人間はミスをするものです。

 キーペアの流出防止は、先述の awslabs/git-secrets がベストプラクティスになります。そのほかルートアカウント使用しないとか、コスト通知設定とか、Trail 設定しようとか、Lambda ならキーペアじゃなくロール使いましょうなど、対策することは色々あるのです。

 なんもやってねーという方はよくまとまっている記事があるので、速攻でご確認ください。