Windows のパッチは誰にとってもうんざりさせられる要件です。セキュリティ脆弱性やバグ修正情報に関する更新プログラムを配信するパッチ・チューズデーは、毎月やって来ます。 Windows サーバーにパッチを適用するには、Windows Server Update Services(WSUS)を使用することが多いと思います。これは無料で、ほとんどのケースでうまく機能しますが、問題は、これも、管理する必要があるもう1つのサーバーであるということです。サーバーを WSUS に向けるように設定するには、たいていは Active Directory や GPO も関与してきます。AWS>/a> の Systems Manager を使用すると、WSUS の使用に関連する問題への対処がしやすくなります。
SSM と略称されることも多い AWS Systems Manager は、AWS が提供する無料のサービスであり、軽量のエージェントを介して AWS EC2 インスタンスとオンプレミスノードを管理できます。EC2 ノードとオンプレミスノードの両方を統合できるので、1つのコンソールですべてのパッチを適用できます。
このブログでは、Windows サーバーでパッチ適用をセットアップして実行する方法について説明します。そのためには、まずエージェントがセットアップ済みであることを確認する必要があります。エージェントのセットアップ方法については、AWS のドキュメントを参照してください。Windows サーバーに SSM agent をセットアップしたら、パッチ適用を設定するための準備は終了です。
パッチベースラインの作成
まず、パッチベースラインを作成します。パッチベースラインを使用すると、サーバーにインストールするパッチの種類を設定でき、様々なパッチに関してカテゴリや重大度などに応じて異なる基準を設定できます。
ここでは、2日間の自動承認を受ける重要な更新に限って、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
パッチグループへのマネージドインスタンスの追加
次に、パッチグループを作成してインスタンスを追加します。パッチグループを作成すると、各種の異なるパッチを様々なインスタンスに簡単に配信できます。パッチグループを使用するには、インスタンスにタグを付ける必要があります。この例では、プロダクション環境にあるサーバーを想定して、Production というパッチグループにタグを割り当てます。
最初にマネージドインスタンスIDを取得する必要があり、それを使用してタグを割り当てることができます。
PS> 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 ロールが必要なので、以下の JSON ファイル (C:/MaintenaceWindowRole.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> New-IAMRole -RoleName 'mw-task-role' -AssumeRolePolicyDocument (Get-Content -Raw C:\MaintenanceWindowRole.json)
次に、New-SSMMaintenanceWindow コマンドを使用して、メンテナンスウィンドウを作成します。下のようにすると、毎週火曜日の午後4時にトリガーされ、期限切れになる1時間前に新しいタスクをすべて遮断する、4時間のメンテナンスウィンドウが作成できます。
PS> New-SSMMaintenanceWindow -Name 'EveryTuesday' -Duration 4 -Cutoff 1 -Schedule 'cron(0 16 ? * TUE *)'
メンテナンスウィンドウにパッチグループを登録
メンテナンスウィンドウを作成したら、パッチグループを登録します。
PS> Get-SSMMaintenanceWindowList
Cutoff : 1
Description :
Duration : 4
>Enabled : True
Name : EveryTuesday
WindowId : mw-01d06df5638742bb4
PS> $target = @{Key="tag:Patch Group";Values=@("Production")}
メンテナンスウィンドウでインストールタスクを設定
メンテナンスウィンドウにパッチグループを登録したら、必要な更新をスキャンしてインストールするタスクを設定できます。
$maintenanceWindowId = (Get-SSMMaintenanceWindowList | Where-Object {$_.Name -eq 'EveryTuesday'}).WindowId
$windowTargetId = (Get-SSMMaintenanceWindowTarget -WindowId $maintenanceWindowId).WindowTargetId
$windowRoleArn = (Get-IAMRole -RoleName mw-task-role).Arn
$parameters = @{}
$parameterValues = New-Object Amazon.SimpleSystemsManagement.Model.MaintenanceWindowTaskParameterValueExpression
$parameterValues.Values = @("Install")
$parameters.Add("Operation", $parameterValues)
Register-SSMTaskWithMaintenanceWindow -WindowId $maintenanceWindowId -TaskArn 'AWS-ApplyPatchBaseline' -Target @{ Key="WindowTargetIds";Values=$windowTargetId } -TaskType "RUN_COMMAND" -TaskParameter $parameters -ServiceRoleArn $windowRoleArn -MaxConcurrency 1 -MaxError 1
まとめ
インストールタスクを設定したら、完了です。AWS にあまり慣れていないと、SSM は難しそうで躊躇してしまうかもしれませんが、このブログの PowerShell コードを部分的にコピーして利用すれば、すぐに始められるのではないかと思います。