النصائح الإرشادية للأمان: تحديث تعيين الدور لمصادقة Microsoft Entra

تم اكتشاف خطأ أمان يؤثر على مصادقة Microsoft Entra القارئ الشامل. ننصحك بتغيير الأذونات على موارد القارئ الشامل.

خلفية

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

أثناء تدقيق الأمان، تم اكتشاف أن دور مستخدم الخدمات المعرفية هذا لديه أذونات لسرد المفاتيح. هذا أمر مقلق قليلا لأن عمليات التكامل القارئ الشامل تتضمن استخدام رمز الوصول هذا من Microsoft Entra في تطبيقات الويب والمستعرضات الخاصة بالعميل. إذا سرق مستخدم أو مهاجم سيئ رمز الوصول المميز للوصول، فهناك قلق من إمكانية استخدام list keys رمز الوصول هذا لمورد القارئ الشامل الخاص بك. إذا كان بإمكان المهاجم list keys لموردك، فسيحصل على Subscription Key لموردك. يتم استخدام Subscription Key لموردك كآلية مصادقة ويعتبر سرًا. إذا كان لدى المهاجم Subscription Key للمورد، فسيسمح له بإجراء استدعاءات واجهة برمجة تطبيقات صالحة ومصدّق عليها إلى نقطة نهاية مورد Immersive Reader، مما قد يؤدي إلى حجب الخدمة بسبب زيادة الاستخدام والتقييد على نقطة النهاية. كما أنه سيسمح بالاستخدام غير المصرح به لمورد Reader resource، مما سيؤدي إلى زيادة الرسوم على فاتورتك.

ومع ذلك، من الناحية العملية، من غير المحتمل أن يحدث هذا الهجوم أو الاستغلال أو قد لا يكون ممكنا. بالنسبة للسيناريوهات القارئ الشامل، يحصل العملاء على رموز الوصول المميزة ل Microsoft Entra مع جمهور من https://cognitiveservices.azure.com. من أجل الوصول بنجاح list keys إلى المورد الخاص بك، سيحتاج الرمز المميز للوصول إلى Microsoft Entra إلى جمهور من https://management.azure.com. بشكل عام، هذا ليس مصدر قلق كبير، نظرا لأن الرموز المميزة للوصول المستخدمة لسيناريوهات القارئ الشامل لن تعمل على list keys، لأنها لا تحتوي على الجمهور المطلوب. لتغيير الجمهور على الرمز المميز للوصول، سيتعين على المهاجم خطف رمز الحصول على الرمز المميز وتغيير الجمهور قبل إجراء المكالمة إلى معرف Microsoft Entra للحصول على الرمز المميز. مرة أخرى، من غير المحتمل أن يتم استغلال هذا لأنه، كأفضل ممارسة مصادقة القارئ الشامل، ننصح العملاء بإنشاء رموز وصول Microsoft Entra المميزة على خلفية تطبيق الويب، وليس في العميل أو المتصفح. في هذه الحالات، نظرا لأن الحصول على الرمز المميز يحدث على خدمة الواجهة الخلفية، فليس من المحتمل أو ربما حتى أن يتمكن المهاجم من اختراق هذه العملية وتغيير الجمهور.

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

للتخفيف من المخاوف بشأن أي إمكانية لاستخدام الرمز المميز للوصول إلى Microsoft Entra إلى list keys، أنشأنا دورا جديدا مضمنا في Azure يسمى Cognitive Services Immersive Reader User ليس لديه أذونات ل list keys. هذا الدور الجديد ليس دورا مشتركا للنظام الأساسي لخدمات Azure الذكاء الاصطناعي مثل Cognitive Services User الدور. هذا الدور الجديد خاص القارئ الشامل ويسمح فقط باستدعاءات القارئ الشامل واجهات برمجة التطبيقات.

ننصح جميع العملاء باستخدام الدور الجديد Cognitive Services Immersive Reader User بدلا من الدور الأصلي Cognitive Services User . لقد قدمنا برنامج نصي أدناه يمكنك تشغيله على كل مورد من مواردك لتبديل أذونات تعيين الدور.

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

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

أي موارد القارئ الشامل جديدة تقوم بإنشائها باستخدام برنامجنا النصي في كيفية: إنشاء مورد القارئ الشامل تلقائيا استخدم الدور الجديد.

تحديث الدور وتدوير مفاتيح الاشتراك

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

بعد تحديث الدور باستخدام البرنامج النصي التالي، ننصحك أيضا بتدوير مفاتيح الاشتراك على المورد الخاص بك. هذا في حالة تعرض مفاتيحك للخطر من خلال الاستغلال، وشخص ما يستخدم بالفعل موردك مع مصادقة مفتاح الاشتراك دون موافقتك. يؤدي تدوير المفاتيح إلى جعل المفاتيح السابقة غير صالحة ويرفض أي وصول آخر. بالنسبة للعملاء الذين يستخدمون مصادقة Microsoft Entra، والتي يجب أن تكون جميع المستخدمين لكل القارئ الشامل تنفيذ SDK الحالي، لا يؤثر تدوير المفاتيح على خدمة القارئ الشامل، نظرا لاستخدام رموز الوصول المميزة ل Microsoft Entra للمصادقة، وليس مفتاح الاشتراك. تناوب مفاتيح الاشتراك هو مجرد إجراء وقائي آخر.

يمكنك تدوير مفاتيح الاشتراك في مدخل Microsoft Azure. انتقل إلى المورد الخاص بك ثم إلى Keys and Endpoint القسم . في الأعلى، هناك أزرار من أجل Regenerate Key1 وRegenerate Key2.

Screenshot of the Azure portal showing an Immersive Reader resource with the Keys and Endpoint section selected, which shows the Regenerate Keys buttons at the top.

استخدام Azure PowerShell لتحديث تعيين دورك

  1. ابدأ بفتح Azure Cloud Shell. تأكد من تعيين Cloud Shell على PowerShell في القائمة المنسدلة العلوية اليسرى أو بكتابة pwsh.

  2. انسخ والصق القصاصة البرمجية التالية في shell.

    function Update-ImmersiveReaderRoleAssignment(
        [Parameter(Mandatory=$true, Position=0)] [String] $SubscriptionName,
        [Parameter(Mandatory=$true)] [String] $ResourceGroupName,
        [Parameter(Mandatory=$true)] [String] $ResourceName,
        [Parameter(Mandatory=$true)] [String] $AADAppIdentifierUri
    )
    {
        $unused = ''
        if (-not [System.Uri]::TryCreate($AADAppIdentifierUri, [System.UriKind]::Absolute, [ref] $unused)) {
            throw "Error: AADAppIdentifierUri must be a valid URI"
        }
    
        Write-Host "Setting the active subscription to '$SubscriptionName'"
        $subscriptionExists = Get-AzSubscription -SubscriptionName $SubscriptionName
        if (-not $subscriptionExists) {
            throw "Error: Subscription does not exist"
        }
        az account set --subscription $SubscriptionName
    
        # Get the Immersive Reader resource 
        $resourceId = az cognitiveservices account show --resource-group $ResourceGroupName --name $ResourceName --query "id" -o tsv
        if (-not $resourceId) {
            throw "Error: Failed to find Immersive Reader resource"
        }
    
        # Get the Microsoft Entra application service principal
        $principalId = az ad sp show --id $AADAppIdentifierUri --query "objectId" -o tsv
        if (-not $principalId) {
            throw "Error: Failed to find Microsoft Entra application service principal"
        }
    
        $newRoleName = "Cognitive Services Immersive Reader User"
        $newRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $newRoleName --query "[].id" -o tsv
        if ($newRoleExists) {
            Write-Host "New role assignment for '$newRoleName' role already exists on resource"
        } 
        else {
            Write-Host "Creating new role assignment for '$newRoleName' role"
            $roleCreateResult = az role assignment create --assignee $principalId --scope $resourceId --role $newRoleName
            if (-not $roleCreateResult) {
                throw "Error: Failed to add new role assignment"
            }
            Write-Host "New role assignment created successfully"
        }
    
        $oldRoleName = "Cognitive Services User"
        $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
        if (-not $oldRoleExists) {
            Write-Host "Old role assignment for '$oldRoleName' role does not exist on resource"
        }
        else {
            Write-Host "Deleting old role assignment for '$oldRoleName' role"
            az role assignment delete --assignee $principalId --scope $resourceId --role $oldRoleName
            $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
            if ($oldRoleExists) {
                throw "Error: Failed to delete old role assignment"
            }
            Write-Host "Old role assignment deleted successfully"
        }
    }
    
  3. قم بتشغيل الدالة Update-ImmersiveReaderRoleAssignment، واستبدل العناصر النائبة <PARAMETER_VALUES> بالقيم الخاصة بك حسب الاقتضاء.

    Update-ImmersiveReaderRoleAssignment -SubscriptionName '<SUBSCRIPTION_NAME>' -ResourceGroupName '<RESOURCE_GROUP_NAME>' -ResourceName '<RESOURCE_NAME>' -AADAppIdentifierUri '<MICROSOFT_ENTRA_APP_IDENTIFIER_URI>'
    

    يبدو الأمر الكامل كما يلي. هنا نضع كل معلمة على خطها الخاص للوضوح، حتى تتمكن من رؤية الأمر بأكمله. لا تقم بنسخ هذا الأمر أو استخدامه كما هو. انسخ الأمر واستخدمه مع القيم الخاصة بك. يحتوي هذا المثال على قيم وهمية ل <PARAMETER_VALUES>. سوف تكون لك مختلفة، كما يمكنك الخروج مع الأسماء الخاصة بك لهذه القيم.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    المعلمة‬ التعليقات
    اسم الاشتراك اسم اشتراك Azure
    ResourceGroupName اسم مجموعة الموارد التي تحتوي على مورد القارئ الشامل.
    ResourceName اسم مورد Immersive Reader.
    AADAppIdentifierUri URI لتطبيق Microsoft Entra.

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