AWS Lambda または crontab で Amazon Inspector によるEC2のセキュリティ脆弱性評価を定期的に自動実行する

はじめに
===

Amazon InspectorによるEC2のセキュリティ脆弱性評価について、定期的に自動実行したいケースがあるかと思います。

AWS Lambdaファンクションは「Trigges」の「CloudWatch Events - Schedule」機能を利用する事で、指定したタイミングでAWS Lambdaファンクションを自動的に実行させる事が可能です。

AWS Lambdaファンクション(Node.js) または crontab で、Amazon InspectorによるEC2のセキュリティ脆弱性評価を定期的に実行する方法を以下に記します。

参考資料
===

本手順で脆弱性評価を実行するEC2インスタンス(Amazon Linux)、AWS Lambdaファンクションは以下の手順で作成したものを利用しております。

AWS Lambda で Amazon Inspector によるEC2のセキュリティ脆弱性評価を実行する
http://qiita.com/na0AaooQ/items/9cfd66ac0e83de651f98

crontabでEC2セキュリティ脆弱性評価を定期的に実行する
===

(1) Amazon InspectorによりEC2セキュリティ脆弱性評価を実行するバッチを作成します。
---

Amazon InspectorによりEC2セキュリティ脆弱性評価を実行するバッチを作成します。

```
[ec2-user@example-server ~]$ vi /home/ec2-user/start_amazon_inspector.sh
#!/bin/bash

date

/usr/bin/aws inspector start-assessment-run --region ap-northeast-1 --assessment-template-arn "arn:aws:inspector:ap-northeast-1:XXXXXXXXXXXX:target/0-XXXXXXXX/template/X-XXXXXXXX" --assessment-run-name "`/bin/hostname`-`/bin/date '+%Y%m%d-%H%M%S'`"

date
```

```
[ec2-user@example-server ~]$ cat /home/ec2-user/start_amazon_inspector.sh
#!/bin/bash

date

/usr/bin/aws inspector start-assessment-run --region ap-northeast-1 --assessment-template-arn "arn:aws:inspector:ap-northeast-1:XXXXXXXXXXXX:target/0-XXXXXXXX/template/X-XXXXXXXX" --assessment-run-name "`/bin/hostname`-`/bin/date '+%Y%m%d-%H%M%S'`"

date
[ec2-user@example-server ~]$ 
```

(2) 作成したバッチに構文エラーない事を確認します。
---

```
[ec2-user@example-server ~]$ sh -n /home/ec2-user/start_amazon_inspector.sh
[ec2-user@example-server ~]$ 
```

(3) 作成したバッチに実行権限を設定します。
---

```
[ec2-user@example-server ~]$ chmod 755 /home/ec2-user/start_amazon_inspector.sh
[ec2-user@example-server ~]$ 
```

(4) crontabにバッチを登録し、Amazon InspectorによるEC2セキュリティ脆弱性評価を定期的に実行します。
---

```
[ec2-user@example-server ~]$ crontab -l
MAILTO=example@example.com

## Amazon Inspectorによるセキュリティ脆弱性評価を自動実行する(毎日20:10に脆弱性評価を自動実行する)
10 20 * * * /home/ec2-user/start_amazon_inspector.sh > /tmp/AmazonInspector.log 2>&1
[ec2-user@example-server ~]$ 
```

(5) 指定した時間になったら、crontabでバッチが実行されて、Amazon InspectorによるEC2セキュリティ脆弱性評価が自動的に開始される事を確認します。
---

```
[ec2-user@example-server ~]$ cat /tmp/AmazonInspector.log
Mon Nov 21 20:06:00 JST 2016
{
    "assessmentRunArn": "arn:aws:inspector:ap-northeast-1:XXXXXXXXXXXX:target/0-XXXXXXXX/template/X-XXXXXXXX/run/0-XXXXXXXX"
}
Mon Nov 21 20:06:01 JST 2016
[ec2-user@example-server ~]$ 
```

<img width="1201" alt="スクリーンショット 2016-11-21 20.12.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/4e53fae5-a82e-f874-5ce2-18fe9617193c.png">



AWS LambdaでEC2セキュリティ脆弱性評価を定期的に実行する
===

(6)「AWSマネジメントコンソール」で「Lambda」を表示します。
---

<img width="1194" alt="スクリーンショット 2016-11-21 20.21.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/7f0742c0-e331-ee7f-37ea-cc8ce9aae89d.png">

(7) Amazon InspectorによりEC2セキュリティ脆弱性評価を実行するLambdaファンクションを表示します。
---

「AWSマネジメントコンソール」->「Lambda」->「Functions」をクリックします。
Amazon InspectorによりEC2セキュリティ脆弱性評価を実行するLambdaファンクションを選択します。

<img width="1196" alt="スクリーンショット 2016-11-21 20.21.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/d91b5e65-11bc-189f-8784-dc93cc7d8491.png">

(8) Lambdaファンクションの内容が表示されます。「Code」タブをクリックして、以下のようなコードになっている事を確認します。
---

```js:example-lambda-amazon-inspector-assessment.js
'use strict';

// http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Inspector.html#startAssessmentRun-property
var AWS = require('aws-sdk')
  , inspector = new AWS.Inspector({ apiVersion: '2016-02-16' })
  ;

exports.handler = (event, context) => {

  console.log('Start Amazon Inspector AssessmentRun');

  // Add timedate to description
  var date = new Date();
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  var hour = date.getHours();
  var minutes = date.getMinutes();
  if ( day < 10 ) {
    day = '0' + day;
  }
  // UTC to JST
  hour += 9;
  if ( hour < 10 ) {
    hour = '0' + hour;
  }
  if ( minutes < 10 ) {
    minutes = '0' + minutes;
  }
  var assessmentRunDate = '-' + year.toString() + month.toString() + day.toString() + '-' + hour.toString() + minutes.toString();
    
  var params = {
    assessmentTemplateArn: 'arn:aws:inspector:ap-northeast-1:XXXXXXXXXXXX:target/0-XXXXXXXX/template/X-XXXXXXXX',
    assessmentRunName: 'example-server' + assessmentRunDate
  };

  inspector.startAssessmentRun(params, function(err, data) {
    if (err) context.done(err, err.stack);
    else context.done(null, data);
  });

};
```

(9)「Triggers」タブをクリックします。
---

<img width="1197" alt="スクリーンショット 2016-11-21 20.23.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/48dc0fe5-2f57-684f-5d51-b01b1e947cc5.png">

(10)「Triggers」タブの「Add trigger」をクリックします。
---

<img width="1198" alt="スクリーンショット 2016-11-21 20.24.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/3380b5b8-b4f9-97b6-848c-dd8d0892e2bd.png">


(11)「Add trigger」画面が表示されます。白抜き点線ボックスをクリックします。
---

<img width="1187" alt="スクリーンショット 2016-11-21 20.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/71dce43f-37e0-a683-70c5-b8c37d61d0d9.png">

(12)「CloudWatch Events - Schedule」をクリックします。
---

<img width="1188" alt="スクリーンショット 2016-11-21 20.26.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/10b31736-d8eb-1e28-0817-5901adab99c6.png">

(13)「Add trigger」画面が表示されます。Lambdaファンクションを定期的に実行する為にトリガーを作成します。作成するトリガー設定を入力して「Submit」をクリックします。
---

<img width="1179" alt="スクリーンショット 2016-11-21 20.28.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/b66f9246-d630-6b17-b2a3-5031b85dfb3d.png">

| 設定項目 | 設定例 | 備考 |
|---------|--------|------|
| Rule name | example-lambda-amazon-inspector-assessment | |
| Rule description | example-lambda-amazon-inspector-assessment | |
| Schedule expression | cron(35 11 ? * MON-FRI *) | Lambdaファンクション実行時間はUTCで指定します。JST 20:35にLambdaファンクションを実行させたい場合、左記のように指定します。|

「Enable trigger」にはチェックをつけて「Submit」をクリックします。これにより、Lambdaファンクションを定期的に実行する設定が登録されます。

<img width="1189" alt="スクリーンショット 2016-11-21 20.32.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/e36010f3-8528-294d-bdd7-e64b6bcb1466.png">


<img width="1188" alt="スクリーンショット 2016-11-21 20.33.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/3f455fa8-141b-4d6f-3414-2f96254f8a3d.png">

(14) 指定した時間になったら、AWS Lambdaファンクションが実行されて、Amazon InspectorによるEC2セキュリティ脆弱性評価が自動的に開始される事を確認します。
---

<img width="1275" alt="スクリーンショット 2016-11-21 20.38.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/1a0ffad5-218f-005d-db05-49d77dd92ea6.png">

***

AWS Lambdaやcrontabを利用する事で、Amazon InspectorによるEC2のセキュリティ脆弱性評価を定期的に実行する事が出来るので便利ですね。

以上になります。