مشاركة عبر


تأمين ملف MOF

ينطبق على: Windows PowerShell 4.0، Windows PowerShell 5.0

يدير DSC تكوين عقد الخادم عن طريق تطبيق المعلومات المخزنة في ملف MOF، حيث ينفذ Configuration Manager المحلي (LCM) الحالة النهائية المطلوبة. نظرا لأن هذا الملف يحتوي على تفاصيل التكوين، فمن المهم الحفاظ على أمانه. توضح هذه المقالة كيفية التأكد من تشفير العقدة الهدف للملف.

بدءا من الإصدار 5.0 من PowerShell، يتم تشفير ملف MOF بأكمله بشكل افتراضي عند تطبيقه على العقدة Start-DSCConfiguration باستخدام cmdlet. العملية الموضحة في هذه المقالة مطلوبة فقط عند تنفيذ حل باستخدام بروتوكول خدمة السحب إذا لم تتم إدارة الشهادات، لضمان إمكانية فك تشفير التكوينات التي تم تنزيلها بواسطة العقدة الهدف وقراءتها بواسطة النظام قبل تطبيقها (على سبيل المثال، خدمة السحب المتوفرة في Windows Server). سيكون لدى العقد المسجلة في Azure Automation DSC شهادات مثبتة ومدارة تلقائيا بواسطة الخدمة دون الحاجة إلى حمل إداري.

ملاحظة

يناقش هذا الموضوع الشهادات المستخدمة للتشفير. بالنسبة للتشفير، تكون الشهادة الموقعة ذاتيا كافية، لأن المفتاح الخاص يبقى دائما سريا ولا يعني التشفير ثقة المستند. يجب عدم استخدام الشهادات الموقعة ذاتيا لأغراض المصادقة. يجب عليك استخدام شهادة من مرجع مصدق موثوق به (CA) لأي أغراض مصادقة.

المتطلبات الأساسية

لتشفير بيانات الاعتماد المستخدمة لتأمين تكوين DSC بنجاح، تأكد من أن لديك ما يلي:

  • بعض وسائل إصدار الشهادات وتوزيعها. يفترض هذا الموضوع وأمثلته أنك تستخدم Active Directory Certification Authority. لمزيد من المعلومات الأساسية حول خدمات شهادات Active Directory، راجع نظرة عامة على خدمات شهادات Active Directory.
  • الوصول الإداري إلى العقدة أو العقد الهدف.
  • تحتوي كل عقدة مستهدفة على شهادة قادرة على التشفير محفوظة في المخزن الشخصي الخاص بها. في Windows PowerShell، المسار إلى المتجر هو Cert:\LocalMachine\My. تستخدم الأمثلة في هذا الموضوع قالب "مصادقة محطة العمل"، والذي يمكنك العثور عليه (جنبا إلى جنب مع قوالب الشهادات الأخرى) في قوالب الشهادات الافتراضية.
  • إذا كنت ستقوم بتشغيل هذا التكوين على كمبيوتر آخر غير العقدة الهدف، فقم بتصدير المفتاح العام للشهادة، ثم قم باستيراده إلى الكمبيوتر الذي ستقوم بتشغيل التكوين منه. تأكد من تصدير المفتاح العام فقط؛ حافظ على أمان المفتاح الخاص.

ملاحظة

موارد البرنامج النصي لها قيود عندما يتعلق الأمر بالتشفير. لمزيد من المعلومات، راجع مورد البرنامج النصي

إجمالي العمليات

  1. قم بإعداد الشهادات والمفاتيح وبصمات الإبهام، مع التأكد من أن كل عقدة مستهدفة تحتوي على نسخ من الشهادة وأن كمبيوتر التكوين يحتوي على المفتاح العام وبصمة الإبهام.
  2. إنشاء كتلة بيانات التكوين التي تحتوي على مسار وبصمات الإبهام للمفتاح العام.
  3. قم بإنشاء برنامج نصي للتكوين يحدد التكوين المطلوب للعقدة الهدف وينشئ فك التشفير على العقد الهدف عن طريق أمر مدير التكوين المحلي بفك تشفير بيانات التكوين باستخدام الشهادة وبصمة الإبهام الخاصة بها.
  4. قم بتشغيل التكوين، والذي سيقوم بتعيين إعدادات Configuration Manager المحلية وبدء تكوين DSC.

تدفق العملية لتشفير بيانات الاعتماد

متطلبات الشهادة

لتفعيل تشفير بيانات الاعتماد، يجب أن تكون شهادة المفتاح العام متوفرة على العقدة الهدفالموثوق بها من قبل الكمبيوتر المستخدم لتأليف تكوين DSC. تحتوي شهادة المفتاح العام هذه على متطلبات محددة لاستخدامها لتشفير بيانات اعتماد DSC:

  1. استخدام المفتاح:
    • يجب أن يحتوي على: "KeyEncipherment" و"DataEncipherment".
    • يجب ألا يحتوي على: "التوقيع الرقمي".
  2. استخدام المفتاح المحسن:
    • يجب أن يحتوي على: تشفير المستند (1.3.6.1.4.1.311.80.1).
    • يجب ألا يحتوي على: مصادقة العميل (1.3.6.1.5.5.7.3.2) ومصادقة الخادم (1.3.6.1.5.5.7.3.1).
  3. يتوفر المفتاح الخاص للشهادة على *Target Node_.
  4. يجب أن يكون موفر الشهادة "Microsoft RSA SChannel Cryptographic Provider".

هام

على الرغم من أنه يمكنك استخدام شهادة تحتوي على استخدام مفتاح ل "التوقيع الرقمي" أو أحد وحدات EKU للمصادقة، إلا أن هذا سيمكن من إساءة استخدام مفتاح التشفير بسهولة أكبر وعرضة للهجوم. لذلك من أفضل الممارسات استخدام شهادة تم إنشاؤها خصيصا لغرض تأمين بيانات اعتماد DSC التي تحذف استخدام المفاتيح ووحدات EKUs هذه.

يمكن استخدام أي شهادة موجودة على العقدة الهدف تفي بهذه المعايير لتأمين بيانات اعتماد DSC.

إنشاء الشهادة

هناك طريقتان يمكنك اتباعهما لإنشاء شهادة التشفير المطلوبة واستخدامها (زوج المفاتيح العامة والخاصة).

  1. قم بإنشائه على العقدة الهدف وقم بتصدير المفتاح العام فقط إلى عقدة التأليف
  2. قم بإنشائه على عقدة التأليف وتصدير زوج المفاتيح بأكمله إلى العقدة الهدف

يوصى بالأسلوب 1 لأن المفتاح الخاص المستخدم لفك تشفير بيانات الاعتماد في MOF يبقى على العقدة الهدف في جميع الأوقات.

إنشاء الشهادة على العقدة الهدف

يجب الاحتفاظ بالمفتاح الخاص سرا، لأنه يستخدم لفك تشفير MOF على العقدة الهدف أسهل طريقة للقيام بذلك هي إنشاء شهادة المفتاح الخاص على العقدة الهدف، ونسخ شهادة المفتاح العام إلى الكمبيوتر المستخدم لتأليف تكوين DSC في ملف MOF. المثال التالي:

  1. إنشاء شهادة على العقدة الهدف
  2. تصدير شهادة المفتاح العام على العقدة الهدف.
  3. استيراد شهادة المفتاح العام إلى مخزن الشهادات الخاص بي على عقدة التأليف.

في العقدة الهدف: إنشاء الشهادة وتصديرها

العقدة الهدف: Windows Server 2016 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

بمجرد تصديرها DscPublicKey.cer ، ستحتاج إلى نسخ إلى عقدة التأليف.

في عقدة التأليف: استيراد المفتاح العام للشهادات

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

إنشاء الشهادة على عقدة التأليف

بدلا من ذلك، يمكن إنشاء شهادة التشفير على عقدة التأليف، وتصديرها باستخدام المفتاح الخاص كملف PFX ثم استيرادها على العقدة الهدف. هذه هي الطريقة الحالية لتنفيذ تشفير بيانات اعتماد DSC على خادم Nano. على الرغم من أن PFX مؤمن بكلمة مرور، فإنه يجب أن يظل آمنا أثناء النقل. المثال التالي:

  1. إنشاء شهادة على عقدة التأليف.
  2. تصدير الشهادة بما في ذلك المفتاح الخاص على عقدة التأليف.
  3. يزيل المفتاح الخاص من عقدة التأليف، ولكنه يحتفظ بشهادة المفتاح العام في متجري .
  4. استيراد شهادة المفتاح الخاص إلى مخزن شهادات My(Personal) على العقدة الهدف.
    • يجب إضافته إلى مخزن الجذر بحيث يمكن الوثوق به من قبل العقدة الهدف.

في عقدة التأليف: إنشاء الشهادة وتصديرها

العقدة الهدف: Windows Server 2016 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

بمجرد تصديرها DscPrivateKey.pfx ، ستحتاج إلى نسخ إلى العقدة الهدف.

على العقدة الهدف: استيراد المفتاح الخاص للشهادة كجذر موثوق به

# 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

بيانات التكوين

تحدد كتلة بيانات التكوين العقد المستهدفة التي يجب تشغيلها، وما إذا كان سيتم تشفير بيانات الاعتماد ووسائل التشفير والمعلومات الأخرى أم لا. لمزيد من المعلومات حول كتلة بيانات التكوين، راجع فصل بيانات التكوين والبيئة.

العناصر التي يمكن تكوينها لكل عقدة مرتبطة بتشفير بيانات الاعتماد هي:

  • NodeName - اسم العقدة الهدف التي يتم تكوين تشفير بيانات الاعتماد لها.
  • PsDscAllowPlainTextPassword - ما إذا كان سيتم السماح بتمرير بيانات الاعتماد غير المشفرة إلى هذه العقدة. هذا غير مستحسن.
  • بصمة الإبهام - بصمة إبهام الشهادة التي سيتم استخدامها لفك تشفير بيانات الاعتماد في تكوين DSC على العقدة الهدف. يجب أن تكون هذه الشهادة موجودة في مخزن شهادات الجهاز المحلي على العقدة الهدف.
  • CertificateFile - ملف الشهادة (الذي يحتوي على المفتاح العام فقط) الذي يجب استخدامه لتشفير بيانات الاعتماد للعقدة الهدف. يجب أن يكون هذا إما ملف شهادة بتنسيق X.509 ثنائي مشفر من DER أو Base-64 بتنسيق X.509.

يوضح هذا المثال كتلة بيانات التكوين التي تحدد عقدة هدف للعمل على targetNode المسماة، والمسار إلى ملف شهادة المفتاح العام (المسمى targetNode.cer)، وبصمة الإبهام للمفتاح العام.

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

البرنامج النصي للتكوين

في البرنامج النصي للتكوين نفسه، استخدم المعلمة PsCredential للتأكد من تخزين بيانات الاعتماد لأقصر وقت ممكن. عند تشغيل المثال المقدم، سيطالبك DSC ببيانات الاعتماد ثم يقوم بتشفير ملف MOF باستخدام CertificateFile المقترن بالعقدة الهدف في كتلة بيانات التكوين. ينسخ مثال التعليمات البرمجية هذا ملفا من مشاركة مؤمنة لمستخدم.

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

إعداد فك التشفير

قبل أن يعمل Start-DscConfiguration، يجب عليك إخبار Configuration Manager المحلي على كل عقدة مستهدفة بالشهادة التي يجب استخدامها لفك تشفير بيانات الاعتماد، باستخدام مورد CertificateID للتحقق من بصمة إبهام الشهادة. ستجد هذه الدالة المثال الشهادة المحلية المناسبة (قد تضطر إلى تخصيصها حتى تعثر على الشهادة الدقيقة التي تريد استخدامها):

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

مع تحديد الشهادة بواسطة بصمة الإبهام الخاصة بها، يمكن تحديث البرنامج النصي للتكوين لاستخدام القيمة:

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

تشغيل التكوين

في هذه المرحلة، يمكنك تشغيل التكوين، والذي سيخرج ملفين:

  • *.meta.mof ملف يقوم بتكوين Configuration Manager المحلي لفك تشفير بيانات الاعتماد باستخدام الشهادة المخزنة على مخزن الجهاز المحلي وتحديدها بواسطة بصمة الإبهام الخاصة به. يقوم Set-DscLocalConfigurationManager بتطبيق *.meta.mof الملف.
  • ملف MOF الذي يطبق التكوين فعليا. يطبق Start-DscConfiguration التكوين.

ستنجز هذه الأوامر الخطوات التالية:

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

سيدفع هذا المثال تكوين DSC إلى العقدة الهدف. يمكن أيضا تطبيق تكوين DSC باستخدام خادم سحب DSC إذا كان متوفرا.

راجع إعداد عميل سحب DSC لمزيد من المعلومات حول تطبيق تكوينات DSC باستخدام خادم سحب DSC.

مثال على وحدة تشفير بيانات الاعتماد

فيما يلي مثال كامل يتضمن كل هذه الخطوات، بالإضافة إلى أمر cmdlet المساعد الذي يصدر المفاتيح العامة وينسخها:

# 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