はじめに
Amazon Inspectorは、EC2サーバの脆弱性やセキュリティ評価を自動で行えるサービスです。
例えば…。
「Instance i-xxxx is configured to allow users to log in with root credentials over SSH. This increases the likelihood of a successful brute-force attack.」
「ユーザーがrootでSSHでログインできるように設定されています。これにより、ブルートフォース攻撃が成功する可能性が高くなります。」
といったように、Inspectorが脆弱性を自動で検知・スキャンしてくれるため、サーバのセキュリティ管理の手助けとなります。
AWSは「責任共有モデル」を採用しており、AWS側は物理セキュリティ、ネットワークインフラ、コンピューティングやデータベースなど仮想インフラに責任を持ち、OSレイヤーやその上で動くアプリケーション、データなどはユーザ自身が責任をもって管理する必要が出てきます。
そこでAmazon Inspectorを導入すれば、OS内部でネットワーク、ファイル システム、プロセス、アクティビティなどのデータを収集し検知してくれます。潜在的なセキュリティ上の問題への対応を仕組み化して行えることは大きなメリットです。
サポートされているOSとリージョンは、下記の通りとなります。
- OS
- Amazon Linux (2015.03 以降)
- Ubuntu (14.04 LTS)
- Red Hat Enterprise Linux (7.2)
- CentOS (7.2)
- Windows Server 2008 R2 および Windows Server 2012
- リージョン
- 米国西部(オレゴン)
- 米国東部(バージニア北部)
- 欧州 (アイルランド)
- アジアパシフィック(東京)
EC2にエージェントをインストール
では早速、EC2インスタンスを作成し、Amazon Inspectorを設置してみましょう。
まずはいつも通りインスタンスを作成し、作成したばかりの状態のセキュリティチェックを行います。
東京リージョンで、Amazon Linux AMI 2017.03.0(HVM)を選択

Amazon Inspectorの検査対象インスタンスはタグで判別させるので、Inspector=Trueというタグを設定します。(キーと値は判別できれば何でも大丈夫です)

このインスタンスにSSHで接続し、エージェントをインストールします。
エージェントはネットワーク、ファイル システム、プロセス、アクティビティなどのOS情報を収集して、Inspectorへデータを送る役割ですね。
$ curl -O https://d1wk0tztpsntt1.cloudfront.net/linux/latest/install
$ sudo bash install
インストールは簡単、これで完了です。
インストールするだけで起動しているはずですが、基本的なコマンドは
# 確認
$ sudo /opt/aws/awsagent/bin/awsagent status
# 起動
$ sudo /etc/init.d/awsagent start
# 終了
$ sudo /etc/init.d/awsagent stop
インスタンス側でやることはこれだけです。既存の環境に影響が少ないのは良いですね。
Amazon Inspectorを設定する

まずはロールの割り当てが必要なので、「ロールの選択または作成」をクリックしてIAMロールを作成します。

評価ターゲット(チェック対象インスタンス)を特定するために、先ほど入力したタグのキーと値をここで設定します。

検査内容を指定して、評価テンプレートの定義を行います。
Amazon Inspectorではルールパッケージと呼ばれる検査項目が予め用意されているので、それを選択するだけで設定できます。
検査できる項目の詳細はそれぞれ、
CIS Operating System Security Configuration Benchmarks
http://docs.aws.amazon.com/inspector/latest/userguide/inspector_cis.html
https://learn.cisecurity.org/benchmarks
Security Best Practices
http://docs.aws.amazon.com/inspector/latest/userguide/inspector_security-best-practices.html
Common Vulnerabilities and Exposures
http://docs.aws.amazon.com/inspector/latest/userguide/inspector_cves.html
https://s3-us-west-2.amazonaws.com/rules-engine/CVEList.txt
Runtime Behavior Analysis
http://docs.aws.amazon.com/inspector/latest/userguide/inspector_runtime-behavior-analysis.html

これで評価内容が作成できました。

このまま実行してももちろん問題ありませんが、時間のかかる処理となるため、ステータスチェンジごとにSNSでメールが来るように設定しておきます。
SNSでメール通知
SNSで新しいトピックを作成して、「Edit Topic Policy」を選択します。

BasicViewで、両方の項目でOnly these AWS usersを選択して「arn:aws:iam::406045910587:root」を入力します。これはリージョンによって異なるので、利用しているリージョンのものを入力してください。
https://docs.aws.amazon.com/inspector/latest/userguide/inspector_assessments.html
- for US West (Oregon) – arn:aws:iam::758058086616:root
- for EU (Ireland) – arn:aws:iam::357557129151:root
- for US East (N. Virginia) – arn:aws:iam::316112463485:root
- for Asia Pacific (Incheon) – arn:aws:iam::526946625049:root
- for Asia Pacific (Mumbai) – arn:aws:iam::162588757376:root
- for Asia Pacific (Tokyo) – arn:aws:iam::406045910587:root
- for Asia Pacific (Sydney) – arn:aws:iam::454640832652:root

Subcriptionを作成して送信先Emailアドレスを設定しておきます。

最後にAmazon Inspectorの評価テンプレートに紐付けておけば完成です。

実行結果
さて、いよいよ実行してみましょう。
評価テンプレートの一覧から対象のテンプレートにチェックを入れて「実行」ボタンを押します。
今回の検査内容では、およそ1時間ほどEC2インスタンスからデータを収集して分析が行われ、「分析完了」のステータスになりました。

SNSで設定しておいたので、ステータスが変更になるたびにメールで通知が来ています。

起動したばかりでyum updateなども行っていないAmazon Linuxインスタンスなので、いくつかのセキュリティ上の問題が検出されています。

Highであがってきてるのは、4.9.11までのlinux kernelの脆弱性(CVE-2017-5986)ですね。
socket.c中のsctp_wait_for_sndbuf()関数にバグがあって、ローカルユーザによるassertion failureとpanicが発生する可能性という話です。
その下に、推奨事項として対応策が記載されています。

これはlinuxカーネルのバージョンアップで解消されるはずなので、対応しておきましょう。
$ sudo yum update
を行うと、この記事の時点では4.9.20-10.30.amzn1のkernelがインストールされます。
再度、Amazon Inspectorを実行すると、

いくつかの問題が解消されています。
インスタンスの脆弱性チェックがこれだけ手軽にできるのは素晴らしいですね。
CloudWatchで定期実行しておけば、よりセキュアな環境を保てると思います。
