1. بررسی اجمالی
آیا آمادهاید تا امنیت و حریم خصوصی بارهای کاری شتابدهی شده توسط GPU خود را افزایش دهید؟ این آزمایشگاه کد شما را از طریق قابلیتهای Trusted Space راهنمایی میکند، پیشنهادی برای ارائه ایزولهسازی قوی اپراتور و پشتیبانی شتابدهنده برای بارهای کاری حساس AI/ML شما.
حفاظت از دادهها، مدلها و کلیدهای ارزشمند از همیشه مهمتر است. Trusted Space با اطمینان از اینکه بارهای کاری شما در یک محیط امن و قابل اعتماد کار می کنند که حتی اپراتور حجم کاری نیز به آن دسترسی ندارد، راه حلی ارائه می دهد.
در اینجا چیزی است که Trusted Space ارائه می دهد:
- حفظ حریم خصوصی و امنیت پیشرفته: Trusted Space یک محیط اجرایی قابل اعتماد را فراهم میکند که در آن داراییهای حساس شما (مانند مدلها، دادههای ارزشمند و کلیدها) محافظت میشوند، که توسط اثبات رمزنگاری پشتیبانی میشود.
- جداسازی اپراتور: نگرانی در مورد تداخل اپراتور را از بین ببرید. با Trusted Space، حتی اپراتورهای حجم کاری شما نیز دسترسی ندارند و از SSHing، دسترسی به دادهها، نصب نرمافزار یا دستکاری کد شما جلوگیری میکند.
- پشتیبانی از شتاب دهنده: Trusted Space برای کار یکپارچه با طیف گسترده ای از شتاب دهنده های سخت افزاری، از جمله GPU هایی مانند H100، A100، T4 و L4 طراحی شده است. این تضمین میکند که برنامههای کاربردی AI/ML که از نظر عملکرد حیاتی هستند، به خوبی اجرا شوند.
چیزی که یاد خواهید گرفت
- درک پیشنهادات کلیدی Trusted Space را به دست آورید.
- با نحوه استقرار و پیکربندی یک محیط Trusted Space برای ایمن سازی دارایی های ارزشمند از حجم کاری AI/Ml خود آشنا شوید.
آنچه شما نیاز دارید
- یک پروژه Google Cloud Platform
- دانش اولیه موتور محاسباتی گوگل و شتاب دهنده ها .
- دانش اولیه حساب های خدمات , مدیریت کلید , فدراسیون هویت حجم کار و شرایط ویژگی .
- دانش اولیه کانتینرها و ثبت مصنوعات
حفاظت از درخواست های تولید کد حساس با شرکت Primus
در این کد لبه، ما به جای شرکت Primus قدم می گذاریم، شرکتی که حریم خصوصی و امنیت داده های کارکنان خود را در اولویت قرار می دهد. Primus می خواهد یک مدل تولید کد را برای کمک به توسعه دهندگان خود در وظایف کدنویسی خود مستقر کند. با این حال، آنها نگران محافظت از محرمانه بودن درخواستهای ارسال شده توسط کارکنان خود هستند، زیرا این درخواستها اغلب حاوی کدهای حساس، جزئیات پروژه داخلی یا الگوریتمهای اختصاصی هستند.
چرا شرکت پریموس به اپراتور اعتماد ندارد؟
Primus Corp در یک بازار بسیار رقابتی فعالیت می کند. پایگاه کد آنها حاوی دارایی معنوی ارزشمندی است، از جمله الگوریتمهای اختصاصی و کدهای حساس که مزیت رقابتی را فراهم میکنند. آنها در مورد امکان جاسوسی شرکتی توسط اپراتورهای حجم کاری نگران هستند. علاوه بر این، درخواستهای کارکنان ممکن است شامل بخشهای محرمانه «نیاز به دانستن» از کدهایی باشد که Primus Corp میخواهد از آن محافظت کند.
برای رفع این نگرانی، Primus Corp از Trusted Space استفاده می کند تا سرور استنتاجی را که مدل را برای تولید کد اجرا می کند، جدا کند. در اینجا نحوه کار آن آمده است:
- رمزگذاری سریع: قبل از ارسال درخواست به سرور استنتاج، هر کارمند آن را با استفاده از یک کلید KMS که توسط Primus Corp در Google Cloud مدیریت میشود، رمزگذاری میکند. این تضمین میکند که فقط محیط Trusted Space، جایی که کلید رمزگشایی مربوطه در دسترس است، میتواند آن را رمزگشایی کند و به درخواست متن ساده دسترسی پیدا کند. در یک سناریوی دنیای واقعی، رمزگذاری سمت سرویس گیرنده را می توان توسط کتابخانه های موجود (به عنوان مثال tink ) مدیریت کرد. به عنوان بخشی از این کد، ما از این نمونه برنامه مشتری با رمزگذاری پاکت استفاده خواهیم کرد.
- جداسازی اپراتور: فقط سرور استنتاج که در یک محیط Trusted Space اجرا میشود، به کلید مورد استفاده برای رمزگذاری دسترسی خواهد داشت و میتواند درخواست را در یک محیط مطمئن رمزگشایی کند. دسترسی به کلید رمزگذاری توسط Workload Identity Pool محافظت می شود. با توجه به تضمین های ایزوله Trusted Space، حتی اپراتور حجم کاری نیز نمی تواند به کلید مورد استفاده برای رمزگذاری و محتوای رمزگشایی شده دسترسی داشته باشد.
- استنتاج امن با استفاده از شتاب دهنده(ها): سرور استنتاج بر روی یک ماشین مجازی محافظت شده (به عنوان بخشی از راه اندازی فضای مطمئن) راه اندازی می شود که این اطمینان را ایجاد می کند که نمونه حجم کار توسط بدافزارها یا روت کیت ها در سطح بوت یا هسته در معرض خطر قرار نگرفته است. این سرور درخواست را در محیط Trusted Space رمزگشایی می کند، استنتاج را با استفاده از مدل تولید کد انجام می دهد و کد تولید شده را به کارمند برمی گرداند.
2. منابع ابری را راه اندازی کنید
قبل از شروع
- این مخزن را با استفاده از دستور زیر کلون کنید تا اسکریپت های مورد نیازی که به عنوان بخشی از این کد لبه استفاده می شود را دریافت کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- دایرکتوری این کد لبه را تغییر دهید.
cd confidential-space/codelabs/trusted_space_codelab/scripts
- اطمینان حاصل کنید که متغیرهای محیط پروژه مورد نیاز را مطابق شکل زیر تنظیم کرده اید. برای اطلاعات بیشتر در مورد راه اندازی یک پروژه GCP، لطفاً به این کد لبه مراجعه کنید. برای دریافت جزئیات در مورد نحوه بازیابی شناسه پروژه و تفاوت آن با نام پروژه و شماره پروژه می توانید به این قسمت مراجعه کنید.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
- صورتحساب برای پروژه های خود را فعال کنید .
- Confidential Computing API و APIهای زیر را برای هر دو پروژه فعال کنید.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudkms.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- با استفاده از دستور زیر مقادیری را برای نام منابع مشخص شده در بالا به متغیرها اختصاص دهید. این متغیرها به شما این امکان را میدهند که نام منابع را در صورت نیاز سفارشی کنید و همچنین در صورت ایجاد منابع موجود، از آنها استفاده کنید. (به عنوان مثال
export PRIMUS_SERVICE_ACCOUNT='my-service-account'
)
- می توانید متغیرهای زیر را با نام منابع ابری موجود در پروژه Primus تنظیم کنید. اگر متغیر تنظیم شده باشد، منبع ابری مربوطه از پروژه Primus استفاده خواهد شد. اگر متغیر تنظیم نشده باشد، نام منبع ابری از نام پروژه ایجاد میشود و یک منبع ابری جدید با آن نام ایجاد میشود. در زیر متغیرهای پشتیبانی شده برای نام منابع آمده است:
| منطقه ای که تحت آن منابع منطقه ای برای شرکت پریموس ایجاد می شود. |
| مکانی که در آن منابع برای شرکت Primus ایجاد می شود. |
| منطقه ای که تحت آن منابع منطقه ای برای شرکت پریموس ایجاد می شود. |
| استخر هویت بار کاری شرکت Primus برای محافظت از منابع ابری. |
| ارائهدهنده Workload Identity Pool شرکت Primus که شامل شرایط مجوز برای استفاده برای نشانههای امضا شده توسط سرویس تأییدکننده گواهی است. |
| حساب خدمات شرکت Primus که |
| کلید KMS برای رمزگذاری دستورات ارائه شده توسط کارکنان شرکت Primus استفاده می شود. |
| کلید KMS که برای ایجاد کلید رمزگذاری |
| نسخه کلید KMS کلید رمزگذاری |
| مخزن مصنوع که در آن تصویر بارانداز بار کار در آن قرار می گیرد. |
| منطقه ای برای مخزن مصنوع که دارای تصویر بارگزاری منتشر شده است. |
| نام حجم کار VM. |
| نام تصویر داکر حجم کار. |
| برچسب تصویر ظرف حجم کاری. |
| حساب سرویسی که اجازه دسترسی به VM محرمانه را دارد که حجم کار را اجرا می کند. |
| نام مشتری VM که برنامه مشتری سرور استنتاج را اجرا می کند. |
| حساب سرویس مورد استفاده توسط |
- شما برای پروژه
$PRIMUS_PROJECT_ID
به Storage Admin، Artifact Registry Administrator، Cloud KMS Admin، Service Account Admin، IAM Workload Identity Pool Admin نیاز دارید. می توانید در مورد نحوه اعطای نقش های IAM با استفاده از کنسول GCP به این راهنما مراجعه کنید. - برای
$PRIMUS_PROJECT_ID
، اسکریپت زیر را اجرا کنید تا نام متغیرهای باقیمانده را بر اساس شناسه پروژه خود برای نام منابع، مقادیری تنظیم کنید.
source config_env.sh
منابع شرکت Primus را تنظیم کنید
به عنوان بخشی از این مرحله، منابع ابری مورد نیاز را برای Primus تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع Primus اجرا کنید. منابع زیر به عنوان بخشی از اجرای اسکریپت ایجاد خواهند شد:
- کلید رمزگذاری (
$PRIMUS_ENC_KEY
) و کلید ($PRIMUS_ENC_KEYRING
) در KMS برای رمزگذاری فایل اطلاعات مشتری شرکت Primus. - مجموعه شناسایی حجم کاری (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگیهایی که تحت ارائهدهنده آن پیکربندی شدهاند. - حساب سرویس (
$PRIMUS_SERVICE_ACCOUNT
) متصل به مخزن هویت بار کاری ذکر شده در بالا ($PRIMUS_WORKLOAD_IDENTITY_POOL
) به رمزگشایی دادهها با استفاده از کلید KMS (با استفاده ازroles/cloudkms.cryptoKeyDecrypter
)، رمزگذاری دادهها با استفاده از کلید KMS (با استفاده ازroles/cloudkms.cryptoKeyEncrypter
) دسترسی دارد. سطل (با استفاده از نقشobjectViewer
) و اتصال سرویس-اکانت به مخزن هویت بار کاری (با استفاده ازroles/iam.workloadIdentityUser
).
./setup_primus_resources.sh
3. بار کاری ایجاد کنید
حساب سرویس حجم کاری ایجاد کنید
اکنون، یک حساب کاربری برای حجم کاری با نقش ها و مجوزهای مورد نیاز ایجاد خواهید کرد. اسکریپت زیر را برای ایجاد یک حساب سرویس بار کاری در پروژه Primus اجرا کنید. این حساب سرویس توسط VM که سرور استنتاج را اجرا می کند استفاده می شود.
این حساب سرویس حجم کاری ( $WORKLOAD_SERVICEACCOUNT
) نقش های زیر را خواهد داشت:
-
confidentialcomputing.workloadUser
برای دریافت نشانه گواهی -
logging.logWriter
برای نوشتن گزارش در Cloud Logging.
./create_workload_service_account.sh
حجم کاری ایجاد کنید
به عنوان بخشی از این مرحله، شما یک تصویر داکر حجم کاری ایجاد خواهید کرد. حجم کار توسط شرکت Primus نوشته می شود. حجم کاری مورد استفاده در این کد لبه کد پایتون است که از مدل codegemma از سطل GCS در دسترس عموم (از باغ مدل راس) استفاده می کند. Workload مدل codegemma را بارگیری می کند و سرور استنتاج را راه اندازی می کند که درخواست های تولید کد از توسعه دهندگان Primus را ارائه می دهد.
در درخواست تولید کد، Workload DEK پیچیده شده را همراه با یک درخواست رمزگذاری شده دریافت می کند. Workload سپس KMS API را برای رمزگشایی DEK فراخوانی میکند و سپس با استفاده از این DEK دستور را رمزگشایی میکند. کلیدهای رمزگذاری (برای DEK) از طریق مخزن هویت بار کاری محافظت می شوند و دسترسی به بارهای کاری که شرایط ویژگی را دارند اعطا می شود. این شرایط ویژگی با جزئیات بیشتر در بخش بعدی در مورد مجوز بار کاری توضیح داده شده است. هنگامی که سرور استنتاج اعلان رمزگشایی شده را داشته باشد، کد را با استفاده از یک مدل بارگذاری شده تولید می کند و پاسخ را برمی گرداند.
اسکریپت زیر را اجرا کنید تا یک بار کاری ایجاد کنید که در آن مراحل زیر در حال انجام است:
- ایجاد رجیستری مصنوع (
$PRIMUS_ARTIFACT_REGISTRY
) متعلق به Primus. - کد حجم کار را با نام منابع مورد نیاز به روز کنید.
- بار کاری سرور استنتاج را بسازید و Dockerfile را برای ساختن تصویر داکر از کد بار کاری ایجاد کنید. در اینجا Dockerfile مورد استفاده برای این Codelab است.
- تصویر Docker را در رجیستری مصنوع (
$PRIMUS_ARTIFACT_REGISTRY
) متعلق به Primus بسازید و منتشر کنید. - به
$WORKLOAD_SERVICEACCOUNT
اجازه خواندن برای$PRIMUS_ARTIFACT_REGISTRY
اعطا کنید. این برای محفظه بار کاری لازم است تا تصویر داکر بار کاری را از رجیستری مصنوع بیرون بکشد.
./create_workload.sh
برای مرجع شما، در اینجا متد ()genere برای بار کاری است که در این کد لبه ایجاد و استفاده می شود (کل کد بار کاری را می توانید در اینجا بیابید).
def generate():
try:
data = request.get_json()
ciphertext = base64.b64decode(data["ciphertext"])
wrapped_dek = base64.b64decode(data["wrapped_dek"])
unwrapped_dek_response = kms_client.decrypt(
request={"name": key_name, "ciphertext": wrapped_dek}
)
unwrapped_dek = unwrapped_dek_response.plaintext
f = Fernet(unwrapped_dek)
plaintext = f.decrypt(ciphertext)
prompt = plaintext.decode("utf-8")
tokens = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**tokens, max_new_tokens=128)
generated_code = tokenizer.decode(outputs[0])
generated_code_bytes = generated_code.encode("utf-8")
response = f.encrypt(generated_code_bytes)
ciphertext_base64 = base64.b64encode(response).decode("utf-8")
response = {"generated_code_ciphertext": ciphertext_base64}
return jsonify(response)
except (ValueError, TypeError, KeyError) as e:
return jsonify({"error": str(e)}), 500
4. مجوز و اجرای Workload
مجوز بار کاری
Primus می خواهد به بارهای کاری اجازه دسترسی به کلید KMS مورد استفاده برای رمزگذاری سریع بر اساس ویژگی های منابع زیر را بدهد:
- چه : کدی که تأیید شده است
- کجا : محیطی که امن است
- Who : اپراتور مورد اعتماد
Primus از فدراسیون هویت Workload برای اعمال خط مشی دسترسی بر اساس این الزامات استفاده می کند. فدراسیون هویت بار کاری به شما امکان می دهد شرایط ویژگی را مشخص کنید. این شرایط شناسایی هویتهایی را که میتوانند با استخر شناسایی حجم کاری (WIP) احراز هویت شوند، محدود میکند. میتوانید برای ارائه اندازهگیریها و اجرای خطمشی، سرویس تأییدکننده گواهی را به عنوان ارائهدهنده مجموعه هویت حجم کاری به WIP اضافه کنید.
مخزن هویت حجم کار قبلاً به عنوان بخشی از مرحله تنظیم منابع ابری ایجاد شده بود. اکنون Primus یک ارائهدهنده اطلاعات جمعآوری اطلاعات OIDC ایجاد میکند. --attribute-condition
مشخص شده اجازه دسترسی به محفظه بار کاری را می دهد. مستلزم این است:
- چه چیزی : آخرین
$WORKLOAD_IMAGE_NAME
آپلود شده در مخزن$PRIMUS_ARTIFACT_REPOSITORY
. - کجا : محیط اجرای مورد اعتماد فضای محرمانه روی تصویر کاملاً پشتیبانی شده از فضای مجازی مجازی محرمانه در حال اجرا است.
- چه کسی : Primus
$WORKLOAD_SERVICE_ACCOUNT
حساب سرویس.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--project="$PRIMUS_PROJECT_ID" \
--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 == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' &&
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@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
دستور بالا با بررسی اینکه hwmodel
روی "GCP_SHIELDED_VM" و swname
روی "HARDENED_SHIELDED" تنظیم شده است، تأیید می کند که حجم کار در یک محیط فضای مطمئن اجرا می شود. علاوه بر این، این شامل ادعاهای خاص بار کاری، مانند image_digest
و image_reference
، برای افزایش امنیت و اطمینان از یکپارچگی حجم کاری در حال اجرا است.
حجم کار را اجرا کنید
به عنوان بخشی از این مرحله، حجم کار را در Trusted Space VM اجرا می کنیم که یک شتاب دهنده متصل است. آرگومان های TEE مورد نیاز با استفاده از پرچم ابرداده منتقل می شوند. آرگومانهای محفظه حجم کاری با استفاده از بخش « tee-cmd
» پرچم ارسال میشوند. برای تجهیز حجم کار VM به GPU Nvidia Tesla T4، از علامت --accelerator=type=nvidia-tesla-t4,count=1
استفاده می کنیم. این یک GPU را به VM متصل می کند. همچنین باید tee-install-gpu-driver=true
در پرچم های ابرداده قرار دهیم تا درایور GPU مناسب را راه اندازی کنیم.
gcloud compute instances create ${WORKLOAD_VM} \
--accelerator=type=nvidia-tesla-t4,count=1 \
--machine-type=n1-standard-16 \
--shielded-secure-boot \
--image-project=conf-space-images-preview \
--image=confidential-space-0-gpupreview-796705b \
--zone=${PRIMUS_PROJECT_ZONE} \
--maintenance-policy=TERMINATE \
--boot-disk-size=40 \
--scopes=cloud-platform \
--service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_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}~tee-install-gpu-driver=true~tee-restart-policy=Never"
Inference Query را اجرا کنید
پس از راه اندازی موفقیت آمیز سرور استنتاج بار کاری، اکنون کارکنان شرکت پریموس می توانند درخواست های تولید کد را به سرور استنتاج ارسال کنند.
به عنوان بخشی از این کد لبه، ما از اسکریپت زیر برای راه اندازی برنامه کلاینت استفاده می کنیم که با سرور استنتاج تعامل دارد. این اسکریپت را برای تنظیم VM مشتری اجرا کنید.
./setup_client.sh
مراحل زیر نحوه SSH را در VM کلاینت و اجرای نمونه برنامه کلاینت در محیط مجازی پایتون نشان می دهد. این نرم افزار مثال از رمزگذاری پاکت نامه با کتابخانه Fernet استفاده می کند، اما به خاطر داشته باشید که کتابخانه های رمزگذاری خاص را می توان با موارد استفاده مختلف سازگار کرد.
gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}
دستورات زیر را برای فعال کردن محیط مجازی پایتون در کلاینت VM و اجرای برنامه کلاینت اجرا کنید.
source venv/bin/activate
python3 inference_client.py
خروجی این نمونه برنامه مشتری، درخواستهای سریع رمزگذاری و متن ساده و پاسخهای رمزگذاریشده و رمزگشایی شده مربوطه را نشان میدهد.
5. پاکسازی کنید
در اینجا اسکریپتی است که می تواند برای پاکسازی منابعی که به عنوان بخشی از این کد لبه ایجاد کرده ایم استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:
- حساب سرویس Primus (
$PRIMUS_SERVICEACCOUNT
). - کلید رمزگذاری Primus (
$PRIMUS_ENC_KEY
). - مخزن مصنوع Primus (
$PRIMUS_ARTIFACT_REPOSITORY
). - مجموعه هویت بار کاری Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) با ارائهدهنده آن. - حساب خدمات بار کاری Primus (
$WORKLOAD_SERVICEACCOUNT
). - حجم کار VM (
$WORKLOAD_VM
) و مشتری مجازی ($CLIENT_VM
).
./cleanup.sh
اگر کاوش را تمام کرده اید، لطفاً پروژه خود را حذف کنید.
- به کنسول Cloud Platform بروید
- پروژهای را که میخواهید تعطیل کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید: با این کار، پروژه برای حذف برنامهریزی میشود.