マシン構成パッケージへの署名方法
マシン構成カスタム ポリシーでは、ポリシー パッケージが変更されていないことを検証するために SHA256 ハッシュが使われます。 必要に応じて、お客様は証明書を使ってパッケージに署名し、署名されたコンテンツのみを許可するようにマシン構成拡張機能を強制することもできます。
このシナリオを有効にするには、2 つのステップを実行する必要があります。
- コマンドレットを実行してコンテンツ パッケージに署名します。
- コードへの署名を要求する必要があるマシンにタグを追加します。
コード署名証明書を使用した署名の検証
署名検証機能を使用するには、Protect-GuestConfigurationPackage
コマンドレットを実行して、発行前にパッケージに署名します。 このコマンドレットには "コード署名" 証明書が必要です。 "コード署名" 証明書がない場合は、次のスクリプトを使用して、テスト目的で自己署名証明書を作成し、その例に従ってください。
Windows の署名の検証
# How to create a self sign cert and use it to sign Machine Configuration
# custom policy package
# Create Code signing cert
$codeSigningParams = @{
Type = 'CodeSigningCert'
DnsName = 'GCEncryptionCertificate'
HashAlgorithm = 'SHA256'
}
$certificate = New-SelfSignedCertificate @codeSigningParams
# Export the certificates
$privateKey = @{
Cert = $certificate
Password = Read-Host "Enter password for private key" -AsSecureString
FilePath = '<full-path-to-export-private-key-pfx-file>'
}
$publicKey = @{
Cert = $certificate
FilePath = '<full-path-to-export-public-key-cer-file>'
Force = $true
}
Export-PfxCertificate @privateKey
Export-Certificate @publicKey
# Import the certificate
$importParams = @{
FilePath = $privateKey.FilePath
Password = $privateKey.Password
CertStoreLocation = 'Cert:\LocalMachine\My'
}
Import-PfxCertificate @importParams
# Sign the policy package
$certToSignThePackage = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Subject -eq "CN=GCEncryptionCertificate" }
$protectParams = @{
Path = '<path-to-package-to-sign>'
Certificate = $certToSignThePackage
Verbose = $true
}
Protect-GuestConfigurationPackage @protectParams
Linux の署名の検証
# generate gpg key
gpg --gen-key
$emailAddress = '<email-id-used-to-generate-gpg-key>'
$publicGpgKeyPath = '<full-path-to-export-public-key-gpg-file>'
$privateGpgKeyPath = '<full-path-to-export-private-key-gpg-file>'
# export public key
gpg --output $publicGpgKeyPath --export $emailAddress
# export private key
gpg --output $privateGpgKeyPath --export-secret-key $emailAddress
# Sign linux policy package
Import-Module GuestConfiguration
$protectParams = @{
Path = '<path-to-package-to-sign>'
PrivateGpgKeyPath = $privateGpgKeyPath
PublicGpgKeyPath = $publicGpgKeyPath
Verbose = $true
}
Protect-GuestConfigurationPackage
Protect-GuestConfigurationPackage
コマンドレットのパラメーター:
- Path: マシン構成パッケージへの完全なパス。
- Certificate: パッケージに署名するためのコード署名証明書。 このパラメーターは、Windows 用のコンテンツに署名する場合にのみサポートされます。
- PrivateGpgKeyPath: 秘密キーの
.gpg
ファイルへの完全なパス。 このパラメーターは、Linux 用のコンテンツに署名する場合にのみサポートされます。 - PublicGpgKeyPath: 公開キーの
.gpg
ファイルへの完全なパス。 このパラメーターは、Linux 用のコンテンツに署名する場合にのみサポートされます。
証明書の要件
マシンの構成エージェントにより、Windows マシンの場合は "信頼された発行元" に、Linux マシンの場合はパス /usr/local/share/ca-certificates/gc
に、証明書の公開キーが存在していることが求められます。 署名されたコンテンツをノードで検証するには、カスタム ポリシーを適用する前に、マシンに証明書の公開キーをインストールします。
証明書の公開キーは、VM 内で通常のツールを使って、または Azure Policy を使ってインストールできます。 Azure Policy を使用するテンプレートの例では、証明書を使ってマシンをデプロイする方法が示されています。 Key Vault のアクセス ポリシーでは、デプロイ中にコンピューティング リソース プロバイダーが証明書にアクセスできるようにする必要があります。 詳しい手順については、Azure Resource Manager の仮想マシンの Key Vault を設定するに関する記事をご覧ください。
署名証明書から公開キーをエクスポートしてマシンにインポートする例を次に示します。
$Cert = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Subject-eq 'CN=<CN-of-your-signing-certificate>' } |
Select-Object -First 1
$Cert | Export-Certificate -FilePath '<path-to-export-public-key-cer-file>' -Force
タグの要件
コンテンツを発行した後、コード署名が必要なすべての仮想マシンに、名前が GuestConfigPolicyCertificateValidation
で値が enabled
のタグを追加します。 Azure Policy を使用して大規模にタグを配信する方法については、タグのサンプルに関する記事を参照してください。 このタグを配置すると、New-GuestConfigurationPolicy
コマンドレットを使って生成されるポリシー定義では、マシン構成拡張による要件が有効になります。
関連するコンテンツ
GuestConfiguration
モジュールを使用して、環境を大規模に管理するための Azure Policy の定義を作成する。- Azure portal を使用してカスタム ポリシー定義を割り当てる。
- マシン構成のポリシー割り当てのコンプライアンスの詳細を確認する方法を学ぶ。