【Patch Manager】 停止しているインスタンスに対するセキュリティパッチスキャンの実施

# 実現したいこと
一時的に利用するEC2に関して不要時には停止していますが、停止しているインスタンスはSystems Managerから管理できないため、定期的に起動するスケジュール機能と組み合わせてパッチ適用状況を確認する方法を試してみました。

# 概要
Systems ManagerのQuick Setupを利用して、定期的な起動停止とパッチスキャンの実施を設定しました。

1. 自動起動、自動停止の登録
1. Patch Managerの定期実施

# 自動起動、自動停止の登録
特定のタグが付いたインスタンスについて、指定時間による起動停止設定を実施します。

:::note warn
新規ルール登録時に起動、停止のイベントが実施されます。既設のタグを指定すると指定時間ではなくても起動、停止が実施されることがあります。
:::

## Resource Schedulerの設定
特定のタグが設定されたインスタンスを毎週火曜 01:30～02:30の間起動する。

1. AWS Systems Manager で[**Quick Setup**]を選択し、[**ライブラリ**]タブを選択します。  
1. [**Resource Scheduler**] カードで [**作成**] をクリックします。  
1. [**インスタンスタグを指定**] セクションで、スケジュールに関連付けるインスタンスに適用されるタグのキーと値を指定します。  
   Key: AutoOnOff、Value: True
1. [**スケジュールオプション**] セクションで、インスタンスを起動および停止するタイムゾーン、曜日、時刻を指定します。  
   曜日： 火曜日  
   時間： 01:30～02:30  
1. [**ターゲット**] セクションで、対象リージョンを選択します。  
   "現在のリージョン"を選択
1. [**デプロイロール**]セクションで「Quick Setup で管理されたロールを使用」を選択します
1. [**設定マネージャーの詳細**]セクションで名前を入力します。  
   "EC2-Start-Stop"で登録
1. [**Summary**]セクションのスケジュール情報を確認します。
    ```
    ・次の Key=AutoOnOff,Value=True ですべてのインスタンスをターゲットにします。スケジュールは、管理アカウントで実行されているインスタンスは対象としません。
    ・ターゲットインスタンスは、Tuesday の 01:30:00 に開始され、02:30:00 に停止されます。
    ・スケジュールのタイムゾーン: (GMT +09:00) Asia/Tokyo
    ```
1. [**Create**]を選択し起動停止のスケジュールを登録します。

## タグの登録
1. 起動停止を実施するEC2のタグに「Key: AutoOnOff、Value: True」を登録します。

# Patch Managerによるスキャンを定期実施
続いて起動したインスタンスに対してPatch ManagerによるScanを実施します。

## パッチポリシー登録
特定のタグが設定されたインスタンスに対して、毎週火曜 01:45にScanを実施する。
(先に登録した起動停止のスケジュール間にScanを実施します)

1. AWS Systems Manager で[**Quick Setup**]を選択し、[**ライブラリ**]タブを選択します。  
1. [**Patch Manager**] カードで [**作成**] をクリックします。  
1. [**パッチポリシー名**] に、パッチポリシーを識別するための名前を入力します。  
   パッチポリシー名： CheckPatch-Scan
1. [**スキャンとインストール**] セクションの [**パッチオペレーション**]で、 [**スキャン**] を指定します。  
1. インスタンスの起動停止の時間に合わせるため、[**スキャンのスケジュール**] で、[**カスタムスキャンスケジュール**] を選択します。
1. [**カスタムCRON式**]を選択し、スケジュールを「火曜 JST 01:45（月曜 GMT 16:45）」を「 cron(45 16 ? * MON *)」で登録します。
1. [**最初のCRON間隔までターゲットのスキャンを待ちます**] を[**ON**]にします。  

   :::note info
   デフォルト[**Off**]では、Patch Manager はノードがターゲットになるとすぐにスキャンします。
   :::

1.  [**パッチベースライン**] で、ターゲットをスキャンして更新するときに使用するパッチベースラインを選択します。今回は[**推奨される既定値を使用**]を選択します。
1.  [**ログストレージ**]で[**S3バケットに出力を書き込む**]を[**ON**]にして、[**S3 URL**]に保存先S3バケットを指定します。
1. [**ターゲット**] セクションで、対象リージョンを選択します。  
   "現在のリージョン"を選択
1. [**ターゲットノード**] 関連付けるインスタンスに適用されるタグのキーと値を指定します。  
   Key: CheckPatch、Value: Scan
1. [**レート制御**] で、[**同時実行数**]と[**エラーのしきい値**] を指定できます。  
    今回はデフォルトのままにします。
1. [**インスタンスプロファイルのオプション**] で[**必要なIAM ポリシーを、インスタンスにアタッチされている既存のインスタンスプロファイルに追加します**]を[**オン**]にします。

    :::note info
    オンにするとEC2にロールがない場合は、自動で作成された[AmazonSSMRoleForInstancesQuickSetup]ロールが付与され、ロールが適用済みの場合に権限が不足しているときには、IAM Policyの[AmazonSSMManagedInstanceCore]と[AWSQuickSetupPatchPolicyBaselineAccess]がロールに追加されます。
    :::

1. [**デプロイロール**]で[**Quick Setupで管理されたロールを使用**]を選択します。
1. [**設定マネージャーの詳細**]セクションで名前を入力します。  
1. [**Summary**]セクションのスケジュール情報を確認します。

    ```
    ・パッチポリシー名: CheckPatch-Scan
    ・CRON 式を使用して次の不足しているパッチをスキャンします: cron(45 16 ? * MON *)
    ・デフォルトのパッチベースラインに基づいてノードを更新する
    ・パッチオペレーションログを s3://[**バケット名**]/[**パス**]/ に保存
    ・リージョン: ap-northeast-1
    ・ノード: Key=CheckPatch,Value=Scan
    ・パッチポリシーを同時に実行するノードの数または割合: 10%
    ・パッチポリシーが失敗する前にエラーを許可するノードの数または割合: 2%
    ・Systems Manager を使用して、インスタンスの管理とパッチ適用に必要な IAM ロールをデプロイする
    ```
    
1. [**Create**]を選択しスキャンのスケジュールを登録します。

## タグの登録
1. スキャンを実施するEC2のタグに「Key: CheckPatch、Value: Scan」を登録します。

# 実行結果の確認
## Scan実施の確認
Quick SetupによるScan実施結果を確認します

1. AWS Systems Manager で[**ステートマネージャー**]を選択します。  
1. [**関連付けの名前**] で**AWS-QuickSetup-PatchPolicy-ScanForPatches-〇〇〇〇**が登録されているので、[**関連ID**]のリンクを開きます。
1. [**実行履歴**]のタブから、[**実行ID**]のリンクを開きます。
1. 実施結果が確認できます。 

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996044/c46c2cb0-d17c-4adc-8ecd-b206ef670361.png)

## パッチ適用状況確認
各インスタンスのパッチ適用状況は、フリートマネージャーの画面から確認するか、インスタンスを起動してパッチマネージャー画面から確認することができます。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996044/b5eedcdf-a62f-4254-8568-91ed624437ce.png)

# 次回
Patch ManagerでScanがされるようになりましたが、特定日時時点での適用状況の確認ができません。特定日時の状態をS3に保管する仕組みについて試してみたいと思います。

次回：
[【Step Functions】パッチ適用状況の定期取得](https://qiita.com/yiz00247/items/8e68c50ff65f0452d1b3)