ちょっと話題の記事

【AWSセキュリティ】簡易侵入検知のススメ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。ブログのエントリみてればわかるとおもいますが、最近AWSのセキュリティに凝ってます。

AWSにおける権限管理について知識を深め、各所に適切な設定を行って行くのは大事なことです。これが基本です。しかし、自分が管理するAWSの各種リソースについて、何らかの意図しない変更があったことにすぐ気付ける体制は整っていますでしょうか?

仮に、アクセスキーが悪意のある第三者に漏洩し、当人がその事実に気づいていないケースを考えます。悪意の第三者は、きたる攻撃のタイミングに備え、各所にバックドアを仕込もうとするでしょう。

  • こっそりとIAMユーザを増やしているかもしれません。
  • アクセスキーが1ユーザにつき2つ作れることをいいことに、自分用のキーを追加で作成しているかもしれません。
  • IAMロールに対するIAMポリシーを書き換えているかもしれません。
  • セキュリティグループにおける許可IPアドレスを追加しているかもしれません。
  • ...

このような悪意の第三者の動きに気付けるでしょうか? 正直、目視による監査では「悪意の第三者がセキュリティグループにSSH接続許可するIPアドレスを1つ追加した」という事実に気づくのは困難ではないでしょうか。毎日見回りするわけにいきませんから…。

監査スクリプト SecConfig.py

人力で出来ないのであればスクリプト化すればいいのです。ということで、そんなスクリプトを見つけました。これはPythonで書かれた監査スクリプトです。なので、botoは必須ですのでpip等で導入しておいてください。

https://s3.amazonaws.com/reinvent2013-sec402/SecConfig.py

ヘルプはこんな感じ。

$ SecConfig.py -h
usage: SecConfig.py [-h] -a ACCESS_KEY_ID -k SECRET_ACCESS_KEY
                    [-t SECURITY_TOKEN] [-r ROLE] [-v] [-d]

outputs security configuration of an AWS account

optional arguments:
  -h, --help            show this help message and exit
  -a ACCESS_KEY_ID, --access_key_id ACCESS_KEY_ID
                        access key id
  -k SECRET_ACCESS_KEY, --secret_access_key SECRET_ACCESS_KEY
                        secret access key
  -t SECURITY_TOKEN, --security_token SECURITY_TOKEN
                        security token (for use with temporary security
                        credentials)
  -r ROLE, --role ROLE  role to assume
  -v, --verbose         enable verbose mode
  -d, --debug           enable debug mode

監査担当者のアクセスキーとシークレットキーを引数で与えればOK *1ですね。

このコマンドを実行してみると、下記のような出力が得られます。

iam:accountsummary, AccountMFAEnabled, , 1
iam:accesskey, ****username****, Active, AKIA****************
iam:useringroup, ****username****, , ****groupname****
iam:grouppolicy, ****groupname****, ***Access-cm-*******-201307031726, 08504c15956913f7a75aadc895ef2b92368826916f95027a128388e60cda61d4
iam:assumerolepolicy, ec2-poweruser, arn:aws:iam::************:role/ec2-poweruser, 06bbf2017fd2552ff3c11b4215b4e1eda06051f1384efd7511efbcc9538dac49
iam:rolepolicy, ec2-poweruser, PowerUserAccess-ec2-poweruser-201401092236, e3e0211e865b5cac2a57241edcb8aeb9d546764abba2f325b694ec840985c2ff
s3:bucketpolicy, base-logbucket-************, , 8f561c7ea33a084ba8f19e147613406ba88fd88b0316401498b1669eae2a821b
s3:bucketpolicy, cloudtrail-ap-northeast-1-************, , b5b8d799e60d8b84e606b6f16decc66fb144e17e030cadd40c9fdef41d16db00
ec2:security_group, default, IPPermissions:icmp(-1--1), default-************
ec2:security_group, default, IPPermissions:tcp(0-65535), default-************
ec2:security_group, default, IPPermissions:udp(0-65535), default-************

このように、意図せぬ変更があったら気づく必要がある項目について、テキスト形式で情報を出力してくれます。このコマンドを定期的に実行し、前回の実行結果とのdiffを確認するだけで、確認すべきポイントを洗い出すことができます。

このスクリプトで、侵入検知を定期的に行うことをお勧めします。

脚注

  1. クレデンシャルがシェルのhistoryに残る点には充分注意してください。