دعم KeyVaultReference لـService Fabric Applications الموزعة في Azure

أحد التحديات الشائعة عند إنشاء التطبيقات السحابية يتمثل في معرفة كيفية توزيع الأسرار بشكل آمن على تطبيقاتك وإدارتها. دعم Service Fabric KeyVaultReference ييسر الأمر. بمجرد تكوينه، يمكنك الرجوع إلى عنوان محدد مواقع الويب للسر المخزن في Key Vault في تعريف التطبيق الخاص بك، وسيتعامل Service Fabric مع إحضار هذه البيانات السرية وتنشيط تطبيقك معه. عند استخدام الإصدار "المدار بواسطة SF" من الميزة، يمكن لـ Service Fabric أيضًا مراقبة Key Vault الخاص بك، وتشغيل ترقيات معلمات التطبيق المتداولة تلقائيًا أثناء تدوير أسرارك في المخزن.

خيارات لتقديم الأسرار إلى التطبيقات في Service Fabric

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

خيار آخر هو استخدام مراجع مخزن البيانات السرية. هذه التجربة تسمح بالإدارة المركزية لأسرار تطبيقك، ورؤية أفضل للبيانات الوصفية للأسرار الموزعة، وتسمح بالإدارة المركزية لشهادة التشفير. قد يفضل البعض نمط الإدارة السرية هذا عند تشغيل مجموعات Service Fabric المستقلة.

التوصية اليوم هي تقليل الاعتماد على الأسرار، حيثما أمكن، باستخدام الهويات المُدارة لتطبيقات Service Fabric. يمكن استخدام الهويات المُدارة للمصادقة مباشرة إلى Azure Storage وAzure SQL والمزيد. وهذا يعني أنه ليست هناك حاجة لإدارة بيانات اعتماد منفصلة عند الوصول إلى خدمات Azure التي تدعم مصادقة Microsoft Entra.

عندما يتعذر استخدام الهوية المُدارة كعميل، نوصي باستخدام KeyVaultReferences. يجب عليك استخدام KeyVaultReferences بدلاً من استخدام الهوية المُدارة للانتقال مباشرة إلى Key Vault. تساعد KeyVaultReferences على زيادة توفر تطبيقك لأنه يفرض حدوث تغييرات سرية أثناء الترقيات المتداولة. كما أنه يتوسع بشكل أفضل حيث يتم تخزين الأسرار مؤقتًا وتقديمها من داخل المجموعة. إذا كان تطبيقك يستخدم المعلمات المشفرة اليوم، فلا يلزم سوى إجراء تغييرات طفيفة في التعليمات البرمجية للتطبيق لاستخدام KeyVaultReferences. يمكن أن يستمر تطبيقك في توقع التوصل إلى سر واحد، وأن تكون هذه البيانات السرية هو نفسه طوال عمر العملية.

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

  • Managed Identity لـService Fabric Applications

    دعم Service Fabric KeyVaultReference يستخدم الهوية المُدارة للتطبيق لإحضار البيانات السرية نيابة عن التطبيق. يجب عليك توزيع تطبيقك عبر ARM وتعيين هوية مُدارة له. اتبع هذا المستند لتمكين الهوية المدارة لتطبيقك.

  • Central Secrets Store (CSS).

    Central Secrets Store (CSS) هو ذاكرة التخزين المؤقت للبيانات السرية المحلية المشفرة لـService Fabric. تستخدم هذه الميزة CSS لحماية الأسرار واستمرارها بعد إحضارها من Key Vault. يلزم تمكين خدمة النظام هذه لاستخدام KeyVaultReferences. اتبع هذا المستند لتمكين وتكوين CSS.

  • منح إذن الوصول إلى الهوية المُدارة لـ Key Vault

    ارجع إلى هذا المستند لمعرفة كيفية منح إذن الوصول إلى هوية مُدارة إلى Key Vault. لاحظ أيضًا أنه إذا كنت تستخدم الهوية المُدارة المعينة من قبل النظام، فلن يتم إنشاء هوية مُدارة إلا بعد توزيع التطبيق. يمكن أن يؤدي ذلك إلى خلق حالة تعارض حيث يحاول التطبيق الوصول إلى البيانات السرية قبل منح الهوية إذن الوصول إلى المخزن. سيكون اسم هوية النظام المعين هو {cluster name}/{application name}/{service name}.

KeyVaultReferences مقابل KeyVaultReference المُدار

الفكرة الأساسية لـ KeyVaultReferences هي بدلاً من تعيين قيمة معلمة تطبيقك على أنها بياناتك السرية، يمكنك تعيينها على عنوان محدد مواقع الويب لـ Key Vault، والذي سيتم حله بعد ذلك إلى القيمة السرية عند تنشيط تطبيقك. في Key Vault، يمكن أن يكون لسر واحد، على سبيل المثال، https://my.vault.azure.net/secrets/MySecret/إصدارات متعددة، على سبيل المثال، https://my.vault.azure.net/secrets/MySecret/<oid1> و<oid2>. عند استخدام KeyVaultReference، يجب أن تكون القيمة مرجعًا تم إصداره (https://my.vault.azure.net/secrets/MySecret/<oid1>). إذا قمت بتدوير هذه القيمة السرية في المخزن، على سبيل المثال، إلى <oid2>، فيجب عليك تشغيل ترقية تطبيق إلى المرجع الجديد. عند استخدام مرجع ManagedKeyVaultReference، يجب أن تكون القيمة مرجعًا بدون إصدار (https://my.vault.azure.net/secrets/MySecret/). سيقوم Service Fabric بحل أحدث مثيل <oid1> وتنشيط التطبيق بهذه البيانات السرية. إذا قمت بتدوير البيانات السرية في المخزن إلى <oid2>، فسيقوم Service Fabric تلقائيا بتشغيل ترقية معلمة التطبيق للانتقال إليها <oid2> نيابة عنك.

إشعار

يتوفر دعم KeyVaultReference (البيانات السرية التي تم إصدارها) لتطبيقات Service Fabric بشكل عام بدءًا من الإصدار 7.2 CU5 من Service Fabric. يوصى بالترقية إلى هذا الإصدار قبل استخدام هذه الميزة.

إشعار

يتوفر دعم KeyVaultReference المُدار (بيانات سرية أقل إصدارًا) لتطبيقات Service Fabric بشكل عام بدءا من الإصدار 9.0 من Service Fabric.

استخدم KeyVaultReferences في تطبيقك

يمكن استهلاك KeyVaultReference

على هيئة متغير بيئة

<EnvironmentVariables>
      <EnvironmentVariable Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
</EnvironmentVariables>
string secret =  Environment.GetEnvironmentVariable("MySecret");

مثبتة على هيئة ملف في الحاوية الخاصة بك

  • أضف قسماً إلى settings.xml

    حدد معلمة MySecret بالنوع KeyVaultReference والقيمة <KeyVaultURL>

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • أشِر إلى القسم الجديد في ApplicationManifest.xml in <ConfigPackagePolicies>

    <ServiceManifestImport>
        <Policies>
        <IdentityBindingPolicy ServiceIdentityRef="MyServiceMI" ApplicationIdentityRef="MyApplicationMI" />
        <ConfigPackagePolicies CodePackageRef="Code">
            <!--Linux container example-->
            <ConfigPackage Name="Config" SectionName="MySecrets" EnvironmentVariableName="SecretPath" MountPoint="/var/secrets"/>
            <!--Windows container example-->
            <!-- <ConfigPackage Name="Config" SectionName="dbsecrets" EnvironmentVariableName="SecretPath" MountPoint="C:\secrets"/> -->
        </ConfigPackagePolicies>
        </Policies>
    </ServiceManifestImport>
    
  • استخدام البيانات السرية من تعليمة الخدمة البرمجية

    ستكون كل معلمة مدرجة ضمن <Section Name=MySecrets> ملفاً ضمن المجلد المشار إليه بواسطة EnvironmentVariable SecretPath. توضح القصاصة البرمجية لـ#C أدناه كيفية قراءة MySecret من تطبيقك.

    string secretPath = Environment.GetEnvironmentVariable("SecretPath");
    using (StreamReader sr = new StreamReader(Path.Combine(secretPath, "MySecret"))) 
    {
        string secret =  sr.ReadToEnd();
    }
    

    إشعار

    يتحكم MountPoint في المجلد حيث سيتم إدخال الملفات التي تحتوي على قيم بيانات سرية.

على هيئة مرجع إلى كلمة مرور مستودع الحاوية

 <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="MyACRUser" Type="KeyVaultReference" Password="<KeyVaultURL>"/>
      </ContainerHostPolicies>

استخدام KeyVaultReference المُدار في تطبيقك

أولا، يجب تمكين المراقبة السرية عن طريق ترقية تعريف نظام المجموعة الخاص بك لإضافة EnableSecretMonitoring الإعداد، بالإضافة إلى تكوينات CSS المطلوبة الأخرى:

"fabricSettings": [
    {
        "name": "CentralSecretService",     
        "parameters": [
            {
                "name": "EnableSecretMonitoring",
                "value": "true"
            },
            {
                "name":  "DeployedState",
                "value":  "enabled"
            },
            {
                "name" : "EncryptionCertificateThumbprint",
                "value": "<thumbprint>"
            },
            {
                "name":  "MinReplicaSetSize",
                "value":  "<size>"
            },
            {
                "name":  "TargetReplicaSetSize",
                "value":  "<size>"
            }
        ]
    }
],

إشعار

قد يصبح الافتراضي true في المستقبل

بعد انتهاء ترقية نظام المجموعة، يمكن ترقية تطبيق المستخدم الخاص بك. في أي مكان يمكن فيه استخدام KeyVaultReference، يمكن أيضًا استخدام ManagedKeyVaultReference، على سبيل المثال،

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="ManagedKeyVaultReference" Value="[MySecretReference]"/>
    </Section>

الفرق الأساسي في تحديد ManagedKeyVaultReferences هو أنه لا يمكن ترميزها في بيان نوع التطبيق الخاص بك. لابد من الإعلان عنها كمعلمات على مستوى التطبيق، وكذلك يجب تجاوزها في تعريف تطبيق ARM الخاص بك.

فيما يلي مقتطف من بيان جيد التنسيق

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="MyAppType" ApplicationTypeVersion="1.0.0">
  <Parameters>
    <Parameter Name="MySecretReference" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <EnvironmentOverrides CodePackageRef="Code">
      <EnvironmentVariable Name="MySecret" Value="[MySecretReference]" Type="ManagedKeyVaultReference" />
    </EnvironmentOverrides>
    <Policies>
      <IdentityBindingPolicy ServiceIdentityRef="MySvcIdentity" ApplicationIdentityRef="MyAppIdentity" />
    </Policies>
  </ServiceManifestImport>
  <Principals>
    <ManagedIdentities>
      <ManagedIdentity Name="MyAppIdentity" />
    </ManagedIdentities>
  </Principals>
</ApplicationManifest>

ومقتطف من تعريف مورد التطبيق:

{
    "type": "Microsoft.ServiceFabric/clusters/applications",
    "name": "MyApp",
    "identity": {
        "type" : "userAssigned",
        "userAssignedIdentities": {
            "[variables('userAssignedIdentityResourceId')]": {}
        }
    },
    "properties": {
        "parameters": {
            "MySecretReference": "https://my.vault.azure.net/secrets/MySecret/"
        },
        "managedIdentities": [
            {
            "name" : "MyAppIdentity",
            "principalId" : "<guid>"
            }
        ]
    }
}

هناك حاجة إلى كل من الإعلان عن ManagedKeyVaultReference كمعلمة تطبيق، وكذلك تجاوز هذه المعلمة عند التوزيع لـ Service Fabric لإدارة دورة حياة البيانات السرية التي تم توزيعها بنجاح.

الخطوات التالية