AWS Patch Managerの備忘録

Systems Manager内の機能の1つである Patch Manager についての備忘録。

Patch Managerは、EC2やオンプレのOSのパッチを、SSM Agent経由でUpdateしてくれるサービスです。現時点でサポートされているOSは下記より。随時更新されています。

サポートされるオペレーティングシステム

AWS公式の紹介ブログを参考に、Windows向けの設定を実施してみます。

Patching your Windows EC2 instances using AWS Systems Manager Patch Manager

概念図

理解した限りの概念図。

f:id:goodbyegangster:20190725203229p:plain

S3バケットの作成

パッチUpdate実行結果のログをS3に出力するため、S3バケットを事前に用意しておきます。

SNS topicの作成

パッチUpdate実行の通知を行いため、そのためのSNS topicを事前に用意しておきます。

実行用IAM Roleの作成

上記で作成したSNS topicをPublishするためのIAM Roleを用意しておきます。以下内容でIAM Roleを作成します。

付与するポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "*"
        }
    ]
}

付与する信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Patch Baselineの作成

Patch Baseline とは、UpdateされるOSパッチ情報を定義したものになります。どんなClassificationの、どんなSeverityをUpdateするのか定義してあげます。

各OSごとに、DefaultとなるPatch Baselineが用意されていますが、通常の運用時ですと、事前定義されたPatch Baselineでは不足している場合が多いため、新規でPatch Baselineを作成してあげることになります。

Windows向け AWS-WindowsPredefinedPatchBaseline-OS の事前定義のPatch Baselineでは、以下の定義となっています。尚、WindowsOSのパッチにのみ適用され、MS Applicationのパッチは全て無視されます。

OS/Application Product Classification Severity
Windows * CriticalUpdates
SecurityUpdates
Critical
Important

事前定義されたパッチベースラインについて

Windows Updateの各Classification、Severityの情報は下記となります。

Classficationについて

重要な更新: 重要でセキュリティに関係しない不具合に対応する特定の問題に対して一般にリリースされた修正プログラムを指定します。

定義ファイルの更新: 製品の定義データベースに追加される、頻繁に一般に公開されるソフトウェア更新プログラムを指定します。

Feature Pack: 製品リリースに先立って最初に配布され、通常は次回の製品版リリースに含まれる、製品の新機能を指定します。

セキュリティ更新プログラム: 製品固有でセキュリティに関係する脆弱性に対して、一般にリリースされた修正を指定します。

Service Pack: 製品に適用されるすべての修正プログラム、セキュリティ更新プログラム、重要な更新プログラム、および更新プログラムを累積したテスト済みのセットを指定します。 さらに、Service Pack には、製品のリリース以降に内部で見つかった問題に対する追加の修正プログラムが含まれる場合もあります。

ツール: 1 つまたは複数のタスクを完了するためのユーティリティまたは機能を示します。

更新プログラムのロールアップ: 修正プログラム、セキュリティ更新プログラム、重要な更新プログラム、他の更新プログラムを展開しやすいようにパッケージにしたテスト済みのセットを指定します。 更新プログラムのロールアップは、通常、セキュリティまたは製品コンポーネントなど特定の領域に対応します。

更新プログラム: 特定の問題に対して一般にリリースされた修正プログラムを指定します。 更新プログラムは、重大ではない非セキュリティ関連のバグに対処します。

アップグレード: Windows 10 の機能のアップグレードを指定します。 ソフトウェアの更新ポイントとサイトは最低限 WSUS 4.0 と 修正プログラム 3095113 を実行して、アップグレードの分類を取得する必要があります。

Microsoft Docs - 同期する分類と製品の構成

Severityについて

下記に記載しているものは「セキュリティ更新プラグラム」に関するSeverityですが、各Severityの雰囲気はつかめるかと。

Critical - The update fixes a vulnerability whose exploitation could allow for the propagation of an Internet worm without user action.

Important - The update fixes a vulnerability whose exploitation could result in the compromise of the confidentiality, integrity, or availability of users' data, or of the integrity or availability of processing resources.

Low - The update fixes a vulnerability whose exploitation is extremely difficult, or whose impact is minimal.

Moderate - The update fixes a vulnerability whose exploitation is mitigated to a significant degree by factors such as default configuration, auditing, or difficulty of exploitation.

Unspecified - The update does not have a severity rating.

Microsoft TechNet - Windows Update categories

今回は、以下の定義のPatch Baselineを作成します。

OS/Application Product Classification Severity
Windows All CriticalUpdates
DifinitionUpdate
SecurityUpdates
Updates
All
MS Application Office(All) CriticalUpdates
DifinitionUpdate
SecurityUpdates
tools
Updates
All

上記の内容に合わせたJSON定義ファイルを作成して、CLIから --cli-input-json オプションにて流し込みます。JSONファイルは下記。

{
  "OperatingSystem": "WINDOWS",
  "Name": "Custom-WindowsPatchBaseline-OS-Applications",
  "ApprovalRules": {
    "PatchRules": [
      {
        "PatchFilterGroup": {
          "PatchFilters": [
            {
              "Key": "PATCH_SET",
              "Values": [
                "OS"
              ]
            },
            {
              "Key": "PRODUCT",
              "Values": [
                "*"
              ]
            },
            {
              "Key": "CLASSIFICATION",
              "Values": [
                "CriticalUpdates",
                "DefinitionUpdates",
                "SecurityUpdates",
                "Updates"
              ]
            },
            {
              "Key": "MSRC_SEVERITY",
              "Values": [
                "*"
              ]
            }
          ]
        },
        "ComplianceLevel": "UNSPECIFIED",
        "ApproveAfterDays": 7,
        "EnableNonSecurity": false
      },
      {
        "PatchFilterGroup": {
          "PatchFilters": [
            {
              "Key": "PATCH_SET",
              "Values": [
                "APPLICATION"
              ]
            },
            {
              "Key": "PRODUCT_FAMILY",
              "Values": [
                "Office"
              ]
            },
            {
              "Key": "PRODUCT",
              "Values": [
                "*"
              ]
            },
            {
              "Key": "CLASSIFICATION",
              "Values": [
                "CriticalUpdates",
                "DefinitionUpdates",
                "SecurityUpdates",
                "Tools",
                "Updates"
              ]
            },
            {
              "Key": "MSRC_SEVERITY",
              "Values": [
                "*"
              ]
            }
          ]
        },
        "ComplianceLevel": "UNSPECIFIED",
        "ApproveAfterDays": 7,
        "EnableNonSecurity": false
      }
    ]
  },
  "ApprovedPatches": [],
  "ApprovedPatchesComplianceLevel": "UNSPECIFIED",
  "ApprovedPatchesEnableNonSecurity": false,
  "RejectedPatches": [],
  "RejectedPatchesAction": "ALLOW_AS_DEPENDENCY",
  "Description": "sample",
  "Sources": [],
  "Tags": [
    {
      "Key": "system",
      "Value": "sample"
    }
  ]
}

AWS CLIコマンドは下記。Patch Baselineが作成されます。

> aws ssm create-patch-baseline --cli-input-json file://(作成したjsonファイル)

AWS CLI - create-patch-baseline

パラメータ ApproveAfterDays について。

Auto approval delay: The number of days to wait after a patch is released before a patch is automatically approved. You can enter any integer from zero (0) to 100.

パラメータ ComplianceLevel について。

Compliance level: The severity level you want to assign to patches approved by the baseline, such as High.

Note: If an approved patch is reported as missing, the option you choose in Compliance level, such as Critical or Medium, determines the severity of the compliance violation.

Patch Groupの設定

Patch Group とは、Patch BaselineとUpdate対象のEC2を紐付けるための機能となります。EC2側でPatch Groupを指定していない場合、各OSごとにDefaultで設定されているPatch Baselineが利用されることになります。初期時、DefaultとなるPatch Baselineは、事前定義されたPatch Baselineに与えられています。

新規作成したPatch BaselineをDefualtに変更することもできるのですが、今回は「Dev」というPatch Groupを用意して、Patch BaselineとEC2を紐付けます。

Patch Baseline側の設定

作成したPatch Baselineを指定して、以下コマンドを実行します。

> aws ssm register-patch-baseline-for-patch-group ^
--baseline-id pb-xxxxxxxxxxxxxxx ^
--patch-group "Dev"

AWS CLI - register-patch-baseline-for-patch-group

EC2側の設定

対象となるEC2インスタンスのタグに、以下を付与します。

Key Value
Patch Group Dev

この時、タグKeyは必ず Patch Group とする必要があります。

Maintenance Windowsの設定

パッチをUpdateするためのMaintenace Windowを設定します。Patch ManagerのPatch Update処理とは、結局SSM RunCommandの AWS-RunPatchBaseline ドキュメントを実行している処理となるのですが、Maintenace Windowとは、そのRunCommandを実行するためのスケジューリング設定みたいなものになります。

Maintenance Windowの作成

create-maintenance-window コマンドを利用して、Update処理をしたいスケジュールを登録します。

> aws ssm create-maintenance-window ^
--name "Patch_Windows_Dev" ^
--description "sample" ^
--schedule "cron(0 22 ? * Sat *)" ^
--schedule-timezone "Asia/Tokyo" ^
--duration 4 ^
--cutoff 1 ^
--no-allow-unassociated-targets ^
--tags Key=OS,Value=Windows

AWS CLI - create-maintenance-window

Targetの登録

上で作成したMaintenace Windowに対して、実行対象となるEC2を register-target-with-maintenance-window コマンドで登録します。

> aws ssm register-target-with-maintenance-window ^
--window-id mw-XXXXXXXXXXXXXX ^
--resource-type "INSTANCE" ^
--targets "Key=tag:Patch Group,Values=Dev" ^
--name "PatchGroup-Dev" ^
--description "sample" ^
--owner-information "PatchManager-Windows-Dev"

上の例では、Targetを指定する方法として Patch Group のタグKeyを利用していますが、これは本Maintenace Windowの対象とするEC2を指定するための情報となるので、EC2に付与されている他のタグKeyを利用することもできます。Patch Baselineに指定した Patch Group タグとは無関係のものになります。

register-target-with-maintenance-window

Taskの登録

上で作成したMaintenace Windowに対して、実行するタスク(Patch Managerの場合は、SSM RunCommandの AWS-RunPatchBaseline ドキュメント)を、 register-task-with-maintenance-window コマンドで登録します。指定するパラメータが多いため、jsonファイルを用意して、cli-inut-jsonで流し込みます。

{
  "TaskType": "RUN_COMMAND",
  "WindowId": "mw-xxxxxxxxxxxxxx",
  "Description": "sample",
  "MaxConcurrency": "50",
  "MaxErrors": "0",
  "Name": "task-win-update-dev",
  "Priority": 1,
  "Targets": [
    {
      "Key": "WindowTargetIds",
      "Values": ["xxxxxxx-ee52-47a8-b960-xxxxxxxxxxxxxx"]
    }
  ],
  "TaskArn": "AWS-RunPatchBaseline",
  "TaskInvocationParameters": {
    "RunCommand": {
      "Parameters": {
        "Operation": ["Install"],
        "SnapshotId": ["{{WINDOW_EXECUTION_ID}}"]
      },
      "OutputS3BucketName": "ssm-patchmanager-log",
      "OutputS3KeyPrefix": "win-update/",
      "NotificationConfig": {
        "NotificationArn": "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:update-message",
        "NotificationEvents": ["Success","TimedOut","Cancelled","Failed"],
        "NotificationType": "Invocation"
      },
      "ServiceRoleArn": "arn:aws:iam::xxxxxxxxxxxxxxx:role/RolePatchManagerSNS"
    }
  }
}

コマンドを実行。

> aws ssm register-task-with-maintenance-window --cli-input-json file://(作成したjsonファイル)

AWS CLI - register-task-with-maintenance-window

尚、PatchManagerのコンソールからも、これらMaintenace Windowの一連の設定をしてくれるページがあるのですが、そのページからはログ出力設定やSNS設定を実施できないため、本手順のようにCLIから実施するか、Maintenace Windowsのページから直接設定をすることをお勧めします。


必要な設定は以上です。Maintenance Windowで設定した時刻になると、Windows Updateが行われます。パッチ適用がされた場合、SSM AgentによりEC2のOS再起動がされるので、その点は注意。

もろもろの確認

利用されたPatch Baselineや実際にUpdateされたパッチは、ログに出力さているので、それを見れば確認できます。

また、SystemManagerのComplianceというページでは、各インスタンス単位での現在のパッチ適用状況を表示してくれるため、それを見ることでも確認できます。