हस्ताक्षर किया गया कंटेनर इमेज कोडलैब

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

यह कोडलैब, गोपनीय स्पेस के बारे में कोडलैब पर आधारित है. हस्ताक्षर की गई कंटेनर इमेज की मदद से, Workload Identity Pool (WIP) की नीति में इमेज डाइजेस्ट की जानकारी देने के बजाय, पुष्टि की गई सार्वजनिक कुंजी का इस्तेमाल करके कंटेनर की पुष्टि की जा सकती है.

गोपनीय स्पेस में, हस्ताक्षर की गई कंटेनर इमेज के इस्तेमाल से जुड़े इन बदलावों के बारे में जानें:

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

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

सुरक्षा में कोई कमी नहीं: कंटेनर हस्ताक्षर के इस तरीके से, इमेज डाइजेस्ट के पिछले तरीके की तुलना में सुरक्षा में कोई कमी नहीं आएगी. इसकी वजह यह है कि भरोसे की सीमाएं पहले जैसी ही रहेंगी. कंटेनर हस्ताक्षर के तरीके में, संसाधन का मालिक पुष्टि करने वाली कुंजी को अनुमति देता है. इसके लिए, वह WIP नीति में भरोसेमंद सार्वजनिक कुंजी का फ़िंगरप्रिंट बताता है. अनुमति की जांच, पुष्टि करने वाली सेवा और WIP की मदद से की जाती है. पुष्टि करने वाली सेवा यह पुष्टि करती है कि हस्ताक्षर, चल रहे वर्कलोड से जुड़ा है. साथ ही, WIP नीति यह जांच करती है कि सेवा की बताई गई सार्वजनिक कुंजी को नीति से अनुमति मिली है या नहीं.

बेहतर सुरक्षा: कंटेनर इमेज हस्ताक्षर का इस्तेमाल करके, इमेज हस्ताक्षर करने वाले व्यक्ति पर कुछ भरोसा किया जा सकता है. पुष्टि करने की नीति में, भरोसेमंद हस्ताक्षर करने वाले व्यक्ति के सार्वजनिक कुंजी फ़िंगरप्रिंट की जानकारी देकर, संसाधन का मालिक उस व्यक्ति को अनुमति देता है कि वह उन कंटेनर इमेज पर पुष्टि कर सके जो नीति के मुताबिक हैं. पुष्टि करने वाली सेवा यह पुष्टि करती है कि हस्ताक्षर, चल रहे वर्कलोड से जुड़ा है. साथ ही, नीति यह जांच करती है कि हस्ताक्षर बनाने वाली सार्वजनिक कुंजी को नीति से अनुमति मिली है या नहीं. इस सुविधा की मदद से, इमेज पर हस्ताक्षर करने की प्रोसेस में, गोपनीय स्पेस की सुरक्षा को और बेहतर बनाया जाता है.

इन दोनों तरीकों में सिर्फ़ इतना अंतर है कि दूसरे तरीके में, इनडायरेक्ट तरीके की एक अतिरिक्त लेयर का इस्तेमाल किया जाता है. इसमें, वर्कलोड इमेज को साइन करने की कुंजी से अनुमति दी जाती है. इससे सुरक्षा से जुड़ी कोई नई समस्या नहीं होती, क्योंकि भरोसे की सीमाएं पहले जैसी ही रहती हैं.

आपको इनके बारे में जानकारी मिलेगी

इस कोडलैब में, आपको सुरक्षित संसाधनों का ऐक्सेस देने के लिए, कंटेनर इमेज हस्ताक्षर का इस्तेमाल करने का तरीका पता चलेगा:

  • cosign का इस्तेमाल करके, ऑडिट की गई कंटेनर इमेज पर हस्ताक्षर करने का तरीका
  • हस्ताक्षर की खोज और स्टोरेज के लिए, OCI रजिस्ट्री में कंटेनर इमेज के हस्ताक्षर अपलोड करने का तरीका
  • गोपनीय स्पेस चलाने के लिए, ज़रूरी क्लाउड संसाधनों को कॉन्फ़िगर करने का तरीका
  • हस्ताक्षर की गई कंटेनर इमेज की सुविधा की मदद से, गोपनीय स्पेस में वर्कलोड चलाने का तरीका

इस कोडलैब में, Google Compute Engine पर चल रही किसी भरोसेमंद कुंजी से हस्ताक्षर की गई कंटेनर इमेज की रिमोट तरीके से पुष्टि करने के लिए, Confidential Space का इस्तेमाल करने का तरीका बताया गया है.

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

हस्ताक्षर की गई कंटेनर इमेज वाले गोपनीय स्पेस में शामिल भूमिकाएं

इस कोडलैब में, Primus Bank ऑडिटर और संसाधन का मालिक होगा. इसकी ये ज़िम्मेदारियां होंगी:

  1. सैंपल डेटा की मदद से ज़रूरी संसाधन सेट अप करना.
  2. वर्कलोड कोड की ऑडिटिंग करना.
  3. वर्कलोड इमेज पर हस्ताक्षर करने के लिए, cosign का इस्तेमाल करना.
  4. हस्ताक्षर को किसी डेटा स्टोर करने की जगह पर अपलोड करना.
  5. ग्राहक के डेटा की सुरक्षा के लिए, काम जारी है (WIP) नीति को कॉन्फ़िगर करना.

Secundus Bank, वर्कफ़्लो का लेखक और ऑपरेटर होगा. साथ ही, इन चीज़ों के लिए ज़िम्मेदार होगा:

  1. नतीजे को सेव करने के लिए ज़रूरी संसाधनों को सेट अप करना.
  2. वर्कलोड कोड लिखना.
  3. वर्कलोड इमेज पब्लिश करना.
  4. हस्ताक्षर की गई कंटेनर इमेज की मदद से, गोपनीय स्पेस में वर्कलोड चलाना.

Secundus Bank एक ऐसा वर्कलोड डेवलप और पब्लिश करेगा जो क्लाउड स्टोरेज बकेट में सेव किए गए ग्राहक के डेटा के बारे में क्वेरी करेगा. इस बकेट का मालिकाना हक Primus Bank के पास है. Primus Bank, वर्कलोड का ऑडिट करेगा, कंटेनर इमेज पर हस्ताक्षर करेगा, और WIP की नीतियों को कॉन्फ़िगर करेगा, ताकि अनुमति वाले वर्कलोड के ज़रिए उनके डेटा को ऐक्सेस किया जा सके. वर्कफ़्लो को लागू करने का नतीजा, Secundus बैंक के मालिकाना हक वाली क्लाउड स्टोरेज बकेट में सेव किया जाएगा.

गोपनीय स्पेस सेट अप करने से जुड़े संसाधन

इस कोडलैब में कई वैरिएबल का रेफ़रंस दिया गया है. आपको अपने GCP प्रोजेक्ट के लिए, इन वैरिएबल की सही वैल्यू सेट करनी चाहिए. इस कोडलैब में दिए गए निर्देशों के हिसाब से, ये वैरिएबल सेट किए गए हैं. उदाहरण के लिए, Primus बैंक के इनपुट स्टोरेज की बकेट का नाम सेट करने के लिए, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' का इस्तेमाल किया जा सकता है. अगर रिसॉर्स-नेम के वैरिएबल सेट नहीं किए गए हैं, तो यह GCP प्रोजेक्ट-आईडी के आधार पर जनरेट किया जाएगा.

Primus प्रोजेक्ट में ये कॉन्फ़िगर करें:

  • $PRIMUS_INPUT_STORAGE_BUCKET: वह बकेट जिसमें ग्राहक की डेटा फ़ाइल सेव की जाती है.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: यह Workload Identity Pool (WIP) है, जो दावों की पुष्टि करता है.
  • $PRIMUS_WIP_PROVIDER: Workload Identity Pool की सेवा देने वाली कंपनी, जिसमें Attestation Verifier Service से हस्ताक्षर किए गए टोकन के इस्तेमाल के लिए, अनुमति की शर्त शामिल होती है.
  • $PRIMUS_SERVICEACCOUNT: वह सेवा खाता जिसका इस्तेमाल $PRIMUS_WORKLOAD_IDENTITY_POOL, सुरक्षित संसाधनों को ऐक्सेस करने के लिए करता है. इस चरण में, उसके पास $PRIMUS_INPUT_STORAGE_BUCKET बकेट में सेव किया गया ग्राहक डेटा देखने की अनुमति होती है.
  • $PRIMUS_ENC_KEY: $PRIMUS_INPUT_STORAGE_BUCKET में सेव किए गए डेटा को एन्क्रिप्ट (सुरक्षित) करने के लिए इस्तेमाल की जाने वाली केएमएस कुंजी.

इस कोडलैब में नए रिसॉर्स:

  • $PRIMUS_COSIGN_REPOSITORY: Artifact Registry, जिसमें वर्कलोड इमेज के हस्ताक्षर सेव किए जाते हैं.
  • $PRIMUS_SIGNING_KEY: यह केएमएस पासकोड है. इसका इस्तेमाल ऑडिटर/डेटा के साथ काम करने वाले लोग, वर्कलोड इमेज पर हस्ताक्षर करने के लिए करते हैं. जैसे, इस मामले में प्राइमस बैंक.

Secundus प्रोजेक्ट में ये कॉन्फ़िगर करें:

  • $SECUNDUS_ARTIFACT_REGISTRY: वह आर्टफ़ैक्ट रजिस्ट्री जहां वर्कलोड की Docker इमेज को पुश किया जाएगा.
  • $WORKLOAD_IMAGE_NAME: वर्कलोड की Docker इमेज का नाम.
  • $WORKLOAD_IMAGE_TAG: वर्कलोड की Docker इमेज का टैग.
  • $WORKLOAD_SERVICEACCOUNT: वह सेवा खाता जिसके पास वर्कफ़्लो चलाने वाले Confidential VM को ऐक्सेस करने की अनुमति है.
  • $SECUNDUS_RESULT_BUCKET: वह बकेट जिसमें वर्कलोड के नतीजे सेव किए जाते हैं.

अन्‍य संसाधन:

  • primus_customer_list.csv में ग्राहक का डेटा होता है. हम इस डेटा को $PRIMUS_INPUT_STORAGE_BUCKET पर अपलोड करेंगे और एक वर्कलोड बनाएंगे, जो इस डेटा से जुड़ी क्वेरी करेगा.

मौजूदा वर्कफ़्लो

कॉन्फ़िगर किए गए संसाधनों का इस्तेमाल करके, Confidential Space में वर्कलोड चलाने पर यह प्रोसेस होती है:

  1. वर्कफ़्लो, $PRIMUS_SERVICEACCOUNT के लिए, Google से सामान्य ऐक्सेस टोकन का अनुरोध करता है. यह वर्कलोड और एनवायरमेंट के दावों के साथ, पुष्टि करने वाले टूल की सेवा का टोकन उपलब्ध कराता है.
  2. अगर पुष्टि करने वाले टूल के सेवा टोकन में मौजूद, वर्कलोड मेज़रमेंट के दावे, WIP में एट्रिब्यूट की शर्त से मेल खाते हैं, तो यह $PRIMUS_SERVICEACCOUNT. के लिए ऐक्सेस टोकन दिखाता है
  3. यह वर्कलोड, $PRIMUS_INPUT_STORAGE_BUCKET बकेट में ग्राहक का डेटा ऐक्सेस करने के लिए, $PRIMUS_SERVICEACCOUNT से जुड़े सेवा खाते के ऐक्सेस टोकन का इस्तेमाल करता है.
  4. वर्कलोड उस डेटा पर कोई कार्रवाई करता है.
  5. वर्कलोड, $SECUNDUS_RESULT_STORAGE_BUCKET बकेट में उस ऑपरेशन के नतीजे लिखने के लिए, $WORKLOAD_SERVICEACCOUNT सेवा खाते का इस्तेमाल करता है.

साइन किए गए कंटेनर के साथ काम करने वाला नया वर्कफ़्लो

साइन किए गए कंटेनर की सहायता, मौजूदा वर्कफ़्लो में इंटिग्रेट की जाएगी, जैसा कि यहां हाइलाइट किया गया है. हस्ताक्षर की गई कंटेनर इमेज के साथ Confidential Space में वर्कलोड चलाने पर, कॉन्फ़िगर किए गए संसाधनों का इस्तेमाल करके यह प्रोसेस होती है:

  1. Confidential Space, चल रही मौजूदा वर्कलोड इमेज से जुड़े किसी भी कंटेनर हस्ताक्षर का पता लगाता है और उन्हें पुष्टि करने वाले व्यक्ति को भेजता है. पुष्टि करने वाला व्यक्ति हस्ताक्षर की पुष्टि करता है. साथ ही, पुष्टि के दावों में मान्य हस्ताक्षर शामिल करता है.
  2. वर्कफ़्लो, $PRIMUS_SERVICEACCOUNT के लिए, Google से सामान्य ऐक्सेस टोकन का अनुरोध करता है. यह वर्कलोड और एनवायरमेंट के दावों के साथ, पुष्टि करने वाले टूल की सेवा का टोकन उपलब्ध कराता है.
  3. अगर पुष्टि करने वाले टूल के सेवा टोकन में मौजूद कंटेनर हस्ताक्षर के दावे, WIP में एट्रिब्यूट की शर्त से मेल खाते हैं, तो यह $PRIMUS_SERVICEACCOUNT के लिए ऐक्सेस टोकन दिखाता है.
  4. यह वर्कलोड, $PRIMUS_INPUT_STORAGE_BUCKET बकेट में मौजूद ग्राहक का डेटा ऐक्सेस करने के लिए, $PRIMUS_SERVICEACCOUNT से जुड़े सेवा खाते के ऐक्सेस टोकन का इस्तेमाल करता है.
  5. वर्कलोड उस डेटा पर कोई कार्रवाई करता है.
  6. वर्कलोड, उस ऑपरेशन के नतीजों को $SECUNDUS_RESULT_STORAGE_BUCKET बकेट में लिखने के लिए $WORKLOAD_SERVICEACCOUNT का इस्तेमाल करता है.

2. क्लाउड संसाधन सेट अप करना

Confidential Space सेटअप करने के लिए, आपको सबसे पहले Primus और Secundus बैंक के GCP प्रोजेक्ट में ज़रूरी क्लाउड संसाधन बनाने होंगे. इस कोडलैब में नए रिसॉर्स शामिल हैं:

Primus प्रोजेक्ट में:

  • कोड की ऑडिटिंग के बाद, Secundus वर्कलोड को साइन करने के लिए इस्तेमाल की जाने वाली केएमएस साइनिंग पासकोड.
  • Artifact Registry का डेटा स्टोर करने की जगह, ताकि सह-साइन करने के लिए हस्ताक्षर सेव किए जा सकें.

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

गोपनीय स्पेस सेटअप करने के लिए, आपको Primus और Secundus GCP प्रोजेक्ट में ज़रूरी क्लाउड संसाधन बनाने होंगे.

शुरू करने से पहले

  • इस कोडलैब के हिस्से के तौर पर इस्तेमाल की जाने वाली ज़रूरी स्क्रिप्ट पाने के लिए, नीचे दिए गए निर्देश का इस्तेमाल करके इस रिपॉज़िटरी को क्लोन करें.
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • इस कोडलैब के लिए डायरेक्ट्री बदलें.
cd confidential-space/codelabs/signed_container_codelab/scripts
  • पक्का करें कि आपने ज़रूरी प्रोजेक्ट, यहां दिखाए गए तरीके से सेट किए हों.
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • इस कमांड का इस्तेमाल करके, ऊपर बताए गए संसाधन के नामों के लिए वैरिएबल सेट करें. इन वैरिएबल (उदाहरण के लिए, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket') का इस्तेमाल करके, संसाधन के नामों को बदला जा सकता है
  • बाकी बचे वैरिएबल के नामों को, संसाधन के नामों के लिए आपके प्रोजेक्ट आईडी के आधार पर वैल्यू पर सेट करने के लिए, यहां दी गई स्क्रिप्ट चलाएं.
source config_env.sh
  • यहां दिए गए निर्देशों का पालन करके, सह-हस्ताक्षर करने की सुविधा इंस्टॉल करें.

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

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

  • Primus बैंक के ग्राहक की एन्क्रिप्ट की गई डेटा फ़ाइल को सेव करने के लिए, Cloud Storage बकेट ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Primus बैंक की डेटा फ़ाइल को एन्क्रिप्ट करने के लिए, केएमएस में एन्क्रिप्शन पासकोड ($PRIMUS_ENC_KEY) और पासकोड की कुंजी ($PRIMUS_ENC_KEYRING).
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL), जो एट्रिब्यूट की उन शर्तों के आधार पर दावों की पुष्टि करता है जिन्हें उसकी सेवा देने वाली कंपनी ने कॉन्फ़िगर किया है.
  • ऊपर बताए गए वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL) से जुड़ा सर्विस खाता ($PRIMUS_SERVICEACCOUNT), जिसमें ये IAM ऐक्सेस हैं:
  • roles/cloudkms.cryptoKeyDecrypter का इस्तेमाल करके डेटा को डिक्रिप्ट करें.
  • objectViewer का इस्तेमाल करके, क्लाउड स्टोरेज बकेट से डेटा पढ़ा जा सकता है.
  • roles/iam.workloadIdentityUser, ताकि इस सेवा खाते को वर्कलोड आइडेंटिटी पूल से कनेक्ट किया जा सके.
./setup_primus_bank_resources.sh

Secundus बैंक के संसाधन सेट अप करना

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

  • Secundus बैंक के वर्कलोड को लागू करने के नतीजे को सेव करने के लिए, Cloud Storage बकेट ($SECUNDUS_RESULT_STORAGE_BUCKET).
./setup_secundus_bank_resources.sh

3. वर्कलोड बनाना और उस पर हस्ताक्षर करना

वर्कलोड के लिए सेवा खाता बनाना

अब आपको ज़रूरी भूमिकाओं और अनुमतियों के साथ, वर्कलोड के लिए एक सेवा खाता बनाना होगा. Secundus बैंक प्रोजेक्ट में वर्कलोड सेवा खाता बनाने के लिए, यह स्क्रिप्ट चलाएं. इस सेवा खाते का इस्तेमाल, वर्कलोड चलाने वाले वर्चुअल मशीन (VM) के लिए किया जाएगा.

  • इस वर्कलोड के सेवा खाते ($WORKLOAD_SERVICEACCOUNT) में ये भूमिकाएं होंगी:
  • confidentialcomputing.workloadUser
  • logging.logWriter को Cloud Logging में लॉग लिखने के लिए.
  • $PRIMUS_INPUT_STORAGE_BUCKET क्लाउड स्टोरेज बकेट से डेटा पढ़ने के लिए.objectViewer
  • objectAdmin, $SECUNDUS_RESULT_STORAGE_BUCKET क्लाउड स्टोरेज बकेट में वर्कलोड का नतीजा लिखने के लिए.
./create_workload_serviceaccount.sh

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

इस चरण में, आपको वर्कलोड की Docker इमेज बनानी होगी. इस कोडलैब में इस्तेमाल किया गया वर्कलोड, सीएलआई पर आधारित एक आसान Go ऐप्लिकेशन है. यह ऐप्लिकेशन, दिए गए आर्ग्युमेंट में दी गई भौगोलिक जगह के हिसाब से, Primus बैंक के ग्राहकों की संख्या की गिनती करता है. नीचे दी गई स्क्रिप्ट चलाकर, ऐसा वर्कलोड बनाएं जिसमें ये चरण पूरे किए जा रहे हों:

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

वर्कलोड पर हस्ताक्षर करना

हम वर्कलोड इमेज पर हस्ताक्षर करने के लिए, Cosign का इस्तेमाल करेंगे. डिफ़ॉल्ट रूप से, Cosign उसी रिपॉज़िटरी में हस्ताक्षर सेव करेगा जिसमें वह इमेज मौजूद है जिस पर हस्ताक्षर किया जा रहा है. हस्ताक्षर के लिए कोई दूसरा रिपॉज़िटरी तय करने के लिए, COSIGN_REPOSITORY एनवायरमेंट वैरिएबल सेट किया जा सकता है.

यहां हम उदाहरण के तौर पर आर्टफ़ैक्ट रजिस्ट्री का इस्तेमाल करेंगे. अपनी पसंद के हिसाब से, ओसीआई पर आधारित अन्य रजिस्ट्री भी चुनी जा सकती हैं. जैसे, Docker Hub, AWS CodeArtifact.

  1. Artifact Registry का डेटा स्टोर करने की जगह बनाएं.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. वर्कलोड इमेज पर हस्ताक्षर करने के लिए, KMS में पासकोड और पासकोड की कुंजी बनाएं.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. आर्टफ़ैक्ट रजिस्ट्री के लिए, इमेज का पूरा नाम होना चाहिए, जैसे कि $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME. हस्ताक्षर को स्टोर करने के लिए, किसी भी कंटेनर इमेज को रिपॉज़िटरी में अपलोड किया जा सकता है.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. $WORKLOAD_SERVICEACCOUNT सेवा खाते को $PRIMUS_COSIGN_REPOSITORY रिपॉज़िटरी में व्यूअर की भूमिका दें. इससे, गोपनीय स्पेस में $PRIMUS_COSIGN_REPOSITORY पर अपलोड किए गए कंटेनर इमेज हस्ताक्षर का पता चलता है.
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign एक बेहतरीन टूल है, जिसमें हस्ताक्षर करने की कई सुविधाएं हैं. हमारे इस्तेमाल के उदाहरण के लिए, हमें सिर्फ़ Cosign को पासकोड के साथ हस्ताक्षर करने की ज़रूरत है. हस्ताक्षर की सुविधा वाली कंटेनर इमेज के लिए, कोसाइन के बिना हस्ताक्षर करने की सुविधा काम नहीं करती.

पासकोड जोड़े से हस्ताक्षर करते समय, आपके पास दो विकल्प होते हैं:

  1. Cosign से जनरेट किए गए स्थानीय पासकोड का इस्तेमाल करके हस्ताक्षर करें.
  2. किसी दूसरी जगह सेव की गई कुंजी जोड़ी का इस्तेमाल करके हस्ताक्षर करें. उदाहरण के लिए, KMS में.
  1. अगर आपके पास कोई पासकोड नहीं है, तो Cosign में पासकोड जोड़ें. ज़्यादा जानकारी के लिए, खुद मैनेज की जाने वाली कुंजियों से हस्ताक्षर करना लेख पढ़ें. यहां हमने पासकोड जनरेट करने और वर्कलोड पर हस्ताक्षर करने के लिए, लोकल और KMS प्रोवाइडर, दोनों तरीकों के बारे में बताया है. कृपया वर्कलोड कंटेनर पर हस्ताक्षर करने के लिए, इनमें से कोई एक तरीका अपनाएं.
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

ऊपर दिए गए कोड में, <provider>://<key> को gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION से बदलें

  • <provider> : इस एट्रिब्यूट से, इस्तेमाल किए जा रहे केएमएस सलूशन के बारे में पता चलता है
  • <key> : इससे KMS में कुंजी के पाथ का पता चलता है
  1. पुष्टि करने के लिए सार्वजनिक पासकोड वापस पाएं.
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. Cosign का इस्तेमाल करके, वर्कफ़्लो पर हस्ताक्षर करना. सार्वजनिक कुंजी पर बिना पैडिंग के base64 कोड में बदलना
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. एक्सपोर्ट की गई सार्वजनिक कुंजी और अटैच किए गए हस्ताक्षर एल्गोरिदम के साथ, Cosign का इस्तेमाल करके वर्कलोड पर हस्ताक्षर करें.
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [ज़रूरी है] यह बताता है कि साइनिंग पासकोड के तौर पर किस पासकोड का इस्तेमाल करना है. केएमएस सेवा देने वाली कंपनी के मैनेज की गई कुंजी का रेफ़रंस देते समय, कृपया Sigstore केएमएस सहायता से यूआरआई के खास फ़ॉर्मैट का पालन करें. Cosign से जनरेट की गई कुंजी का रेफ़रंस देते समय, इसके बजाय cosign.key का इस्तेमाल करें.
  • $IMAGE_REFERENCE [ज़रूरी है] से यह तय होता है कि किस कंटेनर इमेज पर हस्ताक्षर करना है. IMAGE_REFERENCE के फ़ॉर्मैट की पहचान, टैग या इमेज डाइजेस्ट से की जा सकती है. उदाहरण के लिए: us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container[IMAGE-digest]
  • -a [ज़रूरी है] से, हस्ताक्षर वाले पेलोड से जुड़े एनोटेशन के बारे में पता चलता है. Confidential Space में साइन की गई कंटेनर इमेज के लिए, सार्वजनिक कुंजी और हस्ताक्षर एल्गोरिदम को हस्ताक्षर वाले पेलोड से जोड़ना ज़रूरी है.
  • dev.cosignproject.cosign/sigalg ONLY के लिए तीन वैल्यू इस्तेमाल की जा सकती हैं:
  • RSASSA_PSS_SHA256: SHA256 डाइजेस्ट के साथ PSS पैडिंग वाला RSASSA एल्गोरिदम.
  • RSASSA_PKCS1V15_SHA256: SHA256 डाइजेस्ट के साथ PKCS#1 v1.5 पैडिंग वाला RSASSA एल्गोरिदम.
  • ECDSA_P256_SHA256: SHA256 डाइजेस्ट के साथ P-256 कर्व पर ECDSA. यह, Cosign से जनरेट किए गए कुंजी के जोड़े के लिए भी डिफ़ॉल्ट हस्ताक्षर एल्गोरिदम है.
  1. Docker रिपॉज़िटरी में हस्ताक्षर अपलोड करना

सह-साइन करने की सुविधा, चुने गए COSIGN_REPOSITORY. में हस्ताक्षर अपने-आप अपलोड करेगी

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

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

इस चरण के तहत, हम Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL) में, Workload Identity Provider को सेट अप करेंगे. Workload Identity के लिए, एट्रिब्यूट-शर्तें कॉन्फ़िगर की गई हैं, जैसा कि यहां दिखाया गया है. इनमें से एक शर्त यह है कि वर्कलोड इमेज के हस्ताक्षर के फ़िंगरप्रिंट की पुष्टि, साइन करने के लिए इस्तेमाल की गई सार्वजनिक कुंजी के फ़िंगरप्रिंट से की जाए. एट्रिब्यूट की इस शर्त के साथ, जब Secundus Bank कोई नई वर्कलोड इमेज रिलीज़ करता है, तो Primus Bank वर्कलोड कोड की जांच करता है और नई वर्कलोड इमेज पर हस्ताक्षर करता है. इसके लिए, उसे इमेज डाइजेस्ट की मदद से, WIP नीति को अपडेट करने की ज़रूरत नहीं होती.

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
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
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

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

इस चरण के तहत, हम गोपनीय वीएम पर वर्कलोड चलाएंगे. ज़रूरी टीईई आर्ग्युमेंट, मेटाडेटा फ़्लैग का इस्तेमाल करके पास किए जाते हैं. वर्कलोड कंटेनर के लिए आर्ग्युमेंट, फ़्लैग के "tee-cmd" हिस्से का इस्तेमाल करके पास किए जाते हैं. वर्कफ़्लो को कोड किया गया है, ताकि उसका नतीजा $SECUNDUS_RESULT_STORAGE_BUCKET पर पब्लिश किया जा सके.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --project=${SECUNDUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"

नतीजे देखें

Secundus प्रोजेक्ट में, वर्कलोड के नतीजे देखें.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

नतीजा 3 होना चाहिए, क्योंकि primus_customer_list.csv फ़ाइल में सिएटल के जितने लोग हैं उतने ही नतीजे मिलेंगे!

5. क्लीन अप

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

  • Primus बैंक ($PRIMUS_INPUT_STORAGE_BUCKET) की स्टोरेज बकेट डालें.
  • Primus बैंक का सेवा खाता ($PRIMUS_SERVICEACCOUNT).
  • Primus Bank की आर्टफ़ैक्ट रजिस्ट्री, जिसमें इमेज हस्ताक्षर ($PRIMUS_COSIGN_REPOSITORY) मौजूद हैं.
  • Primus Bank का वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Secundus Bank ($WORKLOAD_SERVICEACCOUNT) का वर्कलोड सेवा खाता.
  • वर्कलोड कंप्यूट इंस्टेंस.
  • Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET) की नतीजों की स्टोरेज बकेट.
  • Secundus Bank ($SECUNDUS_ARTIFACT_REGISTRY) की आर्टफ़ैक्ट रजिस्ट्री.
  • Secundus Bank का वर्कलोड VM ($WORKLOAD_VM).
./cleanup.sh

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

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

बधाई हो

बधाई हो, आपने कोडलैब पूरा कर लिया है!

आपने गोपनीय स्पेस को बेहतर बनाने के लिए, हस्ताक्षर की गई कंटेनर इमेज की सुविधा का इस्तेमाल करने का तरीका जाना.

आगे क्या करना है?

इस तरह के कुछ अन्य कोडलैब देखें...

इसके बारे में और पढ़ें