Zabezpečení souboru MOF

Platí pro: Windows PowerShell 4.0, Windows PowerShell 5.0

DSC spravuje konfiguraci uzlů serveru použitím informací uložených v souboru MOF, kde místní Configuration Manager (LCM) implementuje požadovaný koncový stav. Vzhledem k tomu, že tento soubor obsahuje podrobnosti o konfiguraci, je důležité ho udržovat v bezpečí. Tento článek popisuje, jak zajistit, aby cílový uzel soubor zašifroval.

Počínaje PowerShellem verze 5.0 je celý soubor MOF ve výchozím nastavení šifrován, když se použije na uzel pomocí rutiny Start-DSCConfiguration . Proces popsaný v tomto článku se vyžaduje pouze při implementaci řešení pomocí protokolu služby vyžádání, pokud nejsou spravované certifikáty, aby se zajistilo, že konfigurace stažené cílovým uzlem může systém dešifrovat a přečíst před jejich použitím (například služba vyžádání, která je k dispozici ve Windows Serveru). Uzly zaregistrované v Azure Automation DSC budou mít automaticky nainstalované a spravované certifikáty službou bez nutnosti režie správy.

Poznámka

Toto téma popisuje certifikáty používané k šifrování. Pro šifrování stačí certifikát podepsaný svým držitelem, protože privátní klíč je vždy tajný a šifrování neznamená důvěryhodnost dokumentu. Certifikáty podepsané svým držitelem by se neměly používat pro účely ověřování. Pro všechny účely ověřování byste měli použít certifikát od důvěryhodné certifikační autority (CA).

Požadavky

Pokud chcete úspěšně zašifrovat přihlašovací údaje použité k zabezpečení konfigurace DSC, ujistěte se, že máte následující:

  • Některé způsoby vydávání a distribuce certifikátů. V tomto tématu a jeho příkladech se předpokládá, že používáte certifikační autoritu služby Active Directory. Další základní informace o službě Active Directory Certificate Services najdete v tématu Přehled služby Active Directory Certificate Services.
  • Přístup pro správu k cílovému uzlu nebo uzlům.
  • Každý cílový uzel má certifikát podporující šifrování uložený ve svém osobním úložišti. V Windows PowerShell je cesta k úložišti Cert:\LocalMachine\My. Příklady v tomto tématu používají šablonu ověřování pracovních stanic, kterou najdete (spolu s dalšími šablonami certifikátů) v části Výchozí šablony certifikátů.
  • Pokud budete tuto konfiguraci spouštět na jiném počítači než na cílovém uzlu, vyexportujte veřejný klíč certifikátu a potom ho naimportujte do počítače, ze něhož spustíte konfiguraci. Ujistěte se, že exportujete pouze veřejný klíč. zabezpečte privátní klíč.

Poznámka

Prostředky skriptů mají omezení, pokud jde o šifrování. Další informace najdete v tématu Prostředek skriptu.

Celkový proces

  1. Nastavte certifikáty, klíče a kryptografické otisky a ujistěte se, že každý cílový uzel má kopie certifikátu a konfigurační počítač má veřejný klíč a kryptografický otisk.
  2. Vytvořte blok konfiguračních dat, který obsahuje cestu a kryptografický otisk veřejného klíče.
  3. Vytvořte konfigurační skript, který definuje požadovanou konfiguraci cílového uzlu a nastaví dešifrování na cílových uzlech příkazem Místního configuration manageru k dešifrování konfiguračních dat pomocí certifikátu a jeho kryptografického otisku.
  4. Spusťte konfiguraci, která nastaví místní nastavení Configuration Manager a spustí konfiguraci DSC.

Tok procesu pro šifrování přihlašovacích údajů

Požadavky na certifikát

Aby bylo možné provést šifrování přihlašovacích údajů, musí být na cílovém uzlu k dispozici certifikát veřejného klíče, který je důvěryhodný počítačem používaným k vytvoření konfigurace DSC. Tento certifikát veřejného klíče má specifické požadavky, aby se dal použít pro šifrování přihlašovacích údajů DSC:

  1. Použití klíče:
    • Musí obsahovat: KeyEncipherment a DataEncipherment.
    • Neměl by obsahovat: "Digitální podpis".
  2. Rozšířené použití klíče:
    • Musí obsahovat: Šifrování dokumentu (1.3.6.1.4.1.311.80.1).
    • Nemělo by obsahovat: Ověřování klienta (1.3.6.1.5.5.7.3.2) a Ověřování serveru (1.3.6.1.5.5.7.3.1).
  3. Privátní klíč certifikátu je k dispozici na cílovém Node_.
  4. Zprostředkovatel certifikátu musí být "Microsoft RSA SChannel Cryptographic Provider".

Důležité

I když můžete použít certifikát obsahující klíč, který používá "digitální podpis" nebo jeden z ověřovacích EKU, umožní to, aby byl šifrovací klíč snadněji zneužit a zranitelnější vůči útokům. Proto je osvědčeným postupem používat certifikát vytvořený speciálně pro účely zabezpečení přihlašovacích údajů DSC, který vynechává použití klíče a EKU.

K zabezpečení přihlašovacích údajů DSC je možné použít jakýkoli existující certifikát v cílovém uzlu , který splňuje tato kritéria.

Vytvoření certifikátu

K vytvoření a použití požadovaného šifrovacího certifikátu (páru veřejného a privátního klíče) můžete použít dva přístupy.

  1. Vytvořte ho na cílovém uzlu a exportujte do uzlu vytváření jenom veřejný klíč.
  2. Vytvořte ho na uzlu vytváření a exportujte celý pár klíčů do cílového uzlu.

Metoda 1 se doporučuje, protože privátní klíč použitý k dešifrování přihlašovacích údajů v MOF zůstává vždy na cílovém uzlu.

Vytvoření certifikátu na cílovém uzlu

Privátní klíč musí být tajný, protože se používá k dešifrování MOF na cílovém uzlu Nejjednodušším způsobem, jak to udělat, je vytvořit certifikát privátního klíče na cílovém uzlu a zkopírovat certifikát veřejného klíče do počítače, který se používá k vytvoření konfigurace DSC do souboru MOF. Následující příklad:

  1. vytvoří certifikát na cílovém uzlu.
  2. exportuje certifikát veřejného klíče na cílovém uzlu.
  3. importuje certifikát veřejného klíče do úložiště certifikátů vuzlu Vytváření obsahu.

Na cílovém uzlu: Vytvoření a export certifikátu

Cílový uzel: Windows Server 2016 a 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

Po exportu DscPublicKey.cer bude potřeba soubor zkopírovat do uzlu pro vytváření obsahu.

V uzlu vytváření: importujte veřejný klíč certifikátu.

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

Vytvoření certifikátu v uzlu vytváření obsahu

Šifrovací certifikát můžete také vytvořit na uzlu vytváření, exportovat ho pomocí privátního klíče jako soubor PFX a pak importovat do cílového uzlu. Toto je aktuální metoda implementace šifrování přihlašovacích údajů DSC na Nano Serveru. I když je PFX zabezpečený heslem, měl by být během přenosu zabezpečený. Následující příklad:

  1. vytvoří certifikát v uzlu Vytváření obsahu.
  2. exportuje certifikát včetně privátního klíče na uzlu Vytváření obsahu.
  3. Odebere privátní klíč z uzlu Vytváření obsahu, ale ponechá certifikát veřejného klíče v úložišti.
  4. importuje certifikát privátního klíče do úložiště certifikátů My(Personal) na cílovém uzlu.
    • Musí být přidán do kořenového úložiště, aby byl důvěryhodný cílovým uzlem.

Na uzlu vytváření obsahu: Vytvoření a export certifikátu

Cílový uzel: Windows Server 2016 a 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

Po exportu DscPrivateKey.pfx bude potřeba soubor zkopírovat do cílového uzlu.

Na cílovém uzlu: Importujte privátní klíč certifikátu jako důvěryhodný kořenový adresář.

# 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

Konfigurační data

Blok konfiguračních dat definuje, na kterých cílových uzlech se má pracovat, jestli se mají šifrovat přihlašovací údaje, způsoby šifrování a další informace. Další informace o bloku konfiguračních dat najdete v tématu Oddělení dat konfigurace a prostředí.

Prvky, které je možné nakonfigurovat pro každý uzel, který souvisí s šifrováním přihlašovacích údajů, jsou:

  • NodeName – název cílového uzlu, pro který se konfiguruje šifrování přihlašovacích údajů.
  • PsDscAllowPlainTextPassword – jestli se tomuto uzlu můžou předávat nešifrované přihlašovací údaje. To se nedoporučuje.
  • Kryptografický otisk – kryptografický otisk certifikátu, který se použije k dešifrování přihlašovacích údajů v konfiguraci DSC na cílovém uzlu. Tento certifikát musí existovat v úložišti certifikátů místního počítače na cílovém uzlu.
  • CertificateFile – soubor certifikátu (obsahující pouze veřejný klíč), který se má použít k šifrování přihlašovacích údajů pro cílový uzel. Musí to být soubor certifikátu formátu X.509 s kódováním DER nebo X.509 s kódováním Base-64.

Tento příklad ukazuje blok konfiguračních dat, který určuje cílový uzel, který bude fungovat na pojmenovaném cílovém uzlu, cestu k souboru certifikátu veřejného klíče (s názvem targetNode.cer) a kryptografický otisk veřejného klíče.

$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"
        }
    )
}

Konfigurační skript

V samotném konfiguračním PsCredential skriptu použijte parametr k zajištění, aby se přihlašovací údaje ukládaly co nejkratší dobu. Když spustíte zadaný příklad, DSC vás vyzve k zadání přihlašovacích údajů a pak zašifruje soubor MOF pomocí CertificateFile, který je přidružený k cílovému uzlu v bloku konfiguračních dat. Tento příklad kódu zkopíruje soubor ze sdílené složky, která je zabezpečená pro uživatele.

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
        }
    }
}

Nastavení dešifrování

Než může Start-DscConfiguration fungovat, musíte místnímu Configuration Manager na každém cílovém uzlu sdělit, který certifikát se má použít k dešifrování přihlašovacích údajů, a to pomocí prostředku CertificateID k ověření kryptografického otisku certifikátu. Tato ukázková funkce najde příslušný místní certifikát (možná ho budete muset přizpůsobit, aby našla přesný certifikát, který chcete použít):

# 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
        }
    }
}

S certifikátem identifikovaným jeho kryptografickým otiskem je možné konfigurační skript aktualizovat tak, aby používal hodnotu:

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
        }
    }
}

Spuštění konfigurace

V tomto okamžiku můžete spustit konfiguraci, která vypíše dva soubory:

  • Soubor*.meta.mof , který konfiguruje místní Configuration Manager k dešifrování přihlašovacích údajů pomocí certifikátu uloženého v úložišti místního počítače a identifikovaného jeho kryptografickým otiskem. Set-DscLocalConfigurationManager použije *.meta.mof soubor .
  • Soubor MOF, který konfiguraci skutečně použije. Start-DscConfiguration použije konfiguraci.

Tyto kroky provedete těmito příkazy:

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

Tento příklad by odeslal konfiguraci DSC do cílového uzlu. Konfiguraci DSC je možné použít také pomocí serveru vyžádané replikace DSC, pokud je k dispozici.

Další informace o použití konfigurací DSC pomocí serveru vyžádané replikace DSC najdete v tématu Nastavení klienta vyžádané replikace DSC.

Příklad modulu šifrování přihlašovacích údajů

Tady je úplný příklad, který zahrnuje všechny tyto kroky a navíc pomocnou rutinu, která exportuje a kopíruje veřejné klíče:

# 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