Partager via


Guide pratique pour signer des packages de configuration de machine

Les stratégies personnalisées de configuration de machine utilisent le hachage SHA256 pour vérifier que le package de stratégie n’a pas changé. En option, les clients peuvent également utiliser un certificat pour signer des packages et forcer l’extension de configuration de machine à autoriser uniquement le contenu signé.

Pour activer ce scénario, vous devez effectuer deux étapes. Exécutez l’applet de commande pour signer le package de contenu et ajoutez une balise aux machines qui doivent nécessiter du code pour être signées.

Validation de signature à l’aide d’un certificat de signature de code

Pour utiliser la fonctionnalité de validation de signature, exécutez la cmdlet Protect-GuestConfigurationPackage pour signer le package avant sa publication. Cette cmdlet nécessite un certificat de « signature du code ». Si vous n’avez pas de certificat de « code de signature », utilisez le script suivant pour créer un certificat auto-signé à des fins de test pour suivre l’exemple.

Validation des signatures 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'
}
$mycert = New-SelfSignedCertificate @codeSigningParams

# Export the certificates
$mypwd = ConvertTo-SecureString -String "Password1234" -Force -AsPlainText
$mycert | Export-PfxCertificate -FilePath C:\demo\GCPrivateKey.pfx -Password $mypwd
$mycert | Export-Certificate -FilePath "C:\demo\GCPublicKey.cer" -Force

# Import the certificate
$importParams = @{
    FilePath          = 'C:\demo\GCPrivateKey.pfx'
    Password          = $mypwd
    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        = 'C:\demo\AuditWindowsService.zip'
    Certificate = $certToSignThePackage
    Verbose     = $true
}
Protect-GuestConfigurationPackage @protectParams

Validation des signatures Linux

# generate gpg key
gpg --gen-key

# export public key
gpg --output public.gpg --export <email-id-used-to-generate-gpg-key>

# export private key
gpg --output private.gpg --export-secret-key <email-id-used-to-generate-gpg-key>

# Sign linux policy package
Import-Module GuestConfiguration
$protectParams = @{
    Path              = './not_installed_application_linux.zip'
    PrivateGpgKeyPath = './private.gpg'
    PublicGpgKeyPath  = './public.gpg'
    Verbose           = $true
}
Protect-GuestConfigurationPackage

Paramètres de la cmdlet Protect-GuestConfigurationPackage :

  • Chemin : Chemin complet du paquet de configuration de la machine.
  • Certificat : Certificat de signature de code pour signer le package. Ce paramètre est uniquement pris en charge lors de la signature de contenu pour Windows.

Configuration requise des certificats

L'agent de configuration de la machine s'attend à ce que la clé publique du certificat soit présente dans « Serveurs de publication fiables » sur les machines Windows et dans le chemin d'accès sur les machines Linux /usr/local/share/ca-certificates/gc. Pour que le nœud vérifie le contenu signé, installez la clé publique du certificat sur la machine avant d’appliquer la stratégie personnalisée. Ce processus peut être effectué à l’aide de n’importe quelle technique à l’intérieur de la machine virtuelle ou à l’aide d’Azure Policy. Un exemple de modèle est disponible \pour déployer une machine avec un certificat. La stratégie d’accès Key Vault doit autoriser le fournisseur de ressources de calcul à accéder aux certificats lors des déploiements. Pour les étapes détaillées, consultez Configurer Key Vault pour des machines virtuelles dans Azure Resource Manager.

Voici un exemple d’exportation de la clé publique à partir d’un certificat de signature, à importer vers la machine.

$Cert = Get-ChildItem -Path cert:\LocalMachine\My |
    Where-Object { $_.Subject-eq "CN=mycert3" } |
    Select-Object -First 1
$Cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force

Exigences de balise

Une fois votre contenu publié, ajoutez une balise nommée GuestConfigPolicyCertificateValidation et avec une valeur enabled à toutes les machines virtuelles où la signature du code doit être requise. Pour plus d'informations sur la façon dont les balises peuvent être délivrées à grande échelle à l'aide d'Azure Policy, consultez les Exemples de balises. Une fois cette balise en place, la définition de stratégie générée via l’applet de commande New-GuestConfigurationPolicy met en œuvre l’exigence via l’extension de configuration de machine.