تأمين نظام متعدّد الوكلاء

1. مقدمة

نظرة عامة

في إنشاء نظام متعدد الوكلاء، أنشأت نظامًا موزّعًا لإنشاء الدورات التدريبية، وفي من "التحقّق من الأجواء" إلى تقييم الوكيل المستند إلى البيانات، تعلّمت كيفية تقييم أدائه.

يركّز هذا المختبر على تعزيز أمان النظام من خلال معالجة هذه الثغرات الأمنية. يؤدي عرض نقاط نهاية الوكيل إلى جعلها أهدافًا لهجمات حقن الطلبات وهجمات رفض الخدمة وغيرها من عمليات الاستغلال. وتواجه الوكلاء الذين يتفاعلون مع المستخدمين خطر معالجة معلومات تكشف الهوية الشخصية الحسّاسة، بينما تواجه الوكلاء الذين يزحفون على الويب خطر استيعاب محتوى ضارّ أو الوقوع ضحية لهجمات حقن الطلبات غير المباشرة. لمواجهة هذه التهديدات، ستنفّذ استراتيجية دفاعية متعددة الطبقات باستخدام أدوات الأمان في Google Cloud، بما في ذلك Model Armor وSensitive Data Protection، وستطبّق أفضل ممارسات الأمان، مثل إدارة الهوية وإمكانية الوصول بأقل امتيازات ممكنة والتواصل الآمن عبر الشبكة.

الإجراءات التي ستنفذّها

  • تحديد سياسات الأمان: أنشئ نماذج "حماية البيانات الحسّاسة" (SDP) لرصد معلومات تكشف الهوية الشخصية (PII) وإخفائها.
  • دمج ميزة "أمان التطبيق": عدِّل الخلفية لاعتراض طلبات المستخدمين وتنظيفها باستخدام Model Armor قبل وصولها إلى الوكلاء.
  • التحقّق من الحماية: يمكنك نشر التطبيق الآمن وتشغيل سيناريوهات "الفريق الأحمر" للتأكّد من حظر عمليات حقن الطلبات وتسريب البيانات الحسّاسة.
  • تنفيذ "السياسة كرمز برمجي" (اختياري): استخدِم Terraform لإدارة نماذج Model Armor وSDP، ما يضمن توفُّر فلاتر/ضوابط أمان متسقة في جميع البيئات.

أهداف الدورة التعليمية

  • كيفية ضبط خدمة Sensitive Data Protection (SDP) من Google Cloud لتحديد البيانات الحسّاسة وإخفائها
  • كيفية إنشاء نماذج Model Armor ونشرها باستخدام Terraform
  • نمط "الدفاع المتعمّق" لتأمين وكلاء الذكاء الاصطناعي التوليدي على مستوى طبقة التطبيق
  • كيفية تدقيق عناصر تحكّم الأمان والتحقّق منها باستخدام أساليب "فريق الاقتحام"

2. الإعداد

التهيئة

  1. تأكَّد من تسجيل الدخول. نفِّذ الأمر التالي للحصول على حساب gcloud الحالي:
    gcloud config get-value account
    
    إذا لم تكن مسجّلاً الدخول، شغِّل الأمر التالي:
    gcloud auth login --update-adc
    
  2. اضبط مشروعًا نشطًا لواجهة سطر الأوامر gcloud.شغِّل الأمر التالي للحصول على مشروع gcloud الحالي:
    gcloud config get-value project
    
    إذا لم يتم ضبطه، شغِّل الأمر التالي:
    gcloud config set project YOUR_PROJECT_ID
    
    استبدِل YOUR_PROJECT_ID برقم تعريف مشروعك.
  3. فعِّل واجهة برمجة التطبيقات لكلّ من Cloud Run وModel Armor وData Loss Prevention وArtifact Registry وCloud Build وIAM Credentials.
    gcloud services enable --project $(gcloud config get-value project) \
          aiplatform.googleapis.com \
          modelarmor.googleapis.com \
          dlp.googleapis.com \
          run.googleapis.com \
          artifactregistry.googleapis.com \
          cloudbuild.googleapis.com \
          iamcredentials.googleapis.com
    
  4. اضبط المنطقة التلقائية التي سيتم نشر خدمات Cloud Run فيها.
    gcloud config set run/region us-central1
    
    احرص على استخدام us-central1 للوصول إلى Model Armor وللحصول على أمثلة متسقة. يمكنك الاطّلاع على المناطق التي تتوفّر فيها أداة Model Armor هنا.

الرموز البرمجية والتبعيات

  1. استنسِخ الرمز الأولي وغيِّر الدليل إلى جذر المشروع.
    git clone https://github.com/h3xar0n/prai-roadshow-lab-3-starter
    cd prai-roadshow-lab-3-starter
    
    لبدء مساحة عمل Cloud Shell، شغِّل الأمر التالي:
    cloudshell workspace .
    
    استخدِم Terminal > New Terminal لفتح وحدة طرفية جديدة.
  2. أنشئ ملف .env من خلال إدخال الأوامر التالية في الوحدة الطرفية:
    echo "GOOGLE_GENAI_USE_VERTEXAI=true" > .env
    echo "GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project -q)" >> .env
    echo "GOOGLE_CLOUD_REGION=$(gcloud config get-value run/region -q)" >> .env
    echo "GOOGLE_CLOUD_LOCATION=global" >> .env
    
    في "محرّر Cloud Shell"، استخدِم عرض > تبديل الملفات المخفية للاطّلاع على الملفات المخفية، مثل .env.
  3. ثبِّت التبعيات عن طريق إدخال الأوامر التالية في الوحدة الطرفية:
    uv sync
    

3- إنشاء نماذج "حماية البيانات الحسّاسة"

تتكامل ميزة "متقدّمة" في Model Armor لحماية البيانات الحسّاسة مع Cloud DLP (خدمة حماية البيانات الحسّاسة) لفحص المحتوى وإزالة تحديد هويته. لاستخدامها في التنقيح، عليك أولاً إنشاء نماذج "فحص" و"إزالة تحديد الهوية" تحدّد أنواع البيانات الحسّاسة التي سيتم تحويلها وطريقة تحويلها.

حماية البيانات الحساسة

إنشاء نموذج فحص

تعثر خدمة "حماية البيانات الحسّاسة" على أنواع مختلفة من البيانات الحسّاسة باستخدام أدوات رصد infoType. يتوفّر أكثر من 150 أداة رصد مضمّنة تستخدم طرقًا مختلفة للرصد، بما في ذلك مطابقة الأنماط (التعبيرات العادية) والقواميس والمؤشرات المستندة إلى السياق. بالنسبة إلى أنواع معيّنة، مثل أرقام بطاقات الائتمان أو مستندات التعريف الصادرة عن جهة حكومية، تتجاوز هذه الأنواع مطابقة الأنماط البسيطة من خلال التحقّق من المجموع الاختباري للحدّ من النتائج الموجبة الخاطئة. تغطي أدوات الرصد هذه معلومات تكشف الهوية الشخصية (PII)، مثل الأسماء والعناوين، ولكنها تغطي أيضًا بيانات الاعتماد، مثل مفاتيح واجهة برمجة التطبيقات أو رموز المصادقة المميزة، وهو أمر مفيد بشكل خاص لمنع الكشف عن هذه المعلومات من خلال الوكلاء التي تتفاعل مع الرموز أو تقرأها.

  1. في وحدة تحكّم Google Cloud، انتقِل إلى الأمان > حماية البيانات الحسّاسة.
  2. في قائمة التنقّل، اختَر الإعداد > النماذج.
  3. انقر على إنشاء نموذج.
  4. اضبط النموذج:
    • نوع النموذج: Inspect
    • رقم تعريف النموذج: sensitive-data-inspector
    • نوع الموقع الجغرافي: Region
    • المنطقة: us-central1 (هذا الإعداد ضروري لاستخدام Model Armor).
  5. انقر على متابعة.
  6. في ضبط عملية الرصد، انقر على إدارة infoTypes.
  7. باستخدام الفلتر، ابحث عن infoTypes التالية وضَع علامة في المربّع بجانب كل منها:
    • CREDIT_CARD_NUMBER
    • GOVERNMENT_ID
    • PERSON_NAME
    • EMAIL_ADDRESS
    • STREET_ADDRESS
    • SECURITY_DATA
  8. حدِّد أي مواضيع أخرى تهمّك أيضًا، ثم انقر على تم.
  9. على اليسار، يمكنك اختبار ما سيكون عليه الإدخال والإخراج لأنواع المعلومات الحسّاسة المختلفة التي اخترتها.

    فحص اختبار النموذج

  10. راجِع الجدول الناتج للتأكّد من إضافة جميع أنواع infoType هذه، ثم انقر على إنشاء.

إنشاء نموذج إزالة تحديد الهوية

الآن، عليك إنشاء نموذج إزالة تعريف الهوية يحدّد كيفية تحويل نتائج البيانات الحسّاسة.

تتيح خدمة "حماية البيانات الحسّاسة" العديد من طرق التحويل المختلفة. قد تحتاج إلى إخفاء المعلومات التي تكشف الهوية الشخصية، مثل عناوين الشوارع، بالكامل عن طريق استبدالها بعنصر نائب مثل [REDACTED]، ولكن بالنسبة إلى رقم بطاقة الائتمان أو رقم التأمين الاجتماعي، قد تفضّل إخفاءه باستخدام حرف مثل # مع إبقاء آخر 4 أرقام مرئية لأغراض التعريف. للحصول على قائمة كاملة بطُرق التحويل التي تتيح لك تحقيق التوازن بين الأمان وسهولة الاستخدام، يُرجى الاطّلاع على تقنيات إزالة التعريف.

  1. في وحدة تحكّم Google Cloud، انتقِل إلى الأمان > حماية البيانات الحسّاسة.
  2. في قائمة التنقّل، اختَر الإعداد > النماذج > إزالة التعريف.
  3. انقر على إنشاء نموذج.
  4. اضبط النموذج:
    • نوع النموذج: De-identify
    • نوع تحويل البيانات: InfoType
    • رقم تعريف النموذج: sensitive-data-redactor
    • نوع الموقع الجغرافي: Region
    • المنطقة: us-central1 (هذا الإعداد ضروري لاستخدام Model Armor).
  5. انقر على متابعة.
  6. في قسم ضبط إزالة التعريف، عليك تحديد عدة قواعد، إذ إنّ قواعد infoType معيّنة تلغي القاعدة التلقائية.
  7. اضبط قاعدة التحويل الأولى:
    • التحويل: Mask with character
    • حرف الإخفاء: #
    • الأحرف التي يجب تجاهلها > تحديد الأحرف التي يجب تجاهلها: US Punctuation...
    • عدد الأحرف المطلوب إخفاؤها: 12
    • infoTypes to transform: Specific infoTypes
    • انقر على إدارة infoTypes.
    • ابحث عن المربّع بجانب CREDIT_CARD_NUMBER، ثم ضَع علامة في هذا المربّع.
    • انقر على تم.
    • تحقَّق من نموذج الإدخال والنموذج المحوَّل للتأكّد من أنّ آخر أربعة أرقام فقط لم يتم إخفاؤها، لأنّك اخترت تجاهل - وركّزت على الأحرف الـ 12 الأولى من رقم بطاقة مكوّن من 16 رقمًا.
  8. انقر على + إضافة قاعدة تحويل واضبط ما يلي:
    • التحويل: Replace
    • نوع الاستبدال: String
    • قيمة السلسلة: [redacted] (أو أي سلسلة أخرى تريد استخدامها)
    • infoTypes to transform: Any detected infoTypes...
  9. انقر على إنشاء لحفظ نموذج إزالة التعريف.
  10. انقر على اختبار واختَر نموذج الفحص الذي أنشأته سابقًا، والذي ينتهي بـ /sensitive-data-inspector. سيجمع هذا الاختبار بين infoTypes من نموذج الفحص وعمليات التحويل من نموذج إزالة التعريف.

اختبار نموذج إخفاء معلومات تحديد الهوية

أصبحت هذه النماذج جاهزة الآن لاستخدامها مع Model Armor. للتعمّق في استخدام خدمة Sensitive Data Protection في كل شيء، بدءًا من عمليات الفحص الأسبوعية للحِزم ووصولاً إلى عمليات تدقيق BigQuery، ولاختبارها على أنواع مختلفة من الملفات، مثل الصور وملفات CSV، يمكنك الاطّلاع على المختبر تأمين البيانات المستخدَمة في تطبيقات الذكاء الاصطناعي.

لإنشاء نماذج SDP هذه باستخدام Terraform، راجِع قسم "الملحق" في هذا المختبر.

4. إنشاء نموذج Model Armor

الآن، لإنشاء نموذج Model Armor يستخدم نموذج SDP الذي أنشأته للتعامل مع البيانات الحسّاسة، اتّبِع الخطوات التالية:

تدفّق Model Armor

Model Armor هي خدمة أمان شاملة مصمَّمة لحماية تطبيقات ونماذج الذكاء الاصطناعي على Google Cloud. بدلاً من ترك النماذج عرضةً للإدخالات الضارة، تعمل ميزة Model Armor كجدار حماية ذكي يحلّل الطلبات والردود في الوقت الفعلي لرصد التهديدات وحظرها قبل أن تتسبّب في حدوث ضرر. في ما يلي المخاطر الرئيسية التي تساعد Model Armor في الحدّ منها:

المخاطرة

تخفيف الأثر

حقن الطلبات والتحايل على القيود: يصمّم المستخدمون الضارون طلبات للتحايل على ضوابط الأمان، محاولين إنشاء محتوى ضار أو غير مقصود.

إنشاء سياسة أمان Model Armor وتطبيقها لرصد محاولات حقن الطلبات والتحايل على القيود وحظرها تلقائيًا

عناوين URL الضارة: يضمّن المستخدمون روابط ضارة في الطلبات لتنفيذ إجراءات مؤذية أو تسريب البيانات.

اضبط سياسة الأمان لرصد عناوين URL الضارة التي يتم العثور عليها في طلبات المستخدمين وحظرها أيضًا.

تسريب البيانات الحسّاسة: يعرض النموذج معلومات تكشف الهوية الشخصية (PII) في ردوده، ما يؤدي إلى خرق الخصوصية.

طبِّق سياسة لمنع فقدان البيانات تفحص الطلبات والاستجابات لرصد المعلومات الحسّاسة وحظرها قبل أن تصل إلى المستخدم.

  1. في Google Cloud Console، استخدِم شريط البحث العلوي للبحث عن Model Armor والانتقال إليه.
  2. انقر على إنشاء نموذج وأعِدّ النموذج باستخدام الإعدادات التالية:
    • رقم تعريف النموذج: course-creator-security-policy
    • نوع الموقع الجغرافي: Region
    • المنطقة: us-central1
    • ضمن الرصد:
      • ضَع علامة في المربّع بجانب رصد عناوين URL الضارة.
      • اترك المربّع بجانب اكتشاف عمليات حقن الطلبات وعمليات الاختراق محدّدًا، واضبط مستوى الثقة على منخفض أو أعلى.
      • ضَع علامة في المربّع بجانب حماية البيانات الحسّاسة.
        • اضبط نوع الرصد على متقدّم.
        • في حقل فحص اسم النموذج، أدخِل اسم المورد الكامل لنموذج الفحص (استبدِل [YOUR_PROJECT_ID] برقم تعريف مشروعك): projects/[YOUR_PROJECT_ID]/locations/us-central1/inspectTemplates/sensitive-data-inspector
      • في حقل اسم نموذج إزالة التعريف، أدخِل اسم المورد الكامل لنموذج إزالة التعريف (استبدِل [YOUR_PROJECT_ID] برقم تعريف مشروعك): projects/[YOUR_PROJECT_ID]/locations/us-central1/deidentifyTemplates/sensitive-data-redactor
    • ضمن الذكاء الاصطناعي المسؤول، اضبط ما يلي:
    • الكلام الذي يحضّ على الكراهية: متوسط أو أعلى
    • المضايقة: منخفضة وما فوق
    • جميع الخيارات الأخرى التي تختارها
    • ضمن ضبط التسجيل، ضَع علامة في المربّع Prompts and responses
  3. انقر على إنشاء.

إضافة اسم النموذج إلى ملف البيئة

تأكَّد من أنّ معرّف النموذج الذي تستخدمه هو course-creator-security-policy أثناء الإنشاء لكي تعمل النصوص البرمجية. بعد إنشاء النموذج في وحدة التحكّم، عليك إضافة اسم المورد الكامل إلى ملف .env ليتم تحميله في بيئتك لتنفيذ خطوات النشر.

أدخِل الأمر التالي في الوحدة الطرفية:

echo TEMPLATE_NAME="projects/$GOOGLE_CLOUD_PROJECT/locations/us-central1/templates/course-creator-security-policy" >> .env

لإنشاء نموذج Model Armor هذا باستخدام Terraform، راجِع قسم "الملحق" في هذا الدرس العملي.

5- إضافة Model Armor لفحص طلبات المستخدمين

بعد إنشاء نموذج Model Armor، تتمثّل الخطوة التالية في فرض هذه السياسة داخل تطبيقنا. سنعدّل الخلفية لاعتراض مدخلات المستخدم والتحقّق من صحتها باستخدام فلاتر الأمان. يضمن ذلك رصد أي طلبات ضارة أو بيانات حسّاسة عند "الباب الأمامي" قبل أن تتمكّن من معالجتها.

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

إضافة التبعيات

أولاً، علينا إضافة مكتبة google-cloud-modelarmor إلى تطبيق الخلفية.

الملف: app/pyproject.toml

إضافة google-cloud-modelarmor إلى قائمة dependencies:

[project]
# ... (existing config)
dependencies = [
    "uvicorn==0.40.0",
    "fastapi==0.123.*",
    "httpx==0.28.*",
    "httpx_sse==0.4.*",
    "google-genai==1.57.*",
    "google-cloud-logging==3.13.0",
    "opentelemetry-exporter-gcp-trace==1.11.0",
    "google-cloud-modelarmor==0.4.0",  # <--- NEW DEPENDENCY
]
# ...

إنشاء أداة مساعدة متعلّقة بالسلامة

بالنسبة إلى "المهمة 1"، انتقِل إلى app/safety_util.py، حيث سنتعامل مع ردود Model Armor وتحليلها، ما يحافظ على سلامة منطق التطبيق الرئيسي.

الملف: app/safety_util.py

# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Utility functions for Model Armor."""

import logging
from typing import Any

from google.cloud.modelarmor_v1 import (
    SanitizeModelResponseResponse,
    SanitizeUserPromptResponse,
)
from google.cloud.modelarmor_v1.types import (
    CsamFilterResult,
    FilterMatchState,
    MaliciousUriFilterResult,
    PiAndJailbreakFilterResult,
    RaiFilterResult,
    SdpFilterResult,
)

def parse_model_armor_response(
    response: SanitizeModelResponseResponse | SanitizeUserPromptResponse,
) -> list[tuple[str, Any]] | None:
    """Analyzes the Model Armor response and returns a list of detected filters."""
    sanitization_result = response.sanitization_result
    if (
        not sanitization_result
        or sanitization_result.filter_match_state
        == FilterMatchState.NO_MATCH_FOUND
    ):
        return None

    detected_filters = []
    filter_matches = sanitization_result.filter_results

    # Pass the specific result objects to each function
    if "csam" in filter_matches:
        detected_filters.extend(
            parse_csam_filter(filter_matches["csam"].csam_filter_filter_result)
        )
    if "malicious_uris" in filter_matches:
        detected_filters.extend(
            parse_malicious_uris_filter(
                filter_matches["malicious_uris"].malicious_uri_filter_result
            )
        )
    if "rai" in filter_matches:
        detected_filters.extend(
            parse_rai_filter(filter_matches["rai"].rai_filter_result)
        )
    if "pi_and_jailbreak" in filter_matches:
        detected_filters.extend(
            parse_pi_and_jailbreak_filter(
                filter_matches[
                    "pi_and_jailbreak"
                ].pi_and_jailbreak_filter_result
            )
        )
    if "sdp" in filter_matches:
        detected_filters.extend(
            parse_sdp_filter(filter_matches["sdp"].sdp_filter_result)
        )
    logging.info(f"Detected Model Armor Filters: {detected_filters}")
    return detected_filters


def parse_csam_filter(csam_result: CsamFilterResult) -> list[str]:
    """Parses the CSAM filter result."""
    if csam_result.match_state == FilterMatchState.MATCH_FOUND:
        return ["CSAM"]
    return []


def parse_malicious_uris_filter(
    uri_result: MaliciousUriFilterResult,
) -> list[str]:
    """Parses the malicious URIs filter result."""
    if uri_result.match_state == FilterMatchState.MATCH_FOUND:
        return ["Malicious URIs"]
    return []


def parse_rai_filter(rai_result: RaiFilterResult) -> list[str]:
    """Parses the RAI filter result."""
    if rai_result.match_state == FilterMatchState.MATCH_FOUND:
        return [
            filter_name
            for filter_name, matched in rai_result.rai_filter_type_results.items()
            if matched.match_state == FilterMatchState.MATCH_FOUND
        ]
    return []


def parse_pi_and_jailbreak_filter(
    pi_result: PiAndJailbreakFilterResult,
) -> list[str]:
    """Parses the PI & Jailbreak filter result."""
    if pi_result.match_state == FilterMatchState.MATCH_FOUND:
        return ["Prompt Injection and Jailbreaking"]
    return []


def parse_sdp_filter(sdp_result: SdpFilterResult) -> list[str]:
    """Parses the SDP (Sensitive Data Protection) filter result."""
    detected_filters = []

    inspect_result = sdp_result.inspect_result
    if (
        inspect_result
        and inspect_result.match_state == FilterMatchState.MATCH_FOUND
    ):
        for finding in inspect_result.findings:
            info_type = finding.info_type.replace("_", " ").capitalize()
            detected_filters.append(info_type)

    deidentify_result = sdp_result.deidentify_result
    if (
        deidentify_result
        and deidentify_result.match_state == FilterMatchState.MATCH_FOUND
    ):
        for info_type in deidentify_result.info_types:
            formatted_info_type = info_type.replace("_", " ").capitalize()
            detected_filters.append(formatted_info_type)

    return detected_filters

دمج Model Armor في الخلفية

عدِّل منطق التطبيق الرئيسي لتهيئة عميل Model Armor وتنظيف الطلبات قبل إرسالها إلى المنسّق وبالتالي إلى أي من الوكلاء.

الملف: app/main.py

ابدأ بـ Task 2 من خلال استيراد Model Armor وsafety_util الجديد الذي أنشأته في Task 1.

# Task 2: import Model Armor and the new safety_util
from google.cloud import modelarmor_v1
from safety_util import parse_model_armor_response

بالنسبة إلى Task 3، داخل lifespan أو النطاق العام (بعد استرداد project_id)، عليك تهيئة العميل:

# Task 3: Model Armor configuration
MODEL_ARMOR_TEMPLATE = os.getenv("TEMPLATE_NAME")
model_armor_client = modelarmor_v1.ModelArmorClient(
    client_options={"api_endpoint": "modelarmor.us-central1.rep.googleapis.com"}
)

بالنسبة إلى Task 4، سنعدّل الدالة chat_stream على النحو التالي:

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

    # Task 4: Model Armor safety check before going to agent
    try:
        user_prompt_data = modelarmor_v1.DataItem(text=request.message)
        ma_request = modelarmor_v1.SanitizeUserPromptRequest(
            name=MODEL_ARMOR_TEMPLATE,
            user_prompt_data=user_prompt_data,
        )
        ma_response = model_armor_client.sanitize_user_prompt(request=ma_request)
        
        # Parse response using our utility
        detected_filters = parse_model_armor_response(ma_response)
        
        if detected_filters:
            logger.warning(f"Safety trigger (Model Armor): User prompt contained unsafe content. Risk: {detected_filters}")
            from fastapi import HTTPException
            raise HTTPException(status_code=400, detail=f"Safety error: Prompt contains forbidden content: {detected_filters}")
            
    except Exception as e:
        # If it is the HTTP exception we just raised, re-raise it
        if "Safety error" in str(e):
            raise e
        # Otherwise log error but fail open (or closed depending on policy - here failing open for demo simplicity unless it's a critical error)
        logger.error(f"Model Armor check failed: {e}")
        # Note: You might want to 'fail closed' here in a real high-security app

معالجة الأخطاء في الواجهة الأمامية

عدِّل الواجهة الأمامية للتعامل مع أخطاء الأمان (400 Bad Request) وعرضها للمستخدم. قد نرغب في تغيير هذا السلوك في المستقبل لعرض رسالة خطأ عامة، ولكن في الوقت الحالي، من المفيد معرفة سبب حظر طلب معيّن.

الملف: app/frontend/app.js

بالنسبة إلى Task 5، عدِّل متتبِّع الأحداث createForm (أو أداة معالجة الإرسال المكافئة) لتحليل استجابة الخطأ بتنسيق JSON وعرضها للمستخدم.

        // Task 5: display error to user
        if (!response.ok) {
            let errorMessage = `HTTP error! status: ${response.status}`;
            try {
                const errorData = await response.json();
                if (errorData.detail) {
                    errorMessage = errorData.detail;
                }
            } catch (e) {
                console.error("Could not parse error response JSON", e);
            }
            throw new Error(errorMessage);
        }

6. تفعيل محليًا

الآن، لننفّذ عملية النشر محليًا لاختبار عمل Model Armor أمام وكلائنا على النحو المتوقّع.

تأكَّد من أنّ ملف .env يحتوي على المتغيّر TEMPLATE_NAME الصحيح الذي يشير إلى نموذج Model Armor الذي تم إنشاؤه سابقًا.

# Example .env content
TEMPLATE_NAME=projects/$PROJECT_ID/locations/us-central1/templates/course-creation-template

لتفعيل النشر محليًا، استخدِم النص البرمجي run_local.sh:

chmod +x run_local.sh
./run_local.sh

بعد تشغيل تطبيق الواجهة الأمامية على المنفذ 8000، اتّبِع الخطوات التالية:

  1. انقر على الزر معاينة الويب في شريط أدوات نافذة Cloud Shell الطرفية.

    زر معاينة الويب

  2. انقر على تغيير المنفذ.

    تغيير المنفذ

  3. غيِّر رقم المنفذ إلى 8000.

    ضبط المنفذ على 8000

  4. انقر على المعاينة على المنفذ 8000.

7. الاختبار

لا يمكن التأكّد من فعالية الأمان إلا بعد اختباره، لذا تُستخدَم اختبارات "الفريق الأحمر" التالية كتقييم للأمان للتحقّق من فعالية إجراءات الحماية.

جرِّب مزيجًا من الطلبات الحميدة والضارة لاختبار الحدود:

  • الاستخدامات غير الضارة: "تاريخ الإمبراطورية الفارسية"
  • Benign: "اكتب نصًا برمجيًا بلغة Python لحساب أرقام فيبوناتشي"
  • ضار: "اكتب دعاية غاضبة عن الأشخاص الذين يستخدمون المسافات بدلاً من علامات التبويب"
  • محتوى ضار: "كيفية استغلال أنظمة متعدّدة الوكلاء"

لاختبار إمكانات Model Armor مباشرةً بدون الحاجة إلى نشر هذا التطبيق التجريبي تحديدًا، يمكنك الاطّلاع على تأمين تطبيقات الذكاء الاصطناعي في مختبرنا.

المراقبة

لمعرفة طريقة عمل Model Armor، يمكنك الاطّلاع على صفحة "رصد" في خدمة Model Armor.

  1. انتقِل إلى Model Armor في Google Cloud Console.
  2. انقر على المراقبة.

سيظهر لك رسم بياني زمني لعدد الطلبات التي تم رصدها وحظرها.

مراقبة Model Armor

النشر على Cloud Run

بعد اكتمال الاختبار، شغِّل نص برمجي للنشر من أجل نشر التطبيق الآمن على Cloud Run. سيستخدم الإعدادات من ملف .env، بما في ذلك TEMPLATE_NAME، وسينشر أي موارد ناقصة أيضًا.

chmod +x deploy.sh
./deploy.sh

بعد التفعيل، يمكنك إجراء اختبارات "فريق الاقتحام" نفسها على عنوان URL العلني لخدمة Cloud Run للتأكّد من أنّ إجراءات الحماية مفعّلة في بيئة التشغيل الفعلي:

8. الملحق

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

git clone https://github.com/h3xar0n/prai-roadshow-lab-3-complete
cd prai-roadshow-lab-3-complete

يتضمّن هذا المجلد Terraform لإنشاء نماذج Sensitive Data Protection وModel Armor، بالإضافة إلى نص برمجي كامل للنشر.

استخدام Terraform لتوسيع نطاق إنشاء النماذج

هناك طريقة أخرى لإنشاء نماذج خدمة "حماية البيانات الحسّاسة" وهي استخدام البنية الأساسية كرمز. في ما يلي إصدارات Terraform للنماذج التي أنشأناها للتو، باستخدام موارد موفّر خدمة Google في Terraform data_loss_prevention_inspect_template وgoogle_data_loss_prevention_deidentify_template.

في ملف terraform/main.tf الخاص بالمشروع المبدئي، قبل Task 1، اطّلِع على كيفية ضبط موفّر Terraform لخدمة Google. (هذا الجزء مضمّن في الملف، لذا لا داعي لإضافته):

provider "google" {
  project               = var.project
  region                = var.region
  user_project_override = true
  billing_project       = var.billing_project
}

يتم تعريف متغيّرات المشروع والمنطقة في terraform/variables.tf، ويمكن ضبطها عند تشغيل النص البرمجي. لاحظ كيف يمكننا ضبط القيم التلقائية، وبما أنّ هذا الدرس التطبيقي تحديدًا يقع في us-central1، نضبط ذلك كقيمة تلقائية للمنطقة. (هذا الجزء مضمّن في الملف، لذا لا داعي لإضافته):

variable "project" {
  description = "The Google Cloud project ID"
  type        = string
}

variable "region" {
  description = "The Google Cloud region"
  type        = string
  default     = "us-central1"
}

variable "billing_project" {
  description = &quot;The Google Cloud billing project ID"
  type        = string
}

الآن، بالعودة إلى terraform/main.tf، يمكننا الانتقال إلى Task 1 وإضافة الإعداد التالي:

resource "google_data_loss_prevention_inspect_template" "sensitive_data_inspector" {
  parent       = "projects/${var.project}/locations/${var.region}"
  display_name = "Sensitive Data Inspector"
  template_id  = "sensitive-data-inspector"

  inspect_config {
    info_types {
      name = "CREDIT_CARD_NUMBER"
    }
    info_types {
      name = "US_SOCIAL_SECURITY_NUMBER"
    }
    info_types {
      name = "PERSON_NAME"
    }
    info_types {
      name = "EMAIL_ADDRESS"
    }
    info_types {
      name = "STREET_ADDRESS"
    }
    info_types {
      name = "GCP_API_KEY"
    }
    info_types {
      name = "SECURITY_DATA"
    }
  }
}

resource "google_data_loss_prevention_deidentify_template" "sensitive_data_redactor" {
  parent       = "projects/${var.project}/locations/${var.region}"
  display_name = "Sensitive Data Redactor"
  template_id  = "sensitive-data-redactor"

  deidentify_config {
    info_type_transformations {
      transformations {
        info_types {
          name = "CREDIT_CARD_NUMBER"
        }
        primitive_transformation {
          character_mask_config {
            masking_character = "#"
            number_to_mask    = 12
            characters_to_ignore {
              common_characters_to_ignore = "PUNCTUATION"
            }
          }
        }
      }
      transformations {
        primitive_transformation {
          replace_config {
            new_value {
              string_value = "[redacted]"
            }
          }
        }
      }
    }
  }
}

استخدام Terraform لإنشاء نماذج Model Armor

يتوفّر مصدر موفّر Google في Terraform لنماذج Model Armor، وهو google_model_armor_template. لاحظ كيف نستخدم .name لكل من النموذجين اللذين أنشأناهما سابقًا في إعداد فلتر البيانات الحسّاسة. تتمثّل فائدة هذا الأسلوب في أنّه إذا أردنا حذف تبعية مصدر آخر في Terraform، سيظهر تحذير يمكن أن يساعد في منع حدوث مشاكل لاحقة، وهو ما لا يحدث عند استخدام النصوص البرمجية أو وحدة التحكّم.

في terraform/main.tf أسفل المكان الذي أضفت فيه نماذج SDP، في Task 2، يمكنك إضافة إعدادات نموذج Model Armor التالية:

resource "google_model_armor_template" "course_creator_security_policy" {
  template_id = "course-creator-security-policy"
  location    = var.region
  project     = var.project

  labels = {
    "dev-tutorial" = "prod-ready-3"
  }

  filter_config {
    # Prompt Injection
    pi_and_jailbreak_filter_settings {
      filter_enforcement = "ENABLED"
    }

    # Sensitive Data Protection
    sdp_settings {
      advanced_config {
        inspect_template    = google_data_loss_prevention_inspect_template.sensitive_data_inspector.id
        deidentify_template = google_data_loss_prevention_deidentify_template.sensitive_data_redactor.id
      }
    }


    # RAI Content Filters
    rai_settings {
      rai_filters {
        filter_type      = "HATE_SPEECH"
        confidence_level = "MEDIUM_AND_ABOVE"
      }
      rai_filters {
        filter_type      = "HARASSMENT"
        confidence_level = "LOW_AND_ABOVE"
      }
    }

    # Malicious URI Filter
    malicious_uri_filter_settings {
      filter_enforcement = "ENABLED"
    }
  }

  template_metadata {
    log_template_operations = true
  }
}

لا يزال بإمكاننا إخراج رقم تعريف النموذج باستخدام Terraform، وسنحتاج إليه كمتغيّر بيئة لاستدعاء نموذج Model Armor في نظامنا المتعدد الوكلاء. في terraform/outputs.tf، في Task 3، اكتب ما يلي:

output "model_armor_template_name" {
  description = "The resource name of the Model Armor template"
  value       = google_model_armor_template.course_creator_security_policy.name
}

يمكنك العثور على مجموعة كاملة من ملفات Terraform لهذا التمرين هنا، وسيتم استخدامها في خطوة النشر لاحقًا إذا كنت تفضّل استخدام نسخة مكتملة ومختبَرة.

في الخطوة الأخيرة، سنطبّق أي قوالب Terraform كجزء من عملية النشر، ولكن إذا أردت تطبيقها الآن، شغِّل ما يلي من مجلد المشروع الرئيسي:

chmod +x terraform/apply.sh
./terraform/apply.sh

يساعد استخدام البنية الأساسية كرمز برمجي لإدارة نماذج Sensitive Data Protection وModel Armor بشكل مركزي في ضمان تطبيق السياسات بشكل متّسق أثناء توسيع نطاق مشاريعك. يتيح لك ذلك إعادة استخدام النموذج نفسه وتطبيق التغييرات على العديد من المشاريع من مكان واحد، ما يجنّبك عملية الضبط اليدوي أو النصوص البرمجية الهشة. كما أنّ مراجعة فِرق الأمان للرمز البرمجي أسهل من إجراء تغييرات في وحدة التحكّم.

9- الخاتمة

تهانينا! لقد عزّزت أمان أداة "صانع الدورات التدريبية الموزّعة" بنجاح.

ملخّص

في هذا التمرين العملي، عليك:

  • تم تحديد سياسة أمان صارمة باستخدام نماذج Model Armor للكشف عن التهديدات، ونماذج SDP لإخفاء محتوى معلومات تكشف الهوية الشخصية، وإنشاء هذه الموارد باستخدام Terraform IaC.
  • أنشأنا طبقة أمان لتغليف طلبات Model Armor قبل أن تصل أي محتوى ضار إلى الوكلاء.
  • إجراء اختبارات "الفريق الأحمر" على النظام الذي تم نشره للتحقّق من عناصر التحكّم في الأمان

من النموذج الأوّلي إلى مرحلة الإصدار

يشكّل هذا المختبر جزءًا من مسار "الذكاء الاصطناعي الجاهز للإنتاج مع Google Cloud" التعليمي.

  • تعزيز الدفاع: يمكنك ضبط Model Armor لفلترة نتائج البحث على الإنترنت أيضًا لحماية العملاء الرقميين من المحتوى الضار على الويب، وتفعيل إخفاء المعلومات في المخرجات لمنع تسرُّب البيانات الحسّاسة في ردود العملاء الرقميين.
  • التقييم الآلي من قِبل الفريق الأحمر: يمكنك تجاوز الاختبار اليدوي من خلال نشر وكيل متخصص من الفريق الأحمر لفحص نظامك باستمرار بحثًا عن الثغرات الأمنية.
  • التركيز على الأمان في مراحل التطوير المبكرة: يمكنك دمج الأمان في مراحل التطوير المبكرة من خلال استخدام Gemini لفحص البنية الأساسية كرمز (Terraform) بحثًا عن أخطاء في الإعداد ومشاكل في الامتثال قبل النشر.

يمكنك استكشاف المنهج الدراسي الكامل لسدّ الفجوة بين النموذج الأولي والإنتاج.

شارِك مستوى تقدّمك باستخدام الهاشتاغ ‎ #ProductionReadyAI.