توصيل Azure Spring Apps ب Key Vault باستخدام الهويات المدارة

إشعار

سيتم إهمال الخطط الأساسية والقياسية والمؤسسة بدءا من منتصف مارس 2025، مع فترة تقاعد 3 سنوات. نوصي بالانتقال إلى Azure Container Apps. لمزيد من المعلومات، راجع إعلان إيقاف Azure Spring Apps.

سيتم إهمال الاستهلاك القياسي والخطة المخصصة بدءا من 30 سبتمبر 2024، مع إيقاف التشغيل الكامل بعد ستة أشهر. نوصي بالانتقال إلى Azure Container Apps. لمزيد من المعلومات، راجع ترحيل استهلاك Azure Spring Apps القياسي وخطة مخصصة إلى Azure Container Apps.

هذه المقالة تنطبق على: ✔️ Java ❌ C#‎

توضح هذه المقالة كيفية إنشاء هوية مدارة معينة من قبل النظام أو معينة من قبل المستخدم لتطبيق تم نشره في Azure Spring Apps واستخدامها للوصول إلى Azure Key Vault.

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

يصف الفيديو التالي كيفية إدارة الأسرار باستخدام Azure Key Vault.


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

  • اشتراك Azure. في حال لم يكن لديك اشتراك Azure، أنشئ حسابًا مجانيًا قبل البدء.
  • Azure CLI، الإصدار 2.55.0 أو أعلى.

توفير أسماء لكل مورد

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

export LOCATION=<location>
export RESOURCE_GROUP=myresourcegroup
export SPRING_APPS=myasa
export APP=springapp-system
export KEY_VAULT=<your-keyvault-name>

إنشاء مجموعة موارد

وتُعد مجموعة الموارد عبارة عن حاوية منطقية يتم فيها توزيع موارد Azure وإدارتها. إنشاء مجموعة موارد لاحتواء كل من Key Vault وSpring Cloud باستخدام الأمر az group create ، كما هو موضح في المثال التالي:

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

إعداد Key Vault الخاص بك

لإنشاء Key Vault، استخدم الأمر az keyvault create ، كما هو موضح في المثال التالي:

هام

يجب أن يكون لكل Key Vault اسم مميز.

az keyvault create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT}

استخدم الأمر التالي لإظهار عنوان URL للتطبيق ثم دون ملاحظة بعنوان URL الذي تم إرجاعه، وهو بالتنسيق https://${KEY_VAULT}.vault.azure.net. استخدم هذه القيمة في الخطوة التالية.

az keyvault show \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT} \
    --query properties.vaultUri --output tsv

يمكنك الآن وضع سر في Key Vault الخاص بك باستخدام الأمر az keyvault secret set ، كما هو موضح في المثال التالي:

az keyvault secret set \
    --vault-name ${KEY_VAULT} \
    --name "connectionString" \
    --value "jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;"

إنشاء تطبيق وخدمة Azure Spring Apps

بعد تثبيت جميع الملحقات المقابلة، استخدم الأمر التالي لإنشاء مثيل Azure Spring Apps:

az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --sku Enterprise \
    --name ${SPRING_APPS}

ينشئ المثال التالي التطبيق بهوية مدارة معينة من قبل النظام، كما هو مطلوب من قبل المعلمة --system-assigned :

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)
az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${SPRING_APPS}

ينشئ المثال التالي تطبيقاً يحمل اسم springapp بواسطة هوية مدارة معينة من قبل النظام، كما طلبت المعلمة--system-assigned.

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --runtime-version Java_17 \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)

امنح التطبيق الخاص بك الوصول إلىKey Vault

استخدم الأمر التالي لمنح الوصول المناسب في Key Vault لتطبيقك:

az keyvault set-policy \
    --name ${KEY_VAULT} \
    --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} \
    --secret-permissions set get list

إشعار

بالنسبة للهوية المدارة المعينة من قبل النظام، استخدم az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} لإزالة الوصول لتطبيقك بعد تعطيل الهوية المدارة المعينة من قبل النظام.

إنشاء نموذج تطبيق Spring Boot باستخدام بداية Spring Boot

هذا التطبيق لديه حق الوصول للحصول على أسرار من Azure Key Vault. استخدم بداية التمهيد Azure Key Vault Secrets Spring. تتم إضافة Azure Key Vault كمثال على الربيع PropertySource. يمكن الوصول إلى الأسرار المخزنة فيAzure Key Vault بسهولة واستخدامها مثل أي خاصية تكوين خارجية، مثل الخصائص في الملفات.

  1. استخدم الأمر التالي لإنشاء نموذج مشروع من start.spring.io باستخدام Azure Key Vault Spring Starter.

    curl https://start.spring.io/starter.tgz -d dependencies=web,azure-keyvault -d baseDir=springapp -d bootVersion=3.2.1 -d javaVersion=17 -d type=maven-project | tar -xzvf -
    
  2. حدد Key Vault الخاص بك في تطبيقك.

    cd springapp
    vim src/main/resources/application.properties
    
  3. لاستخدام الهوية المدارة لتطبيق تم نشره في Azure Spring Apps، أضف خصائص بالمحتوى التالي إلى ملف src/main/resources/application.properties .

    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=<your-keyvault-url>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled=true
    

    إشعار

    يجب إضافة عنوان URL لمخزن المفاتيح في ملف application.properties كما هو موضح سابقا. خلاف ذلك، قد لا يتم التقاط عنوان URL لخزنة المفاتيح أثناء وقت التشغيل.

  4. تحديث src/main/java/com/example/demo/DemoApplication.java باستخدام مثال التعليمات البرمجية التالي. تسترد هذه التعليمة البرمجية سلسلة الاتصال من Key Vault.

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication implements CommandLineRunner {
    
        @Value("${connectionString}")
        private String connectionString;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @GetMapping("get")
        public String get() {
            return connectionString;
        }
    
        public void run(String... args) throws Exception {
            System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
        }
    }
    

    إذا فتحت ملف pom.xml ، يمكنك مشاهدة التبعية spring-cloud-azure-starter-keyvault ، كما هو موضح في المثال التالي:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. استخدم الأمر التالي لنشر تطبيقك في Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. استخدم الأمر التالي لنشر تطبيقك في Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path \
        --build-env BP_JVM_VERSION=17
    
  1. لاختبار التطبيق الخاص بك، قم بالوصول إلى نقطة النهاية العامة أو اختبار نقطة النهاية باستخدام الأمر التالي:

    curl https://${SPRING_APPS}-${APP}.azuremicroservices.io/get
    

    يتم إرجاع الرسالة التالية في نص الاستجابة: jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;.

تنظيف الموارد

استخدم الأمر التالي لحذف مجموعة الموارد بأكملها، بما في ذلك مثيل الخدمة الذي تم إنشاؤه حديثا:

az group delete --name ${RESOURCE_GROUP} --yes

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