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

1. مقدمة

نظرة عامة

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

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

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

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

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

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

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 برقم تعريف مشروعك.
  1. فعِّل واجهة برمجة التطبيقات لكلّ من 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
    
  2. اضبط المنطقة التلقائية التي سيتم نشر خدمات Cloud Run فيها.
    gcloud config set run/region us-central1
    
    تأكد من استخدامكus-central1 من أجل الوصول إلى نموذج الدروع وللحصول على أمثلة متسقة. يمكنك الاطّلاع على المناطق التي تتوفّر فيها أداة Model Armor هنا.

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

  1. استنسِخ الرمز الأولي وغيِّر الدليل إلى جذر المشروع.
    git clone https://github.com/h3xar0n/prai-roadshow-lab-3-starter
    cd prai-roadshow-lab-3-starter
    
    لبدء مساحة عمل Cloud Shell، شغِّل الأمر التالي:
    cloudshell workspace .
    
    يستخدم صالة > المحطة الجديدة لفتح نافذة طرفية جديدة.
  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 (هذا ضروري للعمل مع نموذج الدروع.)
  5. انقر على متابعة.
  6. في ضبط عملية الرصد، انقر على إدارة infoTypes.
  7. باستخدام عامل التصفية، ابحث عن infoTypes التالية، ثم حدد خانة الاختيار بجوار كل منها:
    • CREDIT_CARD_NUMBER
    • GOVERNMENT_ID
    • PERSON_NAME
    • EMAIL_ADDRESS
    • STREET_ADDRESS
    • SECURITY_DATA
  8. حدِّد أي مواضيع أخرى تهمّك أيضًا، ثم انقر على تم.
  9. على اليسار، يمكنك اختبار ما سيكون عليه الإدخال والإخراج لأنواع المعلومات الحسّاسة المختلفة التي اخترتها.

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

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

إنشاء نموذج لإخفاء الهوية

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

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

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

اختبار القالب بدون تحديد الهوية

أصبحت هذه النماذج الآن جاهزة ليتم استدعاؤها من خلال 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 وتنظيف الطلبات قبل إرسالها إلى المنسّق وبالتالي إلى أي من الوكلاء.

الملف: 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 طلب غير صالح) وعرضها للمستخدم. قد نغيّر هذا السلوك في المستقبل لعرض رسالة خطأ عامة، ولكن في الوقت الحالي، من المفيد معرفة سبب حظر طلب معيّن.

الملف: 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. الاختبار

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

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

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

لاختبار إمكانات 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 = "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

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

9. الخاتمة

تهانينا! لقد عزّزت أمان أداة Distributed Course Creator بنجاح.

ملخّص

في هذه الميزة الاختبارية، يمكنك:

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

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

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

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

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

شارك تقدمك باستخدام الهاشتاج #ProductionReadyAI.