自分のAWS環境をScout2を使ってセキュリティ監査を行ってみる

2016.05.23

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

今回は、自分のAWS環境に対してセキュリティチェックを行うことができるScout2というツールを紹介したいと思います。

Scout2とは

先ほども書きましたが、Scout2はAWS環境に対するセキュリティ監査ツールです。
例えば、不要なポートがSecurityGroupでAnywhereでアクセスできる状態になっていないか、IAMユーザにMFAが導入されているか、といったことをチェックすることができます。

主な特徴

Scout2は、まだ開発途上にあるツールですが、以下のような特徴があります。

独自の監査ルール

独自に監査ルールを設定することができ、ルールセットはjson形式で作成します。
これにより自社に合ったルールでセキュリティチェックが可能です。

HTMLレポート

チェック結果をHTMLファイルに出力できます。
チェック結果の他に、AWSの各種設定も出力してくれます。

対応サービス

対応しているAWSサービスは以下の通りです。
今後のリリースで対応サービスが増えるかもしれません。

  • CloudTrail
  • EC2
  • IAM
  • RDS
  • Redshift
  • S3

Trusted Advisorとの違い

AWSネイティブのサービスとしてTrusted Advisorがありますが、Scout2は似たような機能を提供します。

大きな違いとしては、独自のチェックルールを作成できるという点かと思います。
Trusted Advisorは、チェックルールを自由にカスタマイズすることはできないので、自社のルールに合わせてチェックしたいという場合は、一考の余地がありそうです。

試してみる

早速インストールして試したいと思います。

インストール

今回は、AmazonLinuxに導入してみます。
ユーザはデフォルトのec2-userです。

$ git clone https://github.com/iSECPartners/Scout2.git
$ cd Scout2/
$ sudo pip install -r requirements.txt

チェックの実行

Scout2を実行する場合、監査対象に対して参照のIAM権限が必要です。
今回は、Scout2を実行するEC2に対してReadOnlyのIAM Roleを指定したので、下記のコマンドを実行します。

$ python Scout2.py

IAM roleが無くても、参照権限のあるIAMユーザでも実行可能です。
その場合は、下記のようにcredentialファイルを指定したオプションを利用します。
ファイルは、IAM作成時のCSVフォーマットのままで読み込めます。

$ python Scout2.py --csv-credentials <CREDENTIALS.CSV>

また、MFA認証のユーザで実行するときは下記のオプションが用意されています。

--mfa-serial <ARN_MFA_SERIAL_NUMBER> --mfa-code <MFA CODE>

HTMLレポートを見てみる

Scout2.pyを実行すると、report.htmlというファイルが作成されるので、ディレクトリの中身丸ごとWebサーバのドキュメントルートに移します。
2回目からはreport.htmlを上書きするだけで大丈夫です。

それでは実際の画面を見ていきます。
試しにMFAを導入していないIAMユーザを作った状態でチェックすると、下記のように「IAM」のページで「MFAなしのユーザが存在する」という赤色の警告が表示されます。

なお、緑色は問題なし、黄色は注意という意味合いになります。
Trusted Advisorとおおよそ同じ意味ですね。

MFA TEST

ここで表示タイトルの「User without MFA」をクリックすると詳細画面を表示できます。
画像の通り「testtest」というユーザに対してMFAの設定が「No」になっているという説明が書かれています。

MFA TEST 2

ルールの追加

デフォルトだけでも色々とチェックできて便利ですが、自社サービス用のポートなどを利用している場合、その独自ポートの開放状況もチェックしたい、といった場合があるかもしれません。

そこで、例として「19999番のポートがAnywhere公開されていたらdanger」と判定する監査項目を追加してみます。
項目名は「myapp port open」とします。

追加方法

オリジナルなルールを追加する際は、ルールを定義したjsonファイルを作成し、対応した処理をpythonの関数で定義します。
そして、HTMLレポートの雛形を修正します。

今回は、すでに雛形があるので、それを元に新ルールを追加してみます。
雛形があるので、以下の定義ファイルに新しいルールを追加するだけです。

  • Scout2/rulesets/default.json
"args": ["Telnet", "TCP", "23"]
},
{
+            "filename": "ec2-security-group-opens-plaintext-port.json",
+            "enabled": "true",
+            "args": ["myapp", "TCP", "19999"]
+        },
+        {
"filename": "ec2-security-group-opens-port-range.json",
"enabled": "true"
},
  • Scout2/rulesets/full.json
"args": ["Telnet", "TCP", "23"]
},
{
+            "filename": "ec2-security-group-opens-plaintext-port.json",
+            "enabled": "true",
+            "args": ["myapp", "TCP", "19999"]
+        },
+        {
"filename": "ec2-security-group-opens-port-range.json",
"enabled": "true"
},

ルールが追加できたら再度Scout2を実行します。
新たに出力されたHTMLファイルを更新すると以下のように、EC2の監査画面のダッシュボードにmyappの項目が出力されています。
今回は予め条件にマッチするようにSecurityGroupを設定しておいたので、チェックに引っかかって赤色になっています。

new rule

詳細を開くと、SecurityGroupで19999ポートがAnywhereアクセスになっていることが分かります。

new rule 2

最後に

いかがでしたでしょうか。
多くの場合は、Trusted Advisorで十分かと思いますが、独自のルールを追加してチェックしたいという場合など、要件に応じてうまく使い分けてもらえればと思います。

参考情報

以上になります。