AWS Systems Manager を使って Windows サーバーへのパッチを適用

6月 24, 2018 セキュリティとコンプライアンス, MOVEit

Windows パッチは、すべての Windows 管理者にとって不幸な要件です。パッチ・チューズデーは、終わることなく巡ってきます。

Windows サーバーのパッチ適用を続けるためには、多くの人が Windows Server Update Services (WSUS) を使用しています。WSUS は無料で特に問題なく使えます。ただ、ちょっとやっかいな問題があって、それはWSUSも管理しなければならないサーバーだということです。また、通常は Active Directory に依存し、グループ・ポリシー・オブジェクト(GPO)がサーバーとしてWSUSをポイントするよう設定しなければなりません。WSUSのこれらの問題は、AWS Systems Manager を使用することでほぼ解消することができます。

AWS Systems Manager(略称SSM)は、AWSによって提供される無料のサービスで、AWS EC2インスタンスとオンプレミスノードを、軽量エージェントを使用して管理できます。パッチ適用のために、EC2インスタンスとオンプレミスノードの両方が組み込まれているため、1つのコンソールからすべてのパッチを適用できます。

このブログでは、AWS Systems Manager を Windows サーバーにセットアップして実行する方法を説明します。これを行うには、まずエージェントが既にセットアップされていることを確認する必要があります。その方法については、AWSのマニュアルを参照してください。Windows サーバーに SSM agent (←クリックすると AmazonSSMAgentSetup.exe がダウンロードされます。) をセットアップしたら、準備は完了です。

パッチベースラインの作成

最初にパッチベースラインを作成します。パッチベースラインを使用すると、サーバーにインストールするパッチの種類を設定できます。パッチのカテゴリ、重大度などによって異なる基準を設定できます。

今回は、重要な更新について7日間の遅延期間で自動承認が行われる Windows サーバーにのみ適用されるベースラインを作成します。これを PowerShell で実行しましょう。

残念ながら、これを行うための PowerShell のコードはあまり美しくありませんが、だからこそ私がここで代行しているわけです。これをコピーして実行してください。以下のコードでは Critical-Updates の名前でベースラインを作成します。

$autoApproveInDays = 7

$rule = New-Object Amazon.SimpleSystemsManagement.Model.PatchRule
$rule.ApproveAfterDays = $autoApproveInDays

$ruleFilters = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilterGroup
$patchFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter

$severityFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter
$severityFilter.Key = 'MSRC_SEVERITY'
$severityFilter.Values.Add('Critical')

$classificationFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter
$classificationFilter.Key = 'CLASSIFICATION'
$classificationFilter.Values.Add( 'CriticalUpdates' )

$ruleFilters.PatchFilters.Add($severityFilter)
$ruleFilters.PatchFilters.Add($classificationFilter)
$rule.PatchFilterGroup = $ruleFilters

New-SSMPatchBaseline -Name 'Critical-Updates' -Description 'Baseline containing all critical update' -ApprovalRules_PatchRule $rule

pb-07fadfc632e491110

マネージドインスタンスをパッチグループに追加

次に、パッチグループを作ってインスタンスをパッチグループに追加します。パッチグループを作成すると、異なるパッチを異なるインスタンスに簡単に配信できます。これを行うには、インスタンスにタグを付ける必要があります。この例では、本番環境にあるサーバーを使うことを想定しているので、Production というパッチグループにします。

まずマネージドインスタンスIDを取得する必要があります。その後、そのIDを使用してタグを割り当てます。

PS C:\Users\adam> Get-SSMInstanceInformation


ActivationId                           : 1c6f3fac-0cdd-4d9e-a32e-c7cae4231495
AgentVersion                           : 2.2.493.0
AssociationOverview                    :
AssociationStatus                      :
ComputerName                           : SRV1.WORKGROUP
IamRole                                : SSMServiceRole
InstanceId                             : mi-07fae420a558c8281
IPAddress                              : 10.0.0.9
IsLatestVersion                        : True
LastAssociationExecutionDate           : 1/1/0001 12:00:00 AM
LastPingDateTime                       : 4/27/2018 5:01:07 PM
LastSuccessfulAssociationExecutionDate : 1/1/0001 12:00:00 AM
Name                                   : SRV1
PingStatus                             : Online
PlatformName                           : Microsoft Windows Server 2016 Datacenter
PlatformType                           : Windows
PlatformVersion                        : 10.0.14393
RegistrationDate                       : 4/27/2018 4:53:27 PM
ResourceType                           : ManagedInstance



PS> $tag = New-Object Amazon.SimpleSystemsManagement.Model.Tag
>> $tag.Key = 'Patch Group'
>> $tag.Value = 'Production'
>> Add-SSMResourceTag -ResourceType 'ManagedInstance' -ResourceId 'mi-07fae420a558c8281' -Tag $tag

メンテナンスウィンドウの作成

SSM経由でパッチをインストールするには、メンテナンスウィンドウが必要です。メンテナンスウィンドウへのアクセスをコントロールするにはIAMロールを使いますが、ここでは C:.json と呼ぶ JSON ファイルを使用して PowerShell で作成します。

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

ロールを作成します。いくつかの方法がありますが、PowerShell では次のようになります。

PS C:\Users\adam> New-IAMRole -RoleName 'mw-task-role' -AssumeRolePolicyDocument (Get-Content -Raw C:\MaintenanceWindowRole.json)

Path             RoleName                           RoleId                   CreateDate             Description
----             --------                           ------                   ----------             -----------
/                mw-task-role                       AROAIBV5ZRXZCOXC535PQ    4/27/2018 4:27:14 PM

次に、New-SSMMaintenanceWindow コマンドを使用してメンテナンスウィンドウを作成します。この例では、毎週火曜日午後4時にトリガーされて4時間継続し、有効期限が切れる1時間前に新しいタスクをすべて停止するメンテナンスウィンドウを作成しています。

PS> New-SSMMaintenanceWindow -Name 'EveryTuesday' -Duration 4 -Cutoff 1 -Schedule 'cron(0 16 ? * TUE *)'

メンテナンスウィンドウにパッチグループを登録

メンテナンスウィンドウができたら、パッチグループを登録します。

## Find the maintenance window ID
PS> Get-SSMMaintenanceWindowList


Cutoff      : 1
Description :
Duration    : 4
Enabled     : True
Name        : EveryTuesday
WindowId    : mw-01d06df5638742bb4

## Build the target query
PS> $target = @{Key="tag:Patch Group";Values=@("Production")}

## Register the target
PS> Register-SSMTargetWithMaintenanceWindow -WindowId 'mw-01d06df5638742bb4' -Target $target -ResourceType INSTANCE
70c354c1-3d71-4626-9742-8d962a9ce568

メンテナンスウィンドウにインストールタスクを設定

メンテナンスウィンドウにパッチグループを登録したら、必要な更新プログラムをスキャンしてインストールするタスクをセットアップできます。

PS> $maintenanceWindowId = (Get-SSMMaintenanceWindowList | Where-Object {$_.Name -eq 'EveryTuesday'}).WindowId
PS> $windowTargetId = (Get-SSMMaintenanceWindowTarget -WindowId $maintenanceWindowId).WindowTargetId
PS> $windowRoleArn = (Get-IAMRole -RoleName mw-task-role).Arn

PS> $parameters = @{}
PS> $parameterValues = New-Object Amazon.SimpleSystemsManagement.Model.MaintenanceWindowTaskParameterValueExpression
PS> $parameterValues.Values = @("Install")
PS> $parameters.Add("Operation", $parameterValues)

PS> Register-SSMTaskWithMaintenanceWindow -WindowId $maintenanceWindowId -TaskArn 'AWS-ApplyPatchBaseline' -Target @{ Key="WindowTargetIds";Values=$windowTargetId } -TaskType "RUN_COMMAND" -TaskParameter $parameters -ServiceRoleArn $windowRoleArn -MaxConcurrency 1 -MaxError 1

4999e319-b6cd-49f3-a526-23fe08c1f1cd

まとめ

インストールタスクを設定したら、完了です! 最初は、特にAWSの経験があまりない場合は、SSMはとっつきにくい面倒なものに思えるかもしれませんが、ここに示した PowerShell コードをコピーしてペーストすることで手間暇をかけることなくスムーズに試してみていただけるのではないかと思います。

Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

Read next 何百ものサーバーからの Windows イベントログを検索する方法