Delen via


Het MOF-bestand beveiligen

Van toepassing op: Windows PowerShell 4.0, Windows PowerShell 5.0

DSC beheert de configuratie van serverknooppunten door gegevens toe te passen die zijn opgeslagen in een MOF-bestand, waarbij de LCM (Local Configuration Manager) de gewenste eindstatus implementeert. Omdat dit bestand de details van de configuratie bevat, is het belangrijk om het veilig te houden. In dit artikel wordt beschreven hoe u ervoor kunt zorgen dat het doelknooppunt het bestand heeft versleuteld.

Vanaf PowerShell-versie 5.0 wordt het hele MOF-bestand standaard versleuteld wanneer het wordt toegepast op het knooppunt met behulp van de Start-DSCConfiguration cmdlet. Het proces dat in dit artikel wordt beschreven, is alleen vereist bij het implementeren van een oplossing met behulp van het pull-serviceprotocol als certificaten niet worden beheerd, om ervoor te zorgen dat configuraties die door het doelknooppunt worden gedownload, kunnen worden ontsleuteld en gelezen door het systeem voordat ze worden toegepast (bijvoorbeeld de pull-service die beschikbaar is in Windows Server). Op knooppunten die zijn geregistreerd bij Azure Automation DSC, worden automatisch certificaten geïnstalleerd en beheerd door de service zonder dat er administratieve overhead nodig is.

Notitie

In dit onderwerp worden certificaten besproken die worden gebruikt voor versleuteling. Voor versleuteling is een zelfondertekend certificaat voldoende, omdat de persoonlijke sleutel altijd geheim wordt gehouden en versleuteling geen vertrouwen van het document impliceert. Zelfondertekende certificaten mogen niet worden gebruikt voor verificatiedoeleinden. U moet een certificaat van een vertrouwde certificeringsinstantie (CA) gebruiken voor verificatiedoeleinden.

Vereisten

Als u de referenties die worden gebruikt voor het beveiligen van een DSC-configuratie wilt versleutelen, moet u het volgende hebben:

  • Een aantal manieren om certificaten uit te geven en te distribueren. In dit onderwerp en de bijbehorende voorbeelden wordt ervan uitgegaan dat u active directory-certificeringsinstantie gebruikt. Zie Overzicht van Active Directory Certificate Services voor meer achtergrondinformatie over Active Directory Certificate Services.
  • Beheerderstoegang tot het doelknooppunt of de doelknooppunten.
  • Op elk doelknooppunt is een certificaat met versleutelingsfunctionaliteit opgeslagen. In Windows PowerShell is het pad naar de store Cert:\LocalMachine\My. In de voorbeelden in dit onderwerp wordt gebruikgemaakt van de sjabloon 'verificatie op werkstation', die u (samen met andere certificaatsjablonen) kunt vinden in Standaardcertificaatsjablonen.
  • Als u deze configuratie uitvoert op een andere computer dan het doelknooppunt, exporteert u de openbare sleutel van het certificaat en importeert u deze op de computer waarop u de configuratie uitvoert. Zorg ervoor dat u alleen de openbare sleutel exporteert; houd de persoonlijke sleutel veilig.

Notitie

Scriptresources hebben beperkingen als het gaat om versleuteling. Zie Scriptresource voor meer informatie

Algemeen proces

  1. Stel de certificaten, sleutels en vingerafdrukken in en zorg ervoor dat elk doelknooppunt kopieën van het certificaat heeft en dat de configuratiecomputer de openbare sleutel en vingerafdruk heeft.
  2. Maak een blok met configuratiegegevens dat het pad en de vingerafdruk van de openbare sleutel bevat.
  3. Maak een configuratiescript dat de gewenste configuratie voor het doelknooppunt definieert en de ontsleuteling op de doelknooppunten instelt door local configuration manager de opdracht te geven om de configuratiegegevens te ontsleutelen met behulp van het certificaat en de vingerafdruk.
  4. Voer de configuratie uit. Hiermee worden de instellingen voor lokale Configuration Manager ingesteld en wordt de DSC-configuratie gestart.

Processtroom voor referentieversleuteling

Certificaatvereisten

Als u referentieversleuteling wilt uitvoeren, moet er een openbaar sleutelcertificaat beschikbaar zijn op het doelknooppunt dat wordt vertrouwd door de computer die wordt gebruikt om de DSC-configuratie te maken. Dit openbare-sleutelcertificaat heeft specifieke vereisten voor gebruik voor DSC-referentieversleuteling:

  1. Sleutelgebruik:
    • Moet het volgende bevatten: 'KeyEncipherment' en 'DataEncipherment'.
    • Mag niet het volgende bevatten: 'Digitale handtekening'.
  2. Verbeterd sleutelgebruik:
    • Moet het volgende bevatten: Documentversleuteling (1.3.6.1.4.1.311.80.1).
    • Mag niet het volgende bevatten: Clientverificatie (1.3.6.1.5.5.7.3.2) en Serververificatie (1.3.6.1.5.5.7.3.1).
  3. De persoonlijke sleutel voor het certificaat is beschikbaar op de *Doel-Node_.
  4. De provider voor het certificaat moet 'Microsoft RSA SChannel Cryptographic Provider' zijn.

Belangrijk

Hoewel u een certificaat met een sleutelgebruik van 'Digitale handtekening' of een van de verificatie-EKU's kunt gebruiken, wordt de versleutelingssleutel hierdoor gemakkelijker misbruikt en kwetsbaarder voor aanvallen. Het is daarom de best practice om een certificaat te gebruiken dat speciaal is gemaakt voor het beveiligen van DSC-referenties waarmee deze sleutelgebruik en EKU's worden weggelaten.

Elk bestaand certificaat op het doelknooppunt dat aan deze criteria voldoet, kan worden gebruikt om DSC-referenties te beveiligen.

Certificaat maken

Er zijn twee benaderingen die u kunt gebruiken om het vereiste versleutelingscertificaat (openbaar-persoonlijk sleutelpaar) te maken en te gebruiken.

  1. Maak deze op het doelknooppunt en exporteer alleen de openbare sleutel naar het ontwerpknooppunt
  2. Maak het op het ontwerpknooppunt en exporteer het hele sleutelpaar naar het doelknooppunt

Methode 1 wordt aanbevolen omdat de persoonlijke sleutel die wordt gebruikt voor het ontsleutelen van referenties in de MOF te allen tijde op het doelknooppunt blijft.

Het certificaat maken op het doelknooppunt

De persoonlijke sleutel moet geheim worden gehouden, omdat wordt gebruikt om de MOF op het doelknooppunt te ontsleutelen De eenvoudigste manier om dit te doen, is door het certificaat van de persoonlijke sleutel op het doelknooppunt te maken en het certificaat van de openbare sleutel te kopiëren naar de computer die wordt gebruikt om de DSC-configuratie in een MOF-bestand te maken. Het volgende voorbeeld:

  1. maakt een certificaat op het doelknooppunt
  2. exporteert het openbare-sleutelcertificaat op het doelknooppunt.
  3. importeert het openbare-sleutelcertificaat in het mijn certificaatarchief op het knooppunt Ontwerp.

Op het doelknooppunt: het certificaat maken en exporteren

Doelknooppunt: Windows Server 2016 en Windows 10

# note: These steps need to be performed in an Administrator PowerShell session
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'DscEncryptionCert' -HashAlgorithm SHA256
# export the public key certificate
$cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force

Na het exporteren moet de DscPublicKey.cer worden gekopieerd naar het ontwerpknooppunt.

Op het ontwerpknooppunt: importeer de openbare sleutel van het certificaat

# Import to the my store
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My

Het certificaat maken op het ontwerpknooppunt

Het versleutelingscertificaat kan ook worden gemaakt op het ontwerpknooppunt, met de persoonlijke sleutel als een PFX-bestand worden geëxporteerd en vervolgens worden geïmporteerd op het doelknooppunt. Dit is de huidige methode voor het implementeren van DSC-referentieversleuteling op Nano Server. Hoewel de PFX is beveiligd met een wachtwoord, moet deze veilig worden bewaard tijdens het transport. Het volgende voorbeeld:

  1. maakt een certificaat op het knooppunt Ontwerp.
  2. exporteert het certificaat, inclusief de persoonlijke sleutel op het knooppunt Ontwerp.
  3. hiermee verwijdert u de persoonlijke sleutel uit het knooppunt Ontwerp, maar blijft het certificaat van de openbare sleutel in mijn archief.
  4. importeert het persoonlijke sleutelcertificaat in het certificaatarchief Mijn (persoonlijk) op het doelknooppunt.
    • het moet worden toegevoegd aan het hoofdarchief, zodat het wordt vertrouwd door het doelknooppunt.

Op het ontwerpknooppunt: het certificaat maken en exporteren

Doelknooppunt: Windows Server 2016 en Windows 10

# note: These steps need to be performed in an Administrator PowerShell session
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'DscEncryptionCert' -HashAlgorithm SHA256
# export the private key certificate
$mypwd = ConvertTo-SecureString -String "YOUR_PFX_PASSWD" -Force -AsPlainText
$cert | Export-PfxCertificate -FilePath "$env:temp\DscPrivateKey.pfx" -Password $mypwd -Force
# remove the private key certificate from the node but keep the public key certificate
$cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force
$cert | Remove-Item -Force
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My

Na het exporteren moet de DscPrivateKey.pfx worden gekopieerd naar het doelknooppunt.

Op het doelknooppunt: importeer de persoonlijke sleutel van het certificaat als een vertrouwde hoofdmap

# Import to the root store so that it is trusted
$mypwd = ConvertTo-SecureString -String "YOUR_PFX_PASSWD" -Force -AsPlainText
Import-PfxCertificate -FilePath "$env:temp\DscPrivateKey.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password $mypwd > $null

Configuratiegegevens

Het blok met configuratiegegevens definieert op welke doelknooppunten moet worden gewerkt, of de referenties moeten worden versleuteld, de middelen voor versleuteling en andere informatie. Zie Configuratie- en omgevingsgegevens scheiden voor meer informatie over het blok met configuratiegegevens.

De elementen die kunnen worden geconfigureerd voor elk knooppunt dat betrekking heeft op referentieversleuteling zijn:

  • NodeName : de naam van het doelknooppunt waarvoor de referentieversleuteling wordt geconfigureerd.
  • PsDscAllowPlainTextPassword : of niet-versleutelde referenties aan dit knooppunt mogen worden doorgegeven. Dit wordt niet aanbevolen.
  • Vingerafdruk : de vingerafdruk van het certificaat dat wordt gebruikt voor het ontsleutelen van de referenties in de DSC-configuratie op het doelknooppunt. Dit certificaat moet aanwezig zijn in het certificaatarchief van de lokale computer op het doelknooppunt.
  • CertificateFile : het certificaatbestand (met alleen de openbare sleutel) dat moet worden gebruikt voor het versleutelen van de referenties voor het doelknooppunt. Dit moet een met DER gecodeerd binair X.509- of Base-64 gecodeerd X.509-certificaatbestand zijn.

In dit voorbeeld ziet u een blok met configuratiegegevens dat een doelknooppunt specificeert dat moet worden uitgevoerd op de benoemde targetNode, het pad naar het openbare-sleutelcertificaatbestand (met de naam targetNode.cer) en de vingerafdruk voor de openbare sleutel.

$ConfigData = @{
    AllNodes = @(
        @{
            # The name of the node we are describing
            NodeName        = "targetNode"

            # The path to the .cer file containing the
            # public key of the Encryption Certificate
            # used to encrypt credentials for this node
            CertificateFile = "C:\publicKeys\targetNode.cer"


            # The thumbprint of the Encryption Certificate
            # used to decrypt the credentials on target node
            Thumbprint      = "AC23EA3A9E291A75757A556D0B71CBBF8C4F6FD8"
        }
    )
}

Configuratiescript

Gebruik in het configuratiescript zelf de PsCredential parameter om ervoor te zorgen dat referenties zo kort mogelijk worden opgeslagen. Wanneer u het opgegeven voorbeeld uitvoert, vraagt DSC u om referenties en versleutelt u vervolgens het MOF-bestand met behulp van het Certificaatbestand dat is gekoppeld aan het doelknooppunt in het blok met configuratiegegevens. In dit codevoorbeeld wordt een bestand gekopieerd van een share die is beveiligd naar een gebruiker.

configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\Server\share\path\file.ext"
            DestinationPath = "C:\destinationPath"
            Credential = $credential
        }
    }
}

Ontsleuteling instellen

Voordat Start-DscConfiguration kan werken, moet u de lokale Configuration Manager op elk doelknooppunt vertellen welk certificaat moet worden gebruikt om de referenties te ontsleutelen, met behulp van de CertificateID-resource om de vingerafdruk van het certificaat te controleren. Met deze voorbeeldfunctie wordt het juiste lokale certificaat gevonden (mogelijk moet u het aanpassen zodat het exacte certificaat wordt gevonden dat u wilt gebruiken):

# Get the certificate that works for encryption
function Get-LocalEncryptionCertificateThumbprint
{
    (dir Cert:\LocalMachine\my) | %{
        # Verify the certificate is for Encryption and valid
        if ($_.PrivateKey.KeyExchangeAlgorithm -and $_.Verify())
        {
            return $_.Thumbprint
        }
    }
}

Als het certificaat wordt geïdentificeerd aan de hand van de vingerafdruk, kan het configuratiescript worden bijgewerkt om de waarde te gebruiken:

configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\Server\share\path\file.ext"
            DestinationPath = "C:\destinationPath"
            Credential = $credential
        }

        LocalConfigurationManager
        {
             CertificateId = $node.Thumbprint
        }
    }
}

De configuratie uitvoeren

Op dit moment kunt u de configuratie uitvoeren, waarmee twee bestanden worden uitgevoerd:

  • Een *.meta.mof bestand dat de Lokale Configuration Manager configureert om de referenties te ontsleutelen met behulp van het certificaat dat is opgeslagen in het lokale computerarchief en wordt geïdentificeerd aan de hand van de vingerafdruk. Set-DscLocalConfigurationManager past het *.meta.mof bestand toe.
  • Een MOF-bestand waarmee de configuratie daadwerkelijk wordt toegepast. Start-DscConfiguration past de configuratie toe.

Met deze opdrachten worden deze stappen uitgevoerd:

Write-Host "Generate DSC Configuration..."
CredentialEncryptionExample -ConfigurationData $ConfigData -OutputPath .\CredentialEncryptionExample

Write-Host "Setting up LCM to decrypt credentials..."
Set-DscLocalConfigurationManager .\CredentialEncryptionExample -Verbose

Write-Host "Starting Configuration..."
Start-DscConfiguration .\CredentialEncryptionExample -wait -Verbose

In dit voorbeeld wordt de DSC-configuratie naar het doelknooppunt gepusht. De DSC-configuratie kan ook worden toegepast met behulp van een DSC-pullserver, indien beschikbaar.

Zie Een DSC-pull-client instellen voor meer informatie over het toepassen van DSC-configuraties met behulp van een DSC-pullserver.

Voorbeeld van referentieversleutelingsmodule

Hier volgt een volledig voorbeeld waarin al deze stappen zijn opgenomen, plus een helper-cmdlet waarmee de openbare sleutels worden geëxporteerd en gekopieerd:

# A simple example of using credentials
configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\server\share\file.txt"
            DestinationPath = "C:\Users\user"
            Credential = $credential
        }

        LocalConfigurationManager
        {
            CertificateId = $node.Thumbprint
        }
    }
}

# A Helper to invoke the configuration, with the correct public key
# To encrypt the configuration credentials
function Start-CredentialEncryptionExample
{
    [CmdletBinding()]
    param ($computerName)

    [string] $thumbprint = Get-EncryptionCertificate -computerName $computerName -Verbose
    Write-Verbose "using cert: $thumbprint"

    $certificatePath = join-path -Path "$env:SystemDrive\$script:publicKeyFolder" -childPath "$computername.EncryptionCertificate.cer"

    $ConfigData=    @{
        AllNodes = @(
                        @{
                            # The name of the node we are describing
                            NodeName = "$computerName"

                            # The path to the .cer file containing the
                            # public key of the Encryption Certificate
                            CertificateFile = "$certificatePath"

                            # The thumbprint of the Encryption Certificate
                            # used to decrypt the credentials
                            Thumbprint = $thumbprint
                        };
                    );
    }

    Write-Verbose "Generate DSC Configuration..."
    CredentialEncryptionExample -ConfigurationData $ConfigData -OutputPath .\CredentialEncryptionExample `
        -credential (Get-Credential -UserName "$env:USERDOMAIN\$env:USERNAME" -Message "Enter credentials for configuration")

    Write-Verbose "Setting up LCM to decrypt credentials..."
    Set-DscLocalConfigurationManager .\CredentialEncryptionExample -Verbose

    Write-Verbose "Starting Configuration..."
    Start-DscConfiguration .\CredentialEncryptionExample -wait -Verbose
}

#region HelperFunctions

# The folder name for the exported public keys
$script:publicKeyFolder = "publicKeys"

# Get the certificate that works for encryptions
function Get-EncryptionCertificate
{
    [CmdletBinding()]
    param ($computerName)

    $returnValue= Invoke-Command -ComputerName $computerName -ScriptBlock {
        $certificates = dir Cert:\LocalMachine\my

        $certificates | %{
                    # Verify the certificate is for Encryption and valid
            if ($_.PrivateKey.KeyExchangeAlgorithm -and $_.Verify())
            {
                # Create the folder to hold the exported public key
                $folder= Join-Path -Path $env:SystemDrive\ -ChildPath $using:publicKeyFolder
                if (! (Test-Path $folder))
                {
                    md $folder | Out-Null
                }

                # Export the public key to a well known location
                $certPath = Export-Certificate -Cert $_ -FilePath (Join-Path -path $folder -childPath "EncryptionCertificate.cer")

                # Return the thumbprint, and exported certificate path
                return @($_.Thumbprint,$certPath);
            }
        }
    }

    Write-Verbose "Identified and exported cert..."
    # Copy the exported certificate locally
    $destinationPath = join-path -Path "$env:SystemDrive\$script:publicKeyFolder" -childPath "$computername.EncryptionCertificate.cer"
    Copy-Item -Path (join-path -path \\$computername -childPath $returnValue[1].FullName.Replace(":","$"))  $destinationPath | Out-Null

    # Return the thumbprint
    return $returnValue[0]
}

Start-CredentialEncryptionExample