ایمن سازی مدل های ML و مالکیت معنوی با استفاده از فضای محرمانه

1. بررسی اجمالی

Confidential Space یک محیط امن برای همکاری بین چند طرف ارائه می دهد. این آزمایشگاه کد نشان می‌دهد که چگونه می‌توان از فضای محرمانه برای محافظت از دارایی‌های معنوی حساس، مانند مدل‌های یادگیری ماشینی استفاده کرد.

در این کد لبه، شما از فضای محرمانه استفاده خواهید کرد تا یک شرکت را قادر کنید به طور ایمن مدل یادگیری ماشینی اختصاصی خود را با شرکت دیگری که مایل به استفاده از مدل است به اشتراک بگذارد. به طور خاص، شرکت Primus دارای یک مدل یادگیری ماشینی است که فقط برای حجم کاری در حال اجرا در فضای محرمانه منتشر می شود و به Primus امکان می دهد کنترل کامل بر مالکیت معنوی خود را حفظ کند. شرکت Secundus اپراتور حجم کار خواهد بود و حجم کار یادگیری ماشین را در یک فضای محرمانه اجرا خواهد کرد. Secundus این مدل را بارگیری می کند و با استفاده از داده های نمونه متعلق به Secundus استنتاجی را اجرا می کند.

در اینجا Primus نویسنده حجم کاری است که کد حجم کار را می نویسد، و یک همکار که می خواهد از مالکیت معنوی خود در برابر اپراتور حجم کار نامعتبر، Secundus محافظت کند. Secundus اپراتور حجم کار بار کاری یادگیری ماشین است.

5a86c47d935da998.jpeg

چیزی که یاد خواهید گرفت

  • چگونه محیطی را پیکربندی کنیم که در آن یک طرف بتواند مدل ML اختصاصی خود را با طرف دیگر بدون از دست دادن کنترل بر مالکیت معنوی خود به اشتراک بگذارد.

آنچه شما نیاز دارید

نقش های دخیل در تنظیم فضای محرمانه

در این کد لبه، Company Primus مالک منبع و نویسنده حجم کاری خواهد بود که مسئولیت موارد زیر را بر عهده خواهد داشت:

  1. راه اندازی منابع ابری مورد نیاز با یک مدل یادگیری ماشینی
  2. نوشتن کد حجم کار
  3. انتشار تصویر حجم کار
  4. در حال پیکربندی خط مشی مخزن هویت حجم کاری برای محافظت از مدل ML در برابر یک اپراتور نامعتبر

شرکت سکوندوس اپراتور و مسئول موارد زیر خواهد بود:

  1. تنظیم منابع ابری مورد نیاز برای ذخیره تصاویر نمونه استفاده شده توسط حجم کار و نتایج
  2. اجرای بار کاری ML در فضای محرمانه با استفاده از مدل ارائه شده توسط Primus

نحوه عملکرد فضای محرمانه

هنگامی که حجم کاری را در فضای محرمانه اجرا می کنید، با استفاده از منابع پیکربندی شده، فرآیند زیر انجام می شود:

  1. حجم کاری یک رمز دسترسی عمومی Google برای $PRIMUS_SERVICEACCOUNT از Workload Identity Pool درخواست می‌کند. این توکن خدمات تأیید صحت را با حجم کار و ادعاهای محیطی ارائه می دهد.
  2. اگر ادعاهای اندازه‌گیری حجم کاری در نشانه خدمات تأییدکننده تأیید با شرایط ویژگی در WIP مطابقت داشته باشد، رمز دسترسی را برای $PRIMUS_SERVICEACCOUNT.
  3. حجم کار از رمز دسترسی به حساب سرویس مرتبط با $PRIMUS_SERVICEACCOUNT برای دسترسی به مدل یادگیری ماشینی ذخیره شده در سطل $PRIMUS_INPUT_STORAGE_BUCKET استفاده می کند.
  4. حجم کار عملیاتی را بر روی داده های متعلق به سکوندوس انجام می دهد و این حجم کاری توسط سکوندوس در پروژه خود اداره و اجرا می شود.
  5. حجم کار از حساب سرویس $WORKLOAD_SERVICEACCOUNT برای نوشتن نتایج آن عملیات در سطل $SECUNDUS_RESULT_STORAGE_BUCKET استفاده می کند.

2. منابع ابری را راه اندازی کنید

قبل از شروع

  • این مخزن را با استفاده از دستور زیر کلون کنید تا اسکریپت های مورد نیازی که به عنوان بخشی از این کد لبه استفاده می شود را دریافت کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • دایرکتوری این کد لبه را تغییر دهید.
cd confidential-space/codelabs/ml_model_protection/scripts
  • اطمینان حاصل کنید که متغیرهای محیط پروژه مورد نیاز را مطابق شکل زیر تنظیم کرده اید. برای اطلاعات بیشتر در مورد راه اندازی یک پروژه GCP، لطفاً به این کد لبه مراجعه کنید. برای دریافت جزئیات در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه می توانید به این قسمت مراجعه کنید.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • با استفاده از دستور زیر مقادیری را برای نام منابع مشخص شده در بالا به متغیرها اختصاص دهید. این متغیرها به شما این امکان را می‌دهند که نام منابع را در صورت نیاز سفارشی کنید و همچنین در صورت ایجاد منابع موجود، از آنها استفاده کنید. (مثلاً export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' )
  1. می توانید متغیرهای زیر را با نام منابع ابری موجود در پروژه Primus تنظیم کنید. اگر متغیر تنظیم شده باشد، منبع ابری مربوطه از پروژه Primus استفاده خواهد شد. اگر متغیر تنظیم نشده باشد، نام منبع ابری از نام پروژه ایجاد می‌شود و منبع ابری جدید با آن نام ایجاد می‌شود. در زیر متغیرهای پشتیبانی شده برای نام منابع آمده است:

$PRIMUS_INPUT_STORAGE_BUCKET

سطلی که مدل یادگیری ماشینی Primus را ذخیره می کند.

$PRIMUS_WORKLOAD_IDENTITY_POOL

مجموعه شناسایی حجم کاری (WIP) Primus که ادعاها را تأیید می کند.

$PRIMUS_WIP_PROVIDER

ارائه‌دهنده مجموعه هویت حجم کاری Primus که شامل شرایط مجوز برای استفاده برای توکن‌های امضا شده توسط سرویس تأییدکننده گواهی است.

$PRIMUS_SERVICE_ACCOUNT

حساب سرویس Primus که $PRIMUS_WORKLOAD_IDENTITY_POOL از آن برای دسترسی به منابع محافظت شده استفاده می کند (مدل ML در این Codelab). در این مرحله مجوز خواندن مدل یادگیری ماشینی ذخیره شده در سطل $PRIMUS_INPUT_STORAGE_BUCKET را دارد.

$PRIMUS_ARTIFACT_REPOSITORY

مخزن مصنوع که در آن بار کاری تصویر Docker تحت فشار قرار می گیرد.

  1. می توانید متغیرهای زیر را با نام منابع ابری موجود در پروژه Secundus تنظیم کنید. اگر متغیر تنظیم شده باشد، منبع ابری مربوطه از پروژه سکوندوس استفاده خواهد شد. اگر متغیر تنظیم نشده باشد، نام منبع ابری از نام پروژه ایجاد می‌شود و یک منبع ابری جدید با آن نام ایجاد می‌شود. در زیر متغیرهای پشتیبانی شده برای نام منابع آمده است:

$SECUNDUS_INPUT_STORAGE_BUCKET

سطلی که تصاویر نمونه ای را ذخیره می کند که سکوندوس می خواهد با استفاده از مدل ارائه شده توسط Primus طبقه بندی کند.

$SECUNDUS_RESULT_STORAGE_BUCKET

سطلی که نتایج حجم کار را ذخیره می کند.

$WORKLOAD_IMAGE_NAME

نام تصویر ظرف حجم کاری.

$WORKLOAD_IMAGE_TAG

برچسب تصویر ظرف حجم کار.

$WORKLOAD_SERVICE_ACCOUNT

حساب سرویسی که اجازه دسترسی به VM محرمانه را دارد که حجم کار را اجرا می کند.

  • برای این دو پروژه به مجوزهای خاصی نیاز دارید و می توانید به این راهنما در مورد نحوه اعطای نقش های IAM با استفاده از کنسول GCP مراجعه کنید:
  • برای $PRIMUS_PROJECT_ID ، به Storage Admin، Artifact Registry Administrator، Service Account Admin، IAM Workload Identity Pool Admin نیاز دارید.
  • برای $SECUNDUS_PROJECT_ID ، به سرپرست محاسباتی، سرپرست فضای ذخیره‌سازی، سرپرست حساب سرویس، سرپرست استخر شناسایی حجم کار IAM، سرپرست امنیت (اختیاری) نیاز دارید.
  • اسکریپت زیر را اجرا کنید تا نام متغیرهای باقیمانده را بر اساس شناسه پروژه خود برای نام منابع تنظیم کنید.
source config_env.sh

منابع شرکت Primus را تنظیم کنید

به عنوان بخشی از این مرحله، منابع ابری مورد نیاز را برای Primus تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع Primus اجرا کنید. منابع زیر به عنوان بخشی از اجرای اسکریپت ایجاد خواهند شد:

  • سطل ذخیره‌سازی ابری ( $PRIMUS_INPUT_STORAGE_BUCKET ) برای ذخیره‌سازی مدل یادگیری ماشینی Primus.
  • مجموعه هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگی‌هایی که تحت ارائه‌دهنده آن پیکربندی شده‌اند.
  • حساب سرویس ( $PRIMUS_SERVICEACCOUNT ) متصل به مخزن هویت بار کاری ذکر شده ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) با دسترسی IAM برای خواندن داده‌ها از سطل ذخیره‌سازی ابری (با استفاده از نقش objectViewer ) و برای اتصال این حساب سرویس به مخزن هویت بار کاری (با استفاده roles/iam.workloadIdentityUser نقش کاربر).

به عنوان بخشی از این تنظیم منابع ابری، ما از یک مدل TensorFlow استفاده خواهیم کرد. ما می‌توانیم کل مدل را که شامل معماری، وزن‌ها و پیکربندی آموزشی مدل است در یک آرشیو ZIP ذخیره کنیم. برای اهداف این آزمایشگاه کد، از مدل MobileNet V1 آموزش داده شده بر روی مجموعه داده ImageNet که در اینجا یافت می شود استفاده خواهیم کرد.

./setup_primus_company_resources.sh

اسکریپت فوق منبع ابر را راه‌اندازی می‌کند، اکنون مدل را در سطل ذخیره‌سازی ابری ایجاد شده توسط اسکریپت دانلود و منتشر می‌کنیم.

  1. مدل از قبل آموزش دیده را از اینجا دانلود کنید.
  2. پس از دانلود، نام فایل tar دانلود شده را به model.tar.gz تغییر دهید.
  3. فایل model.tar.gz را با استفاده از دستور زیر از دایرکتوری حاوی فایل model.tar.gz در سطل فضای ذخیره سازی ابری منتشر کنید.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

منابع شرکت سکوندوس را تنظیم کنید

به عنوان بخشی از این مرحله، شما منابع ابری مورد نیاز را برای Secundus تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع Secundus اجرا کنید. به عنوان بخشی از این مراحل، منابع زیر ایجاد خواهد شد:

  • سطل ذخیره سازی ابری ( $SECUNDUS_INPUT_STORAGE_BUCKET ) برای ذخیره تصاویر نمونه برای اجرای استنتاج توسط Secundus.
  • سطل ذخیره سازی ابری ( $SECUNDUS_RESULT_STORAGE_BUCKET ) برای ذخیره نتیجه اجرای بار کاری ML توسط Secundus.

برخی از تصاویر نمونه در اینجا برای این Codelab در دسترس هستند.

./setup_secundus_company_resources.sh

3. بار کاری ایجاد کنید

حساب سرویس حجم کاری ایجاد کنید

اکنون، یک حساب کاربری برای حجم کاری با نقش ها و مجوزهای مورد نیاز ایجاد خواهید کرد. اسکریپت زیر را اجرا کنید تا یک حساب سرویس بار کاری در پروژه Secundus ایجاد کنید. این حساب سرویس توسط VM که بار کاری ML را اجرا می کند استفاده می شود.

این حساب سرویس حجم کاری ( $WORKLOAD_SERVICEACCOUNT ) نقش های زیر را خواهد داشت:

  • confidentialcomputing.workloadUser برای دریافت نشانه گواهی
  • logging.logWriter برای نوشتن گزارش در Cloud Logging.
  • objectViewer برای خواندن داده ها از $SECUNDUS_INPUT_STORAGE_BUCKET سطل ذخیره سازی ابری.
  • objectUser برای نوشتن نتیجه بار کاری در سطل ذخیره سازی ابری $SECUNDUS_RESULT_STORAGE_BUCKET .
./create_workload_service_account.sh

حجم کاری ایجاد کنید

به عنوان بخشی از این مرحله، یک تصویر Docker حجم کاری ایجاد می کنید. حجم کار توسط Primus نوشته خواهد شد. حجم کاری مورد استفاده در این کد لبه کد پایتون یادگیری ماشینی است که به مدل ML ذخیره شده در سطل ذخیره‌سازی Primus دسترسی پیدا می‌کند و استنتاج‌هایی را با تصاویر نمونه ذخیره شده در یک سطل ذخیره‌سازی اجرا می‌کند.

مدل یادگیری ماشینی که در سطل ذخیره‌سازی Primus ذخیره می‌شود، تنها با بارهای کاری که شرایط ویژگی‌های مورد نیاز را برآورده می‌کنند قابل دسترسی است. این شرایط ویژگی با جزئیات بیشتر در بخش بعدی در مورد مجوز بار کاری توضیح داده شده است.

در اینجا متد run_inference() از حجم کاری است که در این کد لبه ایجاد و استفاده خواهد شد. می‌توانید کل کد حجم کار را در اینجا پیدا کنید.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

اسکریپت زیر را اجرا کنید تا یک بار کاری ایجاد کنید که در آن مراحل زیر در حال انجام است:

  • ایجاد رجیستری مصنوع ( $PRIMUS_ARTIFACT_REGISTRY ) متعلق به Primus.
  • کد حجم کار را با نام منابع مورد نیاز به روز کنید.
  • حجم کاری ML را بسازید و Dockerfile را برای ساختن تصویر داکر از کد بار کاری ایجاد کنید. در اینجا Dockerfile مورد استفاده برای این Codelab است.
  • تصویر Docker را در رجیستری مصنوع ( $PRIMUS_ARTIFACT_REGISTRY ) متعلق به Primus بسازید و منتشر کنید.
  • به $WORKLOAD_SERVICEACCOUNT اجازه خواندن برای $PRIMUS_ARTIFACT_REGISTRY اعطا کنید. این برای محفظه بار کاری لازم است تا تصویر داکر بار کاری را از رجیستری مصنوع بیرون بکشد.
./create_workload.sh

علاوه بر این، بارهای کاری را می توان برای اطمینان از بارگیری نسخه مورد انتظار مدل یادگیری ماشین با بررسی هش یا امضای مدل قبل از استفاده، کدگذاری کرد. مزیت چنین بررسی های اضافی این است که یکپارچگی مدل یادگیری ماشین را تضمین می کند. با این کار، اپراتور حجم کار همچنین باید تصویر حجم کاری یا پارامترهای آن را به روز کند، زمانی که انتظار می رود حجم کاری از نسخه های مختلف مدل ML استفاده کند.

4. مجوز و اجرای Workload

مجوز بار کاری

Primus می خواهد بارهای کاری را برای دسترسی به مدل یادگیری ماشین خود بر اساس ویژگی های منابع زیر مجاز کند:

  • چه : کدی که تأیید شده است
  • کجا : محیطی که امن است
  • Who : اپراتور مورد اعتماد

Primus از فدراسیون هویت Workload برای اعمال خط مشی دسترسی بر اساس این الزامات استفاده می کند. فدراسیون هویت بار کاری به شما امکان می دهد شرایط ویژگی را مشخص کنید. این شرایط شناسایی هویت‌هایی را که می‌توانند با استخر شناسایی حجم کاری (WIP) احراز هویت شوند، محدود می‌کند. می‌توانید برای ارائه اندازه‌گیری‌ها و اجرای خط‌مشی، سرویس تأییدکننده گواهی را به عنوان ارائه‌دهنده مجموعه هویت حجم کاری به WIP اضافه کنید.

مجموعه هویت بار کاری قبلاً به عنوان بخشی از مرحله تنظیم منابع ابری ایجاد شده بود. اکنون Primus یک ارائه‌دهنده اطلاعات جمع‌آوری اطلاعات OIDC ایجاد می‌کند. --attribute-condition مشخص شده اجازه دسترسی به محفظه بار کاری را می دهد. مستلزم این است:

  • چه چیزی : آخرین $WORKLOAD_IMAGE_NAME آپلود شده در مخزن $PRIMUS_ARTIFACT_REPOSITORY .
  • کجا : محیط اجرای مورد اعتماد فضای محرمانه روی تصویر کاملاً پشتیبانی شده از فضای مجازی مجازی محرمانه در حال اجرا است.
  • چه کسی : حساب سرویس $WORKLOAD_SERVICE_ACCOUNT Secundus.
export WORKLOAD_IMAGE_DIGEST=$(docker images –digests ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}| awk 'NR>1{ print $3 }')
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

حجم کار را اجرا کنید

به عنوان بخشی از این مرحله، حجم کار را در Confidential Space VM اجرا خواهیم کرد. آرگومان های TEE مورد نیاز با استفاده از پرچم ابرداده منتقل می شوند. آرگومان‌های محفظه حجم کاری با استفاده از بخش « tee-cmd » پرچم ارسال می‌شوند. نتیجه اجرای حجم کار در $SECUNDUS_RESULT_STORAGE_BUCKET منتشر خواهد شد.

gcloud config set project $SECUNDUS_PROJECT_ID
gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

مشاهده نتایج

پس از تکمیل بار کاری با موفقیت، نتیجه بار کاری ML در $SECUNDUS_RESULT_STORAGE_BUCKET منتشر خواهد شد.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

در اینجا چند نمونه از اینکه نتایج استنتاج در تصاویر نمونه ممکن است به نظر برسد، آمده است:

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

برای هر تصویر نمونه در یک سطل ذخیره سازی Secundus، یک ورودی در نتایج خواهید دید. این مدخل شامل دو بخش کلیدی اطلاعات است:

  • Index of predicted_class: این یک شاخص عددی است که نشان دهنده کلاسی است که مدل پیش بینی می کند تصویر متعلق به آن است.
  • Top_k_predictions: تا k پیش بینی تصویر را ارائه می دهد که از بیشترین تا کم احتمال ترین رتبه بندی می شود. مقدار k در این Codelab روی 5 تنظیم شده است، اما می توانید آن را در کد حجم کاری تنظیم کنید تا پیش بینی های بیشتر یا کمتری داشته باشید.

برای ترجمه ایندکس کلاس به نام کلاس قابل خواندن توسط انسان، به لیست برچسب های موجود در اینجا مراجعه کنید. به عنوان مثال، اگر یک شاخص کلاس 2 را مشاهده کنید، با برچسب کلاس "tench" در لیست برچسب ها مطابقت دارد.

در این کد لبه، ما نشان داده‌ایم که مدلی متعلق به Primus است که فقط برای حجم کاری در حال اجرا در TEE آزاد می‌شود. Secundus حجم کاری ML را در TEE اجرا می کند و این حجم کاری می تواند مدل متعلق به Primus را مصرف کند در حالی که Primus کنترل کامل بر مدل را حفظ می کند.

بار کاری غیرمجاز را اجرا کنید

Secundus تصویر بار کاری را با کشیدن یک تصویر بار کاری متفاوت از مخزن مصنوع خود که توسط Primus مجاز نیست، تغییر می دهد. مجموعه هویت حجم کاری Primus فقط ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG مجاز کرده است.

بار کاری را دوباره اجرا کنید

هنگامی که Secundus سعی می کند حجم کار اصلی را با این تصویر بار کاری جدید اجرا کند، با شکست مواجه می شود. برای مشاهده خطا، فایل اصلی نتایج و نمونه VM را حذف کنید و سپس دوباره سعی کنید بار کاری را اجرا کنید.

لطفاً مطمئن شوید که یک تصویر داکر جدید تحت رجیستری مصنوع Secundus (به‌عنوان us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG} ) و حساب سرویس بار کاری ( $WORKLOAD_SERVICEACCOUNT منتشر شده است. $WORKLOAD_SERVICEACCOUNT ) به خواننده رجیستری مصنوع اجازه داده است تا این تصویر بار کاری جدید را بخواند. این کار برای اطمینان از اینکه بار کاری قبل از اینکه خط مشی WIP Primus توکن ارائه شده توسط بار کاری را رد کند، خارج نمی شود.

فایل نتایج موجود و نمونه VM را حذف کنید

  1. پروژه را روی پروژه $SECUNDUS_PROJECT_ID تنظیم کنید.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. فایل نتیجه را حذف کنید.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. نمونه Confidential VM را حذف کنید.
gcloud compute instances delete ${WORKLOAD_VM}

بار کاری غیرمجاز را اجرا کنید:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \ 
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

مشاهده خطا

به جای نتایج حجم کار، یک خطا مشاهده می کنید ( The given credential is rejected by the attribute condition ).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

5. پاکسازی کنید

در اینجا اسکریپتی است که می تواند برای پاکسازی منابعی که به عنوان بخشی از این کد لبه ایجاد کرده ایم استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:

  • سطل ذخیره سازی ورودی Primus ( $PRIMUS_INPUT_STORAGE_BUCKET) .
  • حساب سرویس Primus ( $PRIMUS_SERVICEACCOUNT ).
  • مخزن مصنوع Primus ( $PRIMUS_ARTIFACT_REPOSITORY ).
  • مجموعه هویت بار کاری Primus ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • حساب خدمات بار کاری Secundus ( $WORKLOAD_SERVICEACCOUNT ).
  • سطل ذخیره سازی ورودی Secundus ( $SECUNDUS_INPUT_STORAGE_BUCKET) .
  • نمونه های محاسبه حجم کار
  • سطل ذخیره سازی نتیجه Secundus ( $SECUNDUS_RESULT_STORAGE_BUCKET ).
$ ./cleanup.sh

اگر کاوش را تمام کرده اید، لطفاً پروژه خود را حذف کنید.

  • به کنسول Cloud Platform بروید
  • پروژه‌ای را که می‌خواهید تعطیل کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید: با این کار، پروژه برای حذف برنامه‌ریزی می‌شود.

بعدش چی؟

برخی از این کدهای مشابه را بررسی کنید...