SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Stack HCI 上で Marketplace の Windows Client OS を展開した際のライセンス認証について

leave a comment

プレビュー機能となりますが、Azure Stack HCI では次の 2 つの機能を使用して、Azure Marketplace で提供されている Windows Client OS のイメージ (Multi Session 対応の Windows 10 / 11) を展開することが可能です。

Windows Client OS のイメージを実際に展開すると、環境がわかるのですが、Marketplace で提供されているこれらの OS イメージでは [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform] を確認しても KMS の設定はされておらず、それ以外の方法を使用して認証が行われています。

本投稿では Azure Stack HCI 上に展開した Marketplace の Windows Client OS のライセンス認証について情報をまとめておきたいと思います。

基本的な考え方としては Windows OS のアクティブ化 の次の記載が該当します。

Windows VM は、Azure Stack HCI で使用する前にライセンス認証を行い、アクティブ化する必要があります。

マルチセッション OS VM (Windows 10、Windows 11、またはそれ以降) をアクティブ化するには、VM の作成後に VM で Azure 特典を有効にします。 ホスト コンピューターでも Azure 特典が有効になっていることを確認します。 詳細については、「Azure Stack HCI での Azure 特典」を参照してください。

注意

Azure 特典が必要な VM ごとにアクセスを手動で有効にする必要があります。

他のすべての OS イメージ (Windows Server やシングル セッション OS など) については、Azure 特典は必要ありません。 既存のアクティブ化方法を引き続き使用してください。 詳細については、Azure Stack HCI での Windows Server VM のアクティブ化に関するページを参照してください。

 

IMDS を使用したライセンス認証

結論を最初に書くと、HCI 上に展開した Marketplace の Windows Client OS では、IMDS 構成証明 (Instance Metadata Service Attestation) を使用してライセンス認証が実施されているようです。

Azure Stack HCI では、Azure 特典 (Azure Benefit) を有効にした仮想マシンでは、Azure VM のような IMDS を使用することができるようになります。

Azure 特典が有効な仮想マシンでは、「AZSHCI_HOST-IMDS_DO_NOT_MODIFY」という内部ネットワークの仮想スイッチを使用した NIC が自動的に追加されます。

image

このスイッチを使用した NIC ではクライアントの IP アドレスとしては、「169.254.0.0/16」の IP アドレスが付与され、HCI のホスト OS に割り当てられた「169.254.169.253」と通信を行うことで IMDS 構成証明済みデータの取得を行うことができます。

アクセス方法については (省略可能) VM から Azure 特典にアクセスする で解説されていますが、次のコマンドを実行することで応答を確認することができます。

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.253:80/metadata/attested/document?api-version=2018-10-01"

image

どのような情報が取得できるかについては、サンプル 1:VM が Azure で実行されていることの検証 をベースにした、次のようなスクリプトで確認できるのではないでしょうか。

# Get the signature
$attestedDoc = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET  -Uri http://169.254.169.253/metadata/attested/document?api-version=2020-09-01
# Decode the signature
$bytes = [System.Convert]::FromBase64String($attestedDoc.data)
$contentsData = [System.Text.Encoding]::Default.GetString($bytes) | ConvertFrom-Json
$contentsData

$signature = [System.Convert]::FromBase64String($contentsData.verification)


# Get certificate chain
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]($signature)
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
# Print the Subject of each certificate in the chain
foreach($element in $chain.ChainElements)
{
    Write-Host $element.Certificate.Subject
}

# Get the content of the signed document
Add-Type -AssemblyName System.Security
$signedCms = New-Object -TypeName System.Security.Cryptography.Pkcs.SignedCms
$signedCms.Decode($signature);
$content = [System.Text.Encoding]::UTF8.GetString($signedCms.ContentInfo.Content)
Write-Host "Attested data: " $content
$json = $content | ConvertFrom-Json
# Do additional validation here

 

Azure Stack HCI 上で、Marketplace の Windows Client OS のライセンス認証を実施するためには、IMDS構成証明済みデータにアクセスする必要があり、このデータにアクセスるためには、仮想マシンで Azure 特典を有効にする必要があるというのがポイントとなるかと。

 

ライセンス認証の実行トリガー

ライセンス認証がどのように実行されているかをもう少し踏み込んで確認してみました。

ライセンス認証のトリガーですが「fclip.exe」(Microsoft Windows Licensing Flexible Clip) が実行されることで、認証が行われているようです。

fclip.exe は Azure Edition の Server OS を実行している際にも使用されている (ログオンすると一瞬表示されているもの) 用で、次のような Question も出ています。

fclip.exe は、タスクスケジューラーにトリガーが設定されており「\Microsoft\Windows\Clip」に格納されている「LicenseImdsIntegration」のタスクとなります。

image

ここで fclip.exe が実行されると、IMDS 構成証明済みデータの取得を行い、slui.exe によりライセンス認証が行われているようです。

Azure の場合は、IMDS 構成証明済みデータの取得は「169.254.169.254」で行われるため、HCI 上に展開した OS に関しても「169.254.169.254」->「169.254.169.253」の順でアクセスが行われており、「169.254.169.254」にも一度アクセスしようとされているようです。

fclip.exe -> slui.exe が実行されることで Security-SPP (Software Protection Platform) により、ライセンス認証が実行されているようでした。イベントビューアーの Application から情報を確認することができます。

image

 

ライセンス認証が実行されているかどうかについては、設定のシステム -> ライセンス認証から確認することができます。

左の状態になっていればライセンス認証がされており、右の状態になっている場合は、ライセンス認証が実行されていない状態となります。

image

「LicenseImdsIntegration」のタスクはいくつかのトリガー (ユーザーのログオン / 毎日 8:00 / カスタムトリガー) で構成されており、複数のタイミングで実行が行われます。

明示的に実行する必要はないはずですが、ライセンス認証が行われていない場合は、

  • Azure 特典を有効化し、AZSHCI_HOST-IMDS_DO_NOT_MODIFY のスイッチに接続されている
  • タスクスケジューラーで LicenseImdsIntegration の実行状況を確認
    • 手動で実行する場合は、2 回ほど実行しないとだめかもしれません
  • イベントログのアプリケーションから Security-SPP のログを確認

を行うとよさそうでした。

 

Azure 仮想マシンとして起動した、Azure Edition の Server OS は IMDS ではなく、KMS で認証を行っているようなので、fclip.exe が起動する意味があるのかは疑問が残るのですが、Windows Client OS を例にして考えると fclip.exe が何のために必要なのかを理解できるかもしれませんね。

Share

Written by Masayuki.Ozawa

1月 11th, 2023 at 9:29 pm

Posted in Azure Stack HCI

Tagged with

Leave a Reply