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

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

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

गोपनीय स्पेस में, हस्ताक्षर किए गए कंटेनर इमेज के साथ क्या बदलाव हुए हैं:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

गोपनीय स्पेस के सेटअप में शामिल संसाधन

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

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

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

इस कोडलैब के लिए नए संसाधन:

  • $PRIMUS_COSIGN_REPOSITORY: आर्टफ़ैक्ट रजिस्ट्री में, वर्कलोड इमेज के हस्ताक्षर सेव किए जाते हैं.
  • $PRIMUS_SIGNING_KEY: ऑडिटर या डेटा के साथ मिलकर काम करने वाले लोग, वर्कलोड इमेज पर हस्ताक्षर करने के लिए केएमएस कुंजी का इस्तेमाल करते हैं.उदाहरण के लिए, इस मामले में प्राइमस बैंक.

Secundus प्रोजेक्ट में नीचे दी गई चीज़ें कॉन्फ़िगर करें:

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

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

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

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

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

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

हस्ताक्षर किए गए कंटेनर सहायता के साथ नया वर्कफ़्लो

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

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

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

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

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

  • कोड को ऑडिट करने के बाद, Secundus वर्कलोड पर साइन करने के लिए केएमएस साइनिंग पासकोड का इस्तेमाल किया जाता है.
  • Cosign हस्ताक्षर सेव करने के लिए, आर्टफ़ैक्ट रजिस्ट्री का डेटा स्टोर करने की जगह.

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

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

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

  • इस कोडलैब के हिस्से के तौर पर इस्तेमाल की जाने वाली ज़रूरी स्क्रिप्ट पाने के लिए, नीचे दिए गए निर्देश का इस्तेमाल करके, डेटा स्टोर करने की इस जगह का क्लोन बनाएं.
$ git clone https://github.com/GoogleCloudPlatform/confidential-space
  • पक्का करें कि आपने नीचे बताए गए तरीके से ज़रूरी प्रोजेक्ट सेट कर लिए हों.
$ 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
  • यहां दिए गए निर्देशों का पालन करके, cosign इंस्टॉल करें.

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

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

  • Primus बैंक की ग्राहक से जुड़े डेटा की एन्क्रिप्ट की गई फ़ाइल स्टोर करने के लिए, क्लाउड स्टोरेज बकेट ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Primus बैंक की डेटा फ़ाइल को एन्क्रिप्ट करने के लिए, केएमएस में एन्क्रिप्शन कुंजी ($PRIMUS_ENC_KEY) और कीरिंग ($PRIMUS_ENC_KEYRING).
  • वर्कलोड आइडेंटिटी पूल ($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 बैंक की ओर से वर्कलोड लागू किए जाने के नतीजे को स्टोर करने के लिए क्लाउड स्टोरेज बकेट ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./setup_secundus_bank_resources.sh

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

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

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

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

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

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

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

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

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

यहां हम उदाहरण के तौर पर, Artifact Registry का इस्तेमाल करेंगे. आपके पास ओसीआई पर आधारित रजिस्ट्री, जैसे कि 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=us
  1. वर्कलोड इमेज पर हस्ताक्षर करने के लिए, केएमएस में कीरिंग और कुंजी बनाएं.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=global

$ gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256
  --location=us
  1. Artifact Registry के लिए, इमेज का पूरा नाम देना ज़रूरी है, जैसे कि $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. कहीं और (उदाहरण के लिए, केएमएस में) सेव किए गए कुंजी के जोड़े से साइन करें.
  1. अगर आपके पास कुंजी का जोड़ा नहीं है, तो Cosign में कुंजी का जोड़ा जनरेट करें. ज़्यादा जानकारी के लिए, खुद मैनेज की जाने वाली कुंजियों से साइन करना देखें.
// 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 के साथ

  • &lt;provider&gt; : इस्तेमाल किए जा रहे केएमएस समाधान को देखें
  • &lt;key&gt; : 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 [REQUIRED] यह बताता है कि किस साइनिंग पासकोड का इस्तेमाल करना है. किसी केएमएस कंपनी से मैनेज की जाने वाली कुंजी के बारे में बताते समय, कृपया Sigstore केएमएस सहायता से मिले खास यूआरआई फ़ॉर्मैट को फ़ॉलो करें. Cosign से जनरेट की गई कुंजी का रेफ़रंस देते समय, इसके बजाय cosign.key का इस्तेमाल करें.
  • $IMAGE_REFERENCE [REQUIRED] यह तय करता है कि कंटेनर की किस इमेज पर हस्ताक्षर करना है. 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 [REQUIRED] हस्ताक्षर पेलोड में अटैच किए गए एनोटेशन के बारे में बताता है. गोपनीय स्पेस पर हस्ताक्षर किए गए कंटेनर इमेज के लिए, सार्वजनिक पासकोड और सिग्नेचर एल्गोरिदम को सिग्नेचर पेलोड में अटैच करना ज़रूरी है.
  • dev.cosignproject.cosign/sigalg सिर्फ़ तीन वैल्यू स्वीकार करता है:
  • आरएसएSSA_PSS_SHA256: SHA256 डाइजेस्ट के साथ PSS पैडिंग के साथ आरएसएएसएसए एल्गोरिदम.
  • आरएसएSSA_PKCS1V15_SHA256: SHA256 डाइजेस्ट के साथ PKCS#1 v1.5 पैडिंग के साथ आरएसएएसएसए एल्गोरिदम.
  • ECDSA_P256_SHA256: SHA256 डाइजेस्ट के साथ P-256 कर्व पर ECDSA. यह Cosign से जनरेट किए गए कुंजी जोड़े के लिए, डिफ़ॉल्ट सिग्नेचर एल्गोरिदम भी है.
  1. डॉकर डेटा स्टोर करने की जगह में हस्ताक्षर अपलोड करें

कोसाइन साइन, बताए गए COSIGN_REPOSITORY पर अपने-आप हस्ताक्षर अपलोड कर देगा.

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

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

इस चरण के तहत, हम वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL) के तहत, वर्कलोड आइडेंटिटी प्रोवाइडर सेट अप करेंगे. वर्कलोड की पहचान के लिए, एट्रिब्यूट-शर्तें कॉन्फ़िगर की गई हैं, जैसा कि नीचे दिखाया गया है. इनमें से एक शर्त यह है कि वर्कलोड इमेज के हस्ताक्षर के फ़िंगरप्रिंट को, सार्वजनिक पासकोड के फ़िंगरप्रिंट पर हस्ताक्षर करने के बजाय, पुष्टि किया जाए. इस एट्रिब्यूट की स्थिति में, जब 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 तर्क, मेटाडेटा फ़्लैग का इस्तेमाल करके पास किए जाते हैं. वर्कलोड कंटेनर के लिए आर्ग्युमेंट, "tee-cmd" का इस्तेमाल करके पास किए जाते हैं फ़्लैग का हिस्सा बना सकता है. वर्कलोड को कोड देकर, उसके नतीजे को $SECUNDUS_RESULT_STORAGE_BUCKET पर पब्लिश करने के लिए कोड किया जाता है.

$ gcloud config set project $SECUNDUS_PROJECT_ID

$ gcloud compute instances create signed-container-vm \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=us-west1-b \
 --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

नतीजे में तीन की संख्या होनी चाहिए, क्योंकि 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) का वर्कलोड सेवा खाता.
  • Workload Compute इंस्टेंस.
  • Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET) की नतीजे का स्टोरेज बकेट.
  • Secundus Bank ($SECUNDUS_ARTIFACT_REGISTRY) की आर्टफ़ैक्ट रजिस्ट्री.
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh

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

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

बधाई हो

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

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

आगे क्या होगा?

ऐसे ही कुछ कोडलैब देखें...

आगे पढ़ें