Firma de los paquetes de configuración de la máquina

Las directivas personalizadas de Configuración de máquina usan un hash SHA256 para validar que el paquete de directivas no haya cambiado. Opcionalmente, los clientes también pueden usar un certificado para firmar paquetes y forzar a la extensión de configuración de máquinas a permitir solo el contenido firmado.

Para habilitar este escenario, hay dos pasos que debe completar:

  1. Ejecute el cmdlet para firmar el paquete de contenido.
  2. Anexe una etiqueta a las máquinas que deben requerir que se firme el código.

Validación de firmas mediante un certificado de firma de código

Para usar la característica de validación de firmas, ejecute el cmdlet Protect-GuestConfigurationPackage para firmar el paquete antes de publicarlo. Este cmdlet requiere un certificado de "firma de código". Si no tiene un certificado de "Firma de código", use el siguiente script para crear un certificado autofirmado con fines de prueba para seguir el ejemplo.

Validación de firma de 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

Validación de firma de 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

Parámetros del cmdlet Protect-GuestConfigurationPackage:

  • Ruta de acceso: ruta de acceso completa al paquete de configuración de máquina.
  • Certificate: certificado de firma de código para firmar el paquete. Este parámetro solo se admite cuando se firma contenido para Windows.
  • PrivateGpgKeyPath: ruta de acceso completa al archivo .gpg de clave privada. Este parámetro solo se admite cuando se firma contenido para Linux.
  • PublicGpgKeyPath: ruta de acceso completa al archivo .gpg de clave pública. Este parámetro solo se admite cuando se firma contenido para Linux.

Requisitos de certificados

El agente de configuración de máquina espera que la clave pública del certificado esté presente en "Publicador de confianza" de las máquinas Windows y en la ruta de acceso /usr/local/share/ca-certificates/gc de las máquinas Linux. Para que el nodo compruebe el contenido firmado, instale la clave pública del certificado en la máquina antes de aplicar la directiva personalizada.

Puede instalar la clave pública del certificado mediante herramientas normales dentro de la máquina virtual o mediante Azure Policy. Una plantilla de ejemplo con Azure Policy muestra cómo puede implementar una máquina con un certificado. La directiva de acceso de Key Vault debe permitir que el proveedor de recursos del proceso obtenga acceso a los certificados durante las implementaciones. Para obtener los pasos detallados, consulte Configuración de Key Vault para máquinas virtuales en Azure Resource Manager.

El siguiente es un ejemplo para exportar la clave pública de un certificado de firma, para importarla a la máquina.

$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

Requisitos de etiqueta

Una vez publicado el contenido, anexe una etiqueta con el nombre GuestConfigPolicyCertificateValidation y el valor enabled a todas las máquinas virtuales en las que se debe solicitar la firma de código. Consulte los ejemplos de etiqueta sobre cómo se pueden entregar etiquetas a escala mediante Azure Policy. Una vez que esta etiqueta esté en uso, la definición de la directiva que se genera mediante el cmdlet New-GuestConfigurationPolicy habilita el requisito a través de la extensión de configuración de máquinas.