次の方法で共有


マシン構成パッケージへの署名方法

マシン構成カスタム ポリシーでは、ポリシー パッケージが変更されていないことを検証するために SHA256 ハッシュが使われます。 必要に応じて、お客様は証明書を使ってパッケージに署名し、署名されたコンテンツのみを許可するようにマシン構成拡張機能を強制することもできます。

このシナリオを有効にするには、2 つのステップを実行する必要があります。

  1. コマンドレットを実行してコンテンツ パッケージに署名します。
  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 コマンドレットを使って生成されるポリシー定義では、マシン構成拡張による要件が有効になります。