Central Secret Service في Azure Service Fabric

تعد Central Secret Service (CSS)، والمعروفة أيضاً باسم Central Secret Store، خدمة نظام لـ Service Fabric تهدف إلى حماية البيانات السرية داخل نظام المجموعة. تسهل CSS إدارة البيانات السرية لتطبيقات SF، مما يلغي الحاجة إلى الاعتماد على المعلمات المشفرة.

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

كما تلعب CSS دوراً أساسياً في توفير البيانات السرية للتطبيقات التي تم الإعلان عنها على أنها عناوين URI سرية لـ KeyVault، بالاقتران مع الهوية المدارة لتطبيقات Service Fabric التي تم توزيعها بواسطة Azure.

لا يقصد بـ Central Secret Service أن تكون بديلاً لخدمة إدارة البيانات السرية الخارجية المخصصة، مثل Azure Key Vault.

ملاحظة

عند تنشيط CSS على نظام مجموعة SF يقوم بتشغيل إصدار أقدم من 7.1. CU3، يمكن أن يفشل التنشيط ويترك CSS في حالة غير سليمة بشكل دائم إذا تم تكوين نظام المجموعة لمصادقة Windows، أو إذا تم الإعلان عن EncryptionCertificateThumbprint بشكل غير صحيح، أو لم يتم تثبيت الشهادة المقابلة. في كلتا الحالتين، من المستحسن ترقية نظام المجموعة إلى إصدار وقت تشغيل SF أحدث من 7.1. CU3 قبل المتابعة.

تمكين Central Secrets Service

لتمكين Central Secrets Service، قم بتحديث تكوين نظام المجموعة كما هو موضح أدناه. نوصي باستخدام شهادة تشفير مختلفة عن شهادة نظام المجموعة. يجب تثبيت هذه الشهادة على جميع العقد.

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

ملاحظة

إعداد التكوين "DeployedState"، الذي تم تقديمه في الإصدار 8.0 من Service Fabric، هو الآلية المفضلة لتمكين CSS أو تعطيله؛ وقد تم تقديم هذه الوظيفة في الإصدارات السابقة بواسطة إعداد التكوين "IsEnabled"، والذي يعتبر الآن قديماً.

نموذج البيانات السرية لـ Central Secret Service

تكشف واجهة برمجة تطبيقات Central Secrets Service عن نوعين: المورد السري، والإصدار السري. يمثل نوع المورد السري، من الناحية المفاهيمية، عائلة من إصدارات سر واحد يستخدم لغرض معين. تتضمن الأمثلة: سلسلة اتصال وكلمة مرور وشهادة نقطة نهاية. يحتوي عنصر من نوع المورد السري على بيانات تعريف مرتبطة بهذا السر، وتحديداً النوع ونوع المحتوى والوصف. يمثل نوع الإصدار السري مثيلاً معيناً للسر المرتبط به، ويخزن النص العادي السري (مشفر)؛ استمراراً للأمثلة أعلاه، يحتوي الإصدار السري على قيمة كلمة المرور الحالية، وعنصر شهادة صالح حتى نهاية الشهر، وما إلى ذلك. عند تجديد هذه البيانات السرية، يجب إنتاج إصدارات سرية جديدة (وإضافتها إلى CSS).

إضفاء الطابع الرسمي على النموذج، فيما يلي القواعد التي تم تنفيذها وفرضها في تنفيذ CSS:

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

الإعلان عن مورد سري

يمكنك إنشاء مورد سري باستخدام واجهة برمجة تطبيقات REST.

ملاحظة

إذا كان نظام المجموعة يستخدم مصادقة Windows بدون شهادة HttpGateway، فسيتم إرسال طلب REST عبر قناة HTTP غير مؤمنة. لتمكين TLS لهذه القناة، يجب تحديث تعريف نظام المجموعة لتحديد شهادة خادم بوابة http.

لإنشاء مورد سري supersecret باستخدام واجهة برمجة تطبيقات REST، قم بإجراء طلب PUT إلى https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview. ستحتاج إلى المصادقة باستخدام شهادة نظام مجموعة أو شهادة عميل مسؤول لإنشاء مورد سري.

$json = '{"properties": {"kind": "inlinedValue", "contentType": "text/plain", "description": "supersecret"}}'
Invoke-WebRequest  -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview -Method PUT -CertificateThumbprint <CertThumbprint> -Body $json

تعيين القيمة السرية

استخدم البرنامج النصي التالي لاستخدام واجهة برمجة تطبيقات REST لتعيين القيمة السرية.

$Params = '{"properties": {"value": "mysecretpassword"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret/values/ver1?api-version=6.4-preview -Method PUT -Body $Params -CertificateThumbprint <ClusterCertThumbprint>

فحص القيمة السرية

Invoke-WebRequest -CertificateThumbprint <ClusterCertThumbprint> -Method POST -Uri "https:<clusterfqdn>/Resources/Secrets/supersecret/values/ver1/list_value?api-version=6.4-preview"

استخدم البيانات السرية في تطبيقك

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

  1. أضف قسماً في ملف settings.xml مع القصاصة البرمجية التالية. لاحظ هنا أن القيمة مذكورة بتنسيق {secretname:version}.
     <Section Name="testsecrets">
      <Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
     </Section>
  1. استورد القسم في ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
 <ConfigPackagePolicies CodePackageRef="Code">
   <ConfigPackage Name="Config" SectionName="testsecrets" EnvironmentVariableName="SecretPath" />
   </ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>

مثال 1: قم بإدخال البيانات السرية في حاوية. التغيير الوحيد المطلوب لإتاحة البيانات السرية داخل الحاوية يتمثل في specify نقطة تركيب في <ConfigPackage>. القصاصة البرمجية التالية هي ApplicationManifest.xml المعدلة.

   <ServiceManifestImport>
       <ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
       <ConfigOverrides />
       <Policies>
         <ConfigPackagePolicies CodePackageRef="Code">
           <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="C:\secrets" EnvironmentVariableName="SecretPath" />
           <!-- Linux Container
            <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="/mnt/secrets" EnvironmentVariableName="SecretPath" />
           -->
         </ConfigPackagePolicies>
       </Policies>
     </ServiceManifestImport>

تتوفر البيانات السرية ضمن نقطة التركيب داخل الحاوية.

مثال 2: ربط سر بمتغير بيئة عملية عن طريق تحديد Type='SecretsStoreRef. القصاصة البرمجية التالية هي مثال على كيفية ربط supersecret الإصدار ver1 بمتغير البيئة MySuperSecret في ServiceManifest.xml.

   <EnvironmentVariables>
     <EnvironmentVariable Name="MySuperSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/>
   </EnvironmentVariables>

سيشير متغير البيئة SecretPath إلى الدليل، حيث يتم تخزين جميع البيانات السرية. يتم تخزين كل معلمة مدرجة ضمن القسم testsecrets في ملف منفصل. يمكن للتطبيق الآن استخدام البيانات السرية على النحو التالي:

secretValue = IO.ReadFile(Path.Join(Environment.GetEnvironmentVariable("SecretPath"),  "TopSecret"))

تدوير شهادة تشفير Central Secret Service

من المهم ملاحظة أن الشهادات تظل صالحة لفك التشفير بعد انتهاء صلاحيتها. في الوقت الحالي، نوصي بالاستمرار في توفير شهادات التشفير السابقة بعد التدوير، لتقليل فرصة الإغلاق. يتطلب تدوير شهادة تشفير CSS الخطوات التالية:

  1. توفير الشهادة الجديدة لكل عقدة من نظام المجموعة. في الوقت الحالي، لا تقم بإزالة/متابعة توفير شهادة التشفير السابقة.
  2. بدء ترقية تكوين نظام مجموعة لتغيير قيمة EncryptionCertificateThumbprint إلى بصمة إبهام SHA-1 للشهادة الجديدة. عند الانتهاء من الترقية، ستبدأ CSS في إعادة تشفير محتواها الحالي إلى شهادة التشفير الجديدة. سيتم تشفير جميع البيانات السرية المضافة إلى CSS بعد هذه النقطة مباشرة إلى شهادة التشفير الجديدة. نظراً لأن التقارب في حماية جميع البيانات السرية بواسطة الشهادة الجديدة غير متزامن، فمن المهم أن تظل شهادة التشفير السابقة مثبتة على جميع العقد، ومتاحة لـ CSS.

إزالة Central Secret Service من نظام مجموعتك

تتطلب الإزالة الآمنة لـ Central Secret Service من نظام مجموعة إجراء ترقيين. تؤدي الترقية الأولى إلى تعطيل CSS وظيفياً، بينما تزيل الترقية الثانية الخدمة من تعريف نظام المجموعة، والذي يتضمن الحذف الدائم لمحتواها. تمنع هذه العملية المكونة من مرحلتين الحذف العرضي للخدمة، وتساعد في ضمان عدم وجود تبعيات معزولة على CSS أثناء عملية الإزالة. تتوفر هذه الميزة في الإصدار 8.0 من SF فصاعدا.

الخطوة 1: تحديث CSS DeployedState للإزالة

ترقية تعريف نظام المجموعة من "IsEnabled" = "true" أو من "DeployedState" = "enabled" إلى

{
    "name":  "DeployedState",
    "value":  "removing"
}

بمجرد دخول Central Secret Service إلى الحالة الموزعة Removing، فسترفض جميع استدعاءات واجهة برمجة التطبيقات السرية الواردة، سواء أكانت استدعاءات REST مباشرة أو عبر تنشيط الخدمات التي تتضمن SecretStoreRefs أو KeyVaultReferences. أي تطبيقات أو مكونات في نظام المجموعة التي لا تزال تعتمد على CSS في هذه المرحلة ستنتقل إلى حالة التحذير. في حالة حدوث ذلك، يجب التراجع عن الترقية إلى الحالة الموزعة Removing؛ وإذا نجحت هذه الترقية بالفعل، يجب بدء ترقية جديدة لتغيير CSS مرة أخرى إلى DeployedState = Enabled. إذا تلقت Central Secret Service طلباً أثناء وجودها في الحالة الموزعة Removing، فستعيد رمز HTTP 401 (غير معتمد)، وتضع نفسها في حالة «تحذير».

الخطوة 2: تحديث CSS DeployedState إلى «معطل»

ترقية تعريف نظام المجموعة من "DeployedState" = "removing" إلى

{
    "name":  "DeployedState",
    "value":  "disabled"
}

وينبغي ألا تعمل Central Secret Service بعد الآن في نظام المجموعة، ولن تكون موجودة في قائمة خدمات النظام. يتم فقدان محتويات CSS بشكل لا رجعة فيه.

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