भरोसेमंद स्पेस का कोडलैब

1. खास जानकारी

क्या आप जीपीयू की मदद से तेज़ किए गए वर्कलोड की सुरक्षा और निजता को बेहतर बनाने के लिए तैयार हैं? इस कोडलैब में, भरोसेमंद स्पेस की सुविधाओं के बारे में बताया गया है. यह सुविधा, आपके संवेदनशील एआई/एमएल वर्कलोड के लिए, ऑपरेटर को अलग रखने और बेहतर बनाने में मदद करती है.

अहम डेटा, मॉडल, और कुंजियों को सुरक्षित रखना, पहले से कहीं ज़्यादा ज़रूरी हो गया है. Trusted Space, इस समस्या का समाधान उपलब्ध कराता है. यह पक्का करता है कि आपके वर्कलोड, सुरक्षित और भरोसेमंद प्लैटफ़ॉर्म पर काम करें. यहां तक कि वर्कलोड ऑपरेटर के पास भी इसका ऐक्सेस नहीं होता.

भरोसेमंद स्पेस में ये सुविधाएं मिलती हैं:

  • निजता और सुरक्षा को बेहतर बनाना: भरोसेमंद स्पेस, एक भरोसेमंद एक्सीक्यूशन एनवायरमेंट उपलब्ध कराता है.यहां आपकी संवेदनशील एसेट (जैसे, मॉडल, अहम डेटा, और कुंजियां) सुरक्षित रहती हैं. इनकी सुरक्षा, क्रिप्टोग्राफ़िक प्रूफ़ की मदद से की जाती है.
  • ऑपरेटर को अलग करना: ऑपरेटर के इंटरफ़ियर करने से जुड़ी समस्याओं को खत्म करें. भरोसेमंद स्पेस में, आपके वर्कलोड ऑपरेटर के पास भी ऐक्सेस नहीं होता. इससे वे एसएसएच (सुरक्षित शेल) का इस्तेमाल नहीं कर सकते, डेटा को ऐक्सेस नहीं कर सकते, सॉफ़्टवेयर इंस्टॉल नहीं कर सकते या आपके कोड में बदलाव नहीं कर सकते.
  • ऐक्सेलरेटर के साथ काम करने की सुविधा: ट्रस्टेड स्पेस को कई तरह के हार्डवेयर ऐक्सेलरेटर के साथ आसानी से काम करने के लिए डिज़ाइन किया गया है. इनमें H100, A100, T4, और L4 जैसे जीपीयू शामिल हैं. इससे यह पक्का होता है कि परफ़ॉर्मेंस के लिहाज़ से अहम एआई/एमएल ऐप्लिकेशन आसानी से काम करते रहें.

आपको क्या सीखने को मिलेगा

  • भरोसेमंद स्पेस की मुख्य सुविधाओं के बारे में जानें.
  • अपने एआई/एमएल वर्कलोड की अहम एसेट को सुरक्षित रखने के लिए, भरोसेमंद स्पेस के एनवायरमेंट को डिप्लॉय और कॉन्फ़िगर करने का तरीका जानें.

आपको इन चीज़ों की ज़रूरत होगी

Primus Company की मदद से, संवेदनशील कोड जनरेशन प्रॉम्प्ट को सुरक्षित करना

इस कोडलैब में, हम Primus की भूमिका निभाएंगे. यह एक ऐसी कंपनी है जो अपने कर्मचारियों के डेटा की निजता और सुरक्षा को प्राथमिकता देती है. Primus को कोड जनरेशन मॉडल को डिप्लॉय करना है, ताकि डेवलपर को कोडिंग से जुड़े टास्क में मदद मिल सके. हालांकि, उन्हें अपने कर्मचारियों के सबमिट किए गए प्रॉम्प्ट की गोपनीयता को सुरक्षित रखने की चिंता है. ऐसा इसलिए है, क्योंकि इन प्रॉम्प्ट में अक्सर संवेदनशील कोड स्निपेट, प्रोजेक्ट की अंदरूनी जानकारी या मालिकाना एल्गोरिदम शामिल होते हैं.

Primus कंपनी, ऑपरेटर पर भरोसा क्यों नहीं करती?

Primus Corp, काफ़ी प्रतिस्पर्धी बाज़ार में काम करती है. उनके कोडबेस में अहम बौद्धिक संपत्ति शामिल होती है. इसमें मालिकाना एल्गोरिदम और संवेदनशील कोड स्निपेट शामिल होते हैं, जो उन्हें प्रतिस्पर्धियों से आगे रखते हैं. वे वर्कलोड ऑपरेटर की ओर से कॉर्पोरेट जासूसी की संभावना से चिंतित हैं. इसके अलावा, कर्मचारी के प्रॉम्प्ट में कोड के ऐसे गोपनीय हिस्से शामिल हो सकते हैं जिन्हें Primus Corp को सुरक्षित रखना है.

इस समस्या को हल करने के लिए, Primus Corp, कोड जनरेशन के लिए मॉडल चलाने वाले इंफ़रेंस सर्वर को अलग करने के लिए, भरोसेमंद स्पेस का इस्तेमाल करेगा. यह इस तरह से काम करता है:

  • प्रॉम्प्ट एन्क्रिप्शन: अनुमान लगाने वाले सर्वर को प्रॉम्प्ट भेजने से पहले, हर कर्मचारी उसे एन्क्रिप्ट करेगा. इसके लिए, वह Google Cloud में Primus Corp की मैनेज की गई KMS कुंजी का इस्तेमाल करेगा. इससे यह पक्का होता है कि सिर्फ़ भरोसेमंद स्पेस एनवायरमेंट, एन्क्रिप्ट (सुरक्षित) किए गए प्रॉम्प्ट को डिक्रिप्ट (सुरक्षित) कर सकता है और सादा टेक्स्ट प्रॉम्प्ट को ऐक्सेस कर सकता है. ऐसा तब ही होता है, जब उस एनवायरमेंट में डिक्रिप्ट करने की कुंजी उपलब्ध हो. असल दुनिया में, क्लाइंट-साइड एन्क्रिप्शन को उपलब्ध लाइब्रेरी (जैसे, tink) से मैनेज किया जा सकता है. इस कोडलैब में, हम एन्वलप एन्क्रिप्शन के साथ इस सैंपल क्लाइंट ऐप्लिकेशन का इस्तेमाल करेंगे.
  • ऑपरेटर को अलग रखना: एन्क्रिप्शन के लिए इस्तेमाल की गई कुंजी का ऐक्सेस, सिर्फ़ भरोसेमंद स्पेस के एनवायरमेंट में चलने वाले इंफ़रेंस सर्वर के पास होगा. साथ ही, भरोसेमंद एनवायरमेंट में प्रॉम्प्ट को डिक्रिप्ट भी किया जा सकेगा. एन्क्रिप्शन पासकोड को Workload Identity Pool से सुरक्षित रखा जाएगा. भरोसेमंद स्पेस में डेटा को अलग-अलग रखने की सुविधा की वजह से, वर्कलोड ऑपरेटर भी एन्क्रिप्ट (सुरक्षित) करने के लिए इस्तेमाल की गई कुंजी और डिक्रिप्ट (सामान्य) किए गए कॉन्टेंट को ऐक्सेस नहीं कर सकता.
  • ऐक्सेलरेटर का इस्तेमाल करके सुरक्षित अनुमान लगाना: अनुमान लगाने वाला सर्वर, भरोसेमंद स्पेस सेटअप के हिस्से के तौर पर, शील्ड किए गए VM पर लॉन्च किया जाएगा. इससे यह पक्का किया जा सकेगा कि वर्कलोड इंस्टेंस को बूट- या कर्नेल-लेवल के मैलवेयर या रूटकिट से नुकसान नहीं पहुंचा है. यह सर्वर, भरोसेमंद स्पेस एनवायरमेंट में प्रॉम्प्ट को डिक्रिप्ट करता है. साथ ही, कोड जनरेशन मॉडल का इस्तेमाल करके अनुमान लगाता है और जनरेट किए गए कोड को कर्मचारी को दिखाता है.

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>
  • अपने प्रोजेक्ट के लिए बिलिंग चालू करें.
  • दोनों प्रोजेक्ट के लिए, गोपनीय कंप्यूटिंग एपीआई और यहां दिए गए एपीआई चालू करें.
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')
  1. Primus प्रोजेक्ट में, मौजूदा क्लाउड संसाधन के नामों के साथ ये वैरिएबल सेट किए जा सकते हैं. अगर वैरिएबल सेट है, तो Primus प्रोजेक्ट के उससे जुड़े मौजूदा क्लाउड संसाधन का इस्तेमाल किया जाएगा. अगर वैरिएबल सेट नहीं है, तो क्लाउड रिसॉर्स का नाम, प्रोजेक्ट-नेम से जनरेट किया जाएगा. साथ ही, उस नाम से एक नया क्लाउड-रिसॉर्स बनाया जाएगा. संसाधन के नामों के लिए इस्तेमाल किए जा सकने वाले वैरिएबल यहां दिए गए हैं:

$PRIMUS_PROJECT_REGION

वह क्षेत्र जहां Primus कंपनी के लिए रीजनल संसाधन बनाए जाएंगे.

$PRIMUS_SERVICE_LOCATION

वह जगह जहां Primus कंपनी के लिए संसाधन बनाए जाएंगे.

$PRIMUS_PROJECT_ZONE

वह ज़ोन जिसके तहत Primus कंपनी के लिए ज़ोनल संसाधन बनाए जाएंगे.

$PRIMUS_WORKLOAD_IDENTITY_POOL

क्लाउड संसाधनों की सुरक्षा के लिए, Primus कंपनी का Workload Identity Pool.

$PRIMUS_WIP_PROVIDER

Primus कंपनी का Workload Identity Pool प्रोवाइडर, जिसमें Attestation Verifier Service से हस्ताक्षर किए गए टोकन के इस्तेमाल के लिए, अनुमति की शर्त शामिल होती है.

$PRIMUS_SERVICEACCOUNT

Primus कंपनी का सेवा खाता, जिसका इस्तेमाल $PRIMUS_WORKLOAD_IDENTITY_POOL सुरक्षित संसाधनों को ऐक्सेस करने के लिए करता है. इस चरण में, उसके पास $PRIMUS_INPUT_STORAGE_BUCKET बकेट में सेव किया गया ग्राहक डेटा देखने की अनुमति होती है.

$PRIMUS_ENC_KEY

केएमएस कुंजी का इस्तेमाल, Primus कंपनी के कर्मचारियों से मिले प्रॉम्प्ट को एन्क्रिप्ट करने के लिए किया जाता है.

$PRIMUS_ENC_KEYRING

Primus कंपनी के लिए एन्क्रिप्शन पासकोड $PRIMUS_ENC_KEY बनाने के लिए इस्तेमाल की जाने वाली केएमएस कीरिंग.

$PRIMUS_ENC_KEYVERSION

एन्क्रिप्शन कुंजी $PRIMUS_ENC_KEY का केएमएस कुंजी वर्शन. डिफ़ॉल्ट वैल्यू 1 है. अगर किसी ऐसी मौजूदा कुंजी का इस्तेमाल किया जा रहा है जिसे पहले बदला जा चुका है और उसका वर्शन अपडेट हो चुका है, तो इसे अपडेट करें.

$PRIMUS_ARTIFACT_REPOSITORY

आर्टफ़ैक्ट का वह रिपॉज़िटरी जहां वर्कलोड की Docker इमेज को पुश किया जाएगा.

$PRIMUS_PROJECT_REPOSITORY_REGION

आर्टफ़ैक्ट रिपॉज़िटरी का वह क्षेत्र जिसमें पब्लिश की गई वर्कलोड की डॉकर इमेज होगी.

$WORKLOAD_VM

वर्कलोड वर्चुअल मशीन (वीएम) का नाम.

$WORKLOAD_IMAGE_NAME

वर्कलोड की Docker इमेज का नाम.

$WORKLOAD_IMAGE_TAG

वर्कलोड कंटेनर इमेज का टैग.

$WORKLOAD_SERVICEACCOUNT

वह सेवा खाता जिसके पास वर्कफ़्लो चलाने वाले Confidential VM को ऐक्सेस करने की अनुमति है.

$CLIENT_VM

उस क्लाइंट VM का नाम जो अनुमान लगाने वाले सर्वर के क्लाइंट ऐप्लिकेशन को चलाएगा.

$CLIENT_SERVICEACCOUNT

$CLIENT_VM का इस्तेमाल किया जाने वाला सेवा खाता

  • प्रोजेक्ट $PRIMUS_PROJECT_ID के लिए, आपके पास स्टोरेज एडमिन, आर्टफ़ैक्ट रजिस्ट्री एडमिन, क्लाउड केएमएस (KMS) एडमिन, सेवा खाते के एडमिन, और IAM में Workload Identity Pool के एडमिन की भूमिकाएं होनी चाहिए. GCP कंसोल का इस्तेमाल करके, IAM भूमिकाएं देने का तरीका जानने के लिए, यह गाइड देखें.
  • $PRIMUS_PROJECT_ID के लिए, बाकी वैरिएबल के नामों को संसाधन के नामों के लिए आपके प्रोजेक्ट आईडी के आधार पर वैल्यू पर सेट करने के लिए, यह स्क्रिप्ट चलाएं.
source config_env.sh

Primus Company के संसाधन सेट अप करना

इस चरण में, आपको Primus के लिए ज़रूरी क्लाउड संसाधन सेट अप करने होंगे. Primus के लिए संसाधन सेट अप करने के लिए, यह स्क्रिप्ट चलाएं. स्क्रिप्ट एक्ज़ीक्यूशन के दौरान, ये रिसॉर्स बनेंगे:

  • Primus कंपनी की ग्राहक डेटा फ़ाइल को एन्क्रिप्ट (सुरक्षित) करने के लिए, केएमएस में एन्क्रिप्शन कुंजी ($PRIMUS_ENC_KEY) और कीरिंग ($PRIMUS_ENC_KEYRING).
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL), जो एट्रिब्यूट की उन शर्तों के आधार पर दावों की पुष्टि करता है जिन्हें उसकी सेवा देने वाली कंपनी ने कॉन्फ़िगर किया है.
  • ऊपर बताए गए वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL) से जुड़े सेवा खाते ($PRIMUS_SERVICE_ACCOUNT) के पास, केएमएस कुंजी का इस्तेमाल करके डेटा को डिक्रिप्ट करने (roles/cloudkms.cryptoKeyDecrypter भूमिका का इस्तेमाल करके), केएमएस कुंजी का इस्तेमाल करके डेटा को एन्क्रिप्ट करने (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 कंपनी, वर्कलोड का मालिक होगी. इस कोडलैब में इस्तेमाल किया गया वर्कलोड, Python कोड है. यह सार्वजनिक तौर पर उपलब्ध GCS बकेट (वर्टिक्स मॉडल गार्डन का) से codegemma मॉडल का इस्तेमाल करता है. यह वर्कलोड, codegemma मॉडल को लोड करेगा और अनुमान लगाने वाला सर्वर लॉन्च करेगा. यह सर्वर, Primus के डेवलपर से मिले कोड जनरेशन के अनुरोधों को पूरा करेगा.

कोड जनरेट करने के अनुरोध पर, Workload को एन्क्रिप्ट किए गए प्रॉम्प्ट के साथ रैप किया गया डीईके मिलेगा. इसके बाद, वर्कलोड डीईके को डिक्रिप्ट करने के लिए केएमएस एपीआई को कॉल करेगा. इसके बाद, वह इस डीईके का इस्तेमाल करके प्रॉम्प्ट को डिक्रिप्ट करेगा. डीईके के लिए एन्क्रिप्शन कुंजियों को, वर्कलोड आइडेंटिटी पूल की मदद से सुरक्षित किया जाएगा. साथ ही, एट्रिब्यूट की शर्तें पूरी करने वाले वर्कलोड को ऐक्सेस दिया जाएगा. इन एट्रिब्यूट की शर्तों के बारे में ज़्यादा जानकारी, अगले सेक्शन में दी गई है. इसमें, वर्कलोड को अनुमति देने के बारे में बताया गया है. जब अनुमान लगाने वाले सर्वर के पास डिक्रिप्ट किया गया प्रॉम्प्ट हो जाएगा, तो वह लोड किए गए मॉडल का इस्तेमाल करके कोड जनरेट करेगा और जवाब वापस देगा.

नीचे दी गई स्क्रिप्ट चलाकर, ऐसा वर्कलोड बनाएं जिसमें ये चरण पूरे किए जा रहे हों:

  • Primus के मालिकाना हक वाली Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) बनाएं.
  • ज़रूरी रिसॉर्स के नामों के साथ, वर्कलोड कोड को अपडेट करें.
  • अनुमान लगाने वाले सर्वर का वर्कलोड बनाएं और वर्कलोड कोड की Docker इमेज बनाने के लिए Dockerfile बनाएं. यहां इस कोडलैब के लिए इस्तेमाल की गई Dockerfile दी गई है.
  • Primus के मालिकाना हक वाली आर्टफ़ैक्ट रजिस्ट्री ($PRIMUS_ARTIFACT_REGISTRY) में Docker इमेज बनाएं और पब्लिश करें.
  • $WORKLOAD_SERVICEACCOUNT को $PRIMUS_ARTIFACT_REGISTRY के लिए, पढ़ने की अनुमति दें. आर्टफ़ैक्ट रजिस्ट्री से वर्कलोड की डॉकर इमेज खींचने के लिए, वर्कलोड कंटेनर को यह क्रेडेंशियल चाहिए.
./create_workload.sh

आपके रेफ़रंस के लिए, यहां उस वर्कलोड का generate() तरीका दिया गया है जिसे इस कोडलैब में बनाया और इस्तेमाल किया गया है. आपको पूरा वर्कलोड कोड यहां मिल सकता है.

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. वर्कलोड को अनुमति देना और चलाना

वर्कलोड को अनुमति देना

Primus को अपने वर्कलोड को, इन संसाधनों के एट्रिब्यूट के आधार पर, तुरंत एन्क्रिप्ट करने के लिए इस्तेमाल की जाने वाली केएमएस कुंजी को ऐक्सेस करने की अनुमति देनी है:

  • क्या: पुष्टि किया गया कोड
  • कहां: ऐसा माहौल जो सुरक्षित हो
  • कौन: कोई भरोसेमंद ऑपरेटर

Primus, इन ज़रूरी शर्तों के आधार पर ऐक्सेस नीति लागू करने के लिए, Workload Identity फ़ेडरेशन का इस्तेमाल करता है. Workload Identity फ़ेडरेशन की मदद से, एट्रिब्यूट की शर्तें तय की जा सकती हैं. इन शर्तों से यह तय होता है कि कौनसी आइडेंटिटी Workload Identity Pool (WIP) की मदद से पुष्टि कर सकती हैं. मेज़रमेंट दिखाने और नीति लागू करने के लिए, Attestation Verifier Service को WIP में वर्कलोड आइडेंटिटी पूल की सेवा देने वाली कंपनी के तौर पर जोड़ा जा सकता है.

क्लाउड संसाधनों को सेट अप करने के दौरान, Workload Identity Pool पहले ही बना दिया गया था. अब Primus, नया OIDC Workload Identity Pool Provider बनाएगा. तय किया गया --attribute-condition, वर्कलोड कंटेनर को ऐक्सेस करने की अनुमति देता है. इसके लिए:

  • क्या: $PRIMUS_ARTIFACT_REPOSITORY रिपॉज़िटरी में अपलोड किया गया नया $WORKLOAD_IMAGE_NAME.
  • कहां: Confidential Space का ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट, पूरी तरह से काम करने वाली Confidential Space वीएम इमेज पर चल रहा है.
  • कौन: 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. इनसे सुरक्षा को बेहतर बनाने और चल रहे वर्कलोड की पूरी सुरक्षा को पक्का करने में मदद मिलती है.

वर्कलोड चलाना

इस चरण के तहत, हम भरोसेमंद स्पेस के उस वर्चुअल मशीन (वीएम) में वर्कलोड चलाएंगे जिसमें एक ऐक्सेलरेटर जुड़ा होगा. मेटाडेटा फ़्लैग का इस्तेमाल करके, TEE के ज़रूरी आर्ग्युमेंट पास किए जाते हैं. फ़्लैग के "tee-cmd" हिस्से का इस्तेमाल करके, वर्कलोड कंटेनर के लिए आर्ग्युमेंट पास किए जाते हैं. वर्कलोड वीएम को Nvidia Tesla T4 जीपीयू से लैस करने के लिए, हम --accelerator=type=nvidia-tesla-t4,count=1 फ़्लैग का इस्तेमाल करेंगे. इससे वीएम में एक जीपीयू जुड़ जाएगा. सही जीपीयू ड्राइवर के इंस्टॉलेशन को ट्रिगर करने के लिए, हमें मेटाडेटा फ़्लैग में tee-install-gpu-driver=true भी शामिल करना होगा.

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"

अनुमान लगाने वाली क्वेरी चलाना

वर्कलोड इंफ़रेंस सर्वर लॉन्च होने के बाद, Primus कंपनी के कर्मचारी, इंफ़रेंस सर्वर को कोड जनरेशन के अनुरोध भेज सकते हैं.

इस कोडलैब के तहत, हम क्लाइंट ऐप्लिकेशन को सेट अप करने के लिए नीचे दी गई स्क्रिप्ट का इस्तेमाल करेंगे. यह ऐप्लिकेशन, अनुमान लगाने वाले सर्वर के साथ इंटरैक्ट करेगा. क्लाइंट VM सेट अप करने के लिए, यह स्क्रिप्ट चलाएं.

./setup_client.sh

यहां क्लाइंट VM में एसएसएच करने और Python वर्चुअल एनवायरमेंट में सैंपल क्लाइंट ऐप्लिकेशन को चलाने का तरीका बताया गया है. इस उदाहरण में दिए गए ऐप्लिकेशन में, Fernet लाइब्रेरी के साथ एन्वलप एन्क्रिप्शन का इस्तेमाल किया गया है. हालांकि, ध्यान रखें कि एन्क्रिप्शन की अलग-अलग लाइब्रेरी को, अलग-अलग इस्तेमाल के उदाहरणों के हिसाब से बनाया जा सकता है.

gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}

क्लाइंट वर्चुअल मशीन में Python वर्चुअल एनवायरमेंट चालू करने और क्लाइंट ऐप्लिकेशन को चलाने के लिए, ये कमांड चलाएं.

source venv/bin/activate
python3 inference_client.py

इस सैंपल क्लाइंट ऐप्लिकेशन के आउटपुट में, एन्क्रिप्ट और सादा टेक्स्ट प्रॉम्प्ट अनुरोध दिखेंगे. साथ ही, उनके एन्क्रिप्ट और डिक्रिप्ट किए गए रिस्पॉन्स भी दिखेंगे.

5. क्लीन अप

यहां वह स्क्रिप्ट दी गई है जिसका इस्तेमाल, इस कोडलैब के तहत बनाए गए संसाधनों को हटाने के लिए किया जा सकता है. इस क्लीनअप के तहत, ये संसाधन मिटा दिए जाएंगे:

  • Primus सेवा खाता ($PRIMUS_SERVICEACCOUNT).
  • Primus एन्क्रिप्शन पासकोड ($PRIMUS_ENC_KEY).
  • Primus ($PRIMUS_ARTIFACT_REPOSITORY) का आर्टफ़ैक्ट रिपॉज़िटरी.
  • Primus का Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL) और उसकी सेवा देने वाली कंपनी.
  • Primus ($WORKLOAD_SERVICEACCOUNT) का वर्कलोड सेवा खाता.
  • वर्कलोड VM ($WORKLOAD_VM) और क्लाइंट VM ($CLIENT_VM).
./cleanup.sh

अगर आपने एक्सप्लोर कर लिया है, तो कृपया अपना प्रोजेक्ट मिटाएं.

  • Cloud Platform Console पर जाएं
  • वह प्रोजेक्ट चुनें जिसे आपको बंद करना है. इसके बाद, सबसे ऊपर मौजूद 'मिटाएं' पर क्लिक करें: इससे प्रोजेक्ट को मिटाने के लिए शेड्यूल किया जाता है