Az MOF-fájl biztonságossá tétele

A következőkre vonatkozik: Windows PowerShell 4.0, Windows PowerShell 5.0

A DSC egy MOF-fájlban tárolt információk alkalmazásával kezeli a kiszolgálócsomópontok konfigurációját, ahol a Helyi Configuration Manager (LCM) a kívánt befejezési állapotot valósítja meg. Mivel ez a fájl tartalmazza a konfiguráció részleteit, fontos, hogy biztonságos legyen. Ez a cikk azt ismerteti, hogyan biztosítható, hogy a célcsomópont titkosította a fájlt.

A PowerShell 5.0-s verziójától kezdve a rendszer alapértelmezés szerint a teljes MOF-fájlt titkosítja, amikor a parancsmaggal alkalmazza a Start-DSCConfiguration csomópontra. Az ebben a cikkben leírt folyamat csak akkor szükséges, ha a lekéréses szolgáltatás protokollját használva implementál egy megoldást, ha a tanúsítványokat nem kezelik, annak érdekében, hogy a célcsomópont által letöltött konfigurációk visszafejthetők és olvashatók legyenek a rendszer számára az alkalmazás előtt (például a Windows Serverben elérhető lekéréses szolgáltatás). A Azure Automation DSC-ben regisztrált csomópontokon a szolgáltatás automatikusan telepíti és felügyeli a tanúsítványokat, és nincs szükség rendszergazdai többletterhelésre.

Megjegyzés

Ez a témakör a titkosításhoz használt tanúsítványokat ismerteti. A titkosításhoz elegendő az önaláírt tanúsítvány, mert a titkos kulcs mindig titkos, és a titkosítás nem jelenti a dokumentum megbízhatóságát. Az önaláírt tanúsítványok nem használhatók hitelesítési célokra. A hitelesítéshez megbízható hitelesítésszolgáltatótól származó tanúsítványt kell használnia.

Előfeltételek

A DSC-konfiguráció biztonságossá tételéhez használt hitelesítő adatok sikeres titkosításához győződjön meg arról, hogy rendelkezik a következővel:

  • A tanúsítványok kiadásának és terjesztésének néhány módja. Ez a témakör és a példák feltételezik, hogy Az Active Directory hitelesítésszolgáltatót használja. Az Active Directory tanúsítványszolgáltatásokkal kapcsolatos további háttérinformációkért lásd: Active Directory tanúsítványszolgáltatások áttekintése.
  • Rendszergazdai hozzáférés a célcsomóponthoz vagy csomópontokhoz.
  • Minden célcsomópont rendelkezik egy titkosításra képes tanúsítvánnyal, amely mentette a személyes tárolóját. A Windows PowerShell az áruház elérési útja a Cert:\LocalMachine\My. A jelen témakörben szereplő példák a "munkaállomás-hitelesítés" sablont használják, amelyet (más tanúsítványsablonokkal együtt) az Alapértelmezett tanúsítványsablonok területen talál.
  • Ha ezt a konfigurációt a célcsomóponttól eltérő számítógépen fogja futtatni, exportálja a tanúsítvány nyilvános kulcsát, majd importálja azt arra a számítógépre, amelyről a konfigurációt futtatni fogja. Győződjön meg arról, hogy csak a nyilvános kulcsot exportálja; tartsa biztonságban a titkos kulcsot.

Megjegyzés

A szkripterőforrásoknak a titkosításra vonatkozó korlátozások vannak érvényben. További információ: Szkripterőforrás

Teljes folyamat

  1. Állítsa be a tanúsítványokat, kulcsokat és ujjlenyomatokat, és győződjön meg arról, hogy minden célcsomópont rendelkezik a tanúsítvány másolatával, és a konfigurációs számítógép rendelkezik a nyilvános kulccsal és ujjlenyomattal.
  2. Hozzon létre egy konfigurációs adatblokkot, amely tartalmazza a nyilvános kulcs elérési útját és ujjlenyomatát.
  3. Hozzon létre egy konfigurációs szkriptet, amely meghatározza a célcsomópont kívánt konfigurációját, és beállítja a visszafejtést a célcsomópontokon a Helyi konfigurációkezelő parancsával a konfigurációs adatok a tanúsítvány és az ujjlenyomat használatával történő visszafejtéséhez.
  4. Futtassa a konfigurációt, amely beállítja a Helyi Configuration Manager beállításokat, és elindítja a DSC-konfigurációt.

Folyamat a hitelesítő adatok titkosításához

Tanúsítványokkal kapcsolatos követelmények

A hitelesítő adatok titkosításának létrehozásához nyilvános kulcsú tanúsítványnak kell rendelkezésre állnia a célcsomóponton , amelyet a DSC-konfiguráció létrehozásához használt számítógép megbízhatónak talál. Ez a nyilvános kulcsú tanúsítvány speciális követelményekkel rendelkezik a DSC hitelesítő adatok titkosításához való használatához:

  1. Kulcshasználat:
    • Tartalmaznia kell a következőt: "KeyEncipherment" és "DataEncipherment".
    • A következőt nem tartalmazhatja: "Digitális aláírás".
  2. Továbbfejlesztett kulcshasználat:
    • Tartalmaznia kell: Dokumentumtitkosítás (1.3.6.1.4.1.311.80.1).
    • Nem tartalmazhat: ügyfél-hitelesítés (1.3.6.1.5.5.7.3.2) és kiszolgálói hitelesítés (1.3.6.1.5.5.7.3.1).
  3. A tanúsítvány titkos kulcsa a *Cél Node_ érhető el.
  4. A tanúsítvány szolgáltatójának "Microsoft RSA SChannel titkosítási szolgáltatónak" kell lennie.

Fontos

Bár használhat olyan tanúsítványt, amely tartalmazza a "digitális aláírás" kulcshasználatát vagy a hitelesítési EKU-k egyikét, ez lehetővé teszi, hogy a titkosítási kulcs használata egyszerűbb legyen, és sebezhetőbb legyen a támadásokkal szemben. Ezért ajánlott olyan tanúsítványt használni, amelyet kifejezetten a DSC hitelesítő adatainak védelmére hoztak létre, amely kihagyja ezeket a kulcshasználatot és EKU-kat.

A célcsomópont minden olyan meglévő tanúsítványa, amely megfelel ezeknek a feltételeknek, használható a DSC hitelesítő adatainak védelmére.

Tanúsítvány létrehozása

A szükséges titkosítási tanúsítvány (nyilvános-privát kulcspár) létrehozásához és használatához két módszer közül választhat.

  1. Hozza létre a célcsomóponton , és exportálja csak a nyilvános kulcsot a szerzői csomópontba
  2. Hozza létre a szerzői csomóponton , és exportálja a teljes kulcspárt a célcsomópontba

Az 1. módszer azért ajánlott, mert az MOF hitelesítő adatainak visszafejtéséhez használt titkos kulcs mindig a célcsomóponton marad.

A tanúsítvány létrehozása a célcsomóponton

A titkos kulcsot titokban kell tartani, mert a célcsomópont MOF-jának visszafejtésére szolgál. Ennek legegyszerűbb módja a titkos kulcs tanúsítványának létrehozása a célcsomóponton, és a nyilvános kulcs tanúsítványának másolása a DSC-konfiguráció MOF-fájlba való létrehozásához használt számítógépre. Az alábbi példa:

  1. létrehoz egy tanúsítványt a Célcsomóponton
  2. exportálja a nyilvános kulcs tanúsítványát a Cél csomóponton.
  3. importálja a nyilvános kulcsú tanúsítványt a saját tanúsítványtárolóba a Szerzői csomóponton.

A célcsomóponton: hozza létre és exportálja a tanúsítványt

Célcsomópont: Windows Server 2016 és 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

Az exportálás után az DscPublicKey.cer értéket át kell másolni a szerzői csomópontra.

A szerzői csomóponton: importálja a tanúsítvány nyilvános kulcsát

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

A tanúsítvány létrehozása a szerzői csomóponton

Másik lehetőségként létrehozható a titkosítási tanúsítvány a szerzői csomóponton, a titkos kulccsal PFX-fájlként exportálható, majd importálható a célcsomópontra. Ez az aktuális módszer a DSC hitelesítő adatok titkosításának a Nano Serveren történő implementálásához. Bár a PFX-et jelszó védi, az átvitel során biztonságosnak kell lennie. Az alábbi példa:

  1. létrehoz egy tanúsítványt a Szerzői csomóponton.
  2. exportálja a tanúsítványt, beleértve a szerzői csomópont titkos kulcsát is.
  3. eltávolítja a titkos kulcsot a Szerzői csomópontról, de a nyilvános kulcs tanúsítványát a saját tárolóban tartja.
  4. importálja a titkoskulcs-tanúsítványt a Cél csomópont My(Personal) tanúsítványtárolójába.
    • Hozzá kell adni a gyökértárolóhoz, hogy a célcsomópont megbízható legyen.

A szerzői csomóponton: hozza létre és exportálja a tanúsítványt

Célcsomópont: Windows Server 2016 és 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

Az exportálás után a DscPrivateKey.pfxcélcsomópontra kell másolni.

A célcsomóponton: a tanúsítvány titkos kulcsának importálása megbízható gyökérként

# 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

Konfigurációs adatok

A konfigurációs adatblokk meghatározza, hogy mely célcsomópontokon kell működnie, függetlenül attól, hogy titkosítja-e a hitelesítő adatokat, a titkosítás módját és egyéb információkat. További információ a konfigurációs adatblokkról: Konfigurációs és környezeti adatok elkülönítése.

A hitelesítő adatok titkosításához kapcsolódó összes csomóponthoz konfigurálható elemek a következők:

  • NodeName – annak a célcsomópontnak a neve, amelyre a hitelesítő adatok titkosítása konfigurálva van.
  • PsDscAllowPlainTextPassword – azt jelzi, hogy a titkosítatlan hitelesítő adatok átadhatók-e ehhez a csomóponthoz. Ez nem ajánlott.
  • Ujjlenyomat – annak a tanúsítványnak az ujjlenyomata, amely a célcsomópont DSC-konfigurációjában található hitelesítő adatok visszafejtésére szolgál. Ennek a tanúsítványnak a helyi gép tanúsítványtárolójában kell lennie a célcsomóponton.
  • CertificateFile – az a tanúsítványfájl (amely csak a nyilvános kulcsot tartalmazza), amelyet a célcsomópont hitelesítő adatainak titkosításához kell használni. Ennek der kódolású bináris X.509 vagy Base-64 kódolású X.509 formátumú tanúsítványfájlnak kell lennie.

Ez a példa egy konfigurációs adatblokkot mutat be, amely meghatározza a célcsomópontot, amely a nevesített targetNode-on, a nyilvános kulcsú tanúsítványfájl elérési útját (targetNode.cer néven) és a nyilvános kulcs ujjlenyomatát határozza meg.

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

Konfigurációs szkript

A konfigurációs szkriptben használja a PsCredential paramétert annak biztosítására, hogy a hitelesítő adatok a lehető legrövidebb ideig legyenek tárolva. A megadott példa futtatásakor a DSC hitelesítő adatokat kér, majd titkosítja az MOF-fájlt a konfigurációs adatblokk célcsomópontjához társított CertificateFile használatával. Ez a példakód egy felhasználó számára védett megosztásból másol át egy fájlt.

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

Visszafejtés beállítása

Mielőtt a Start-DscConfiguration működőképes lenne, meg kell adnia a helyi Configuration Manager minden célcsomóponton, hogy melyik tanúsítványt használja a hitelesítő adatok visszafejtéséhez a Tanúsítványazonosító erőforrás használatával a tanúsítvány ujjlenyomatának ellenőrzéséhez. Ez a példafüggvény megkeresi a megfelelő helyi tanúsítványt (előfordulhat, hogy testre kell szabnia, hogy megtalálja a használni kívánt tanúsítványt):

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

Az ujjlenyomata alapján azonosított tanúsítvány esetében a konfigurációs szkript frissíthető a következő érték használatára:

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

A konfiguráció futtatása

Ezen a ponton futtathatja a konfigurációt, amely két fájlt ad ki:

  • Egy *.meta.mof fájl, amely úgy konfigurálja a Helyi Configuration Manager, hogy visszafejtse a hitelesítő adatokat a helyi gép tárolójában tárolt és az ujjlenyomata alapján azonosított tanúsítvánnyal. A Set-DscLocalConfigurationManager alkalmazza a *.meta.mof fájlt.
  • Egy MOF-fájl, amely ténylegesen alkalmazza a konfigurációt. Start-DscConfiguration alkalmazza a konfigurációt.

Ezek a parancsok a következő lépéseket hajtják végre:

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

Ez a példa leküldi a DSC-konfigurációt a célcsomópontra. A DSC-konfiguráció dsc lekéréses kiszolgálóval is alkalmazható, ha van ilyen.

A DSC-konfigurációk DSC lekéréses kiszolgálóval történő alkalmazásával kapcsolatos további információkért lásd: DSC lekéréses ügyfél beállítása .

Példa hitelesítőadat-titkosítási modulra

Íme egy teljes példa, amely tartalmazza az összes lépést, valamint egy segédparancsmagot, amely exportálja és másolja a nyilvános kulcsokat:

# 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