सुरक्षित बिल्ड & Cloud Build, Artifact Registry, और GKE (जीकेई) के साथ डिप्लॉय करना

सुरक्षित तरीके से बिल्ड और Cloud Build, Artifact Registry, और GKE (जीकेई) के साथ डिप्लॉय करना

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार मार्च 4, 2023 को अपडेट किया गया
account_circleChristopher Grant ने लिखा

1. परिचय

कंटेनर विश्लेषण, कंटेनर के लिए जोखिम की आशंका वाली स्कैनिंग और मेटाडेटा स्टोरेज की सुविधा देता है. स्कैनिंग सेवा, Artifact Registry और Container Registry में मौजूद इमेज की जोखिम की आशंका को स्कैन करती है. इसके बाद, इससे बने मेटाडेटा को स्टोर करती है और उसे एपीआई की मदद से इस्तेमाल करने के लिए उपलब्ध कराती है. मेटाडेटा स्टोरेज आपको अलग-अलग सोर्स से जानकारी सेव करने देता है. इनमें जोखिम की आशंकाओं का पता लगाने की सुविधा, Google Cloud की सेवाएं, और तीसरे पक्ष की सेवा देने वाली कंपनियां शामिल हैं.

जोखिम की आशंका की जांच अपने-आप या मांग पर हो सकती है:

  • अपने-आप स्कैन होने की सुविधा चालू होने पर, जब भी Artifact Registry या Container Registry में नई इमेज भेजी जाती है, स्कैनिंग अपने-आप ट्रिगर हो जाती है. नए जोखिमों का पता चलने पर, जोखिम की आशंका की जानकारी लगातार अपडेट की जाती है.
  • मांग पर स्कैन करने की सुविधा चालू होने पर, आपको Artifact Registry या Container Registry में मौजूद किसी स्थानीय इमेज या किसी इमेज को स्कैन करने के लिए निर्देश देना होगा. मांग पर स्कैन करने की सुविधा, कंटेनर को स्कैन करते समय आपके काम आ सकती है. उदाहरण के लिए, आपके पास डिवाइस पर बनी किसी इमेज को स्कैन करने और उसे किसी रजिस्ट्री में सेव करने से पहले, जोखिम की आशंकाओं को दूर करने का विकल्प होता है. स्कैन पूरा होने के 48 घंटे बाद तक, स्कैनिंग के नतीजे उपलब्ध होते हैं. साथ ही, स्कैन के बाद, जोखिम की आशंका से जुड़ी जानकारी अपडेट नहीं होती.

कंटेनर विश्लेषण को अपनी CI/CD पाइपलाइन के साथ जोड़कर, आप उस मेटाडेटा के आधार पर फ़ैसले ले सकते हैं. उदाहरण के लिए, डिप्लॉयमेंट की नीतियां बनाने के लिए बाइनरी ऑथराइज़ेशन का इस्तेमाल किया जा सकता है. इस नीति के तहत, सिर्फ़ भरोसेमंद रजिस्ट्री की ऐसी इमेज के डिप्लॉयमेंट की अनुमति दी जाती है जो नियमों का पालन करती हों.

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

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

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करें

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloudshell एडिटर शुरू करें

इस लैब को Google Cloud Shell Editor के साथ इस्तेमाल करने के लिए डिज़ाइन और टेस्ट किया गया था. एडिटर को ऐक्सेस करने के लिए,

  1. https://console.cloud.google.com पर जाकर, अपना Google प्रोजेक्ट ऐक्सेस करें.
  2. सबसे ऊपर दाएं कोने में मौजूद, Cloud Shell एडिटर आइकॉन पर क्लिक करें

8560cc8d45e8c112.png

  1. आपकी विंडो के सबसे नीचे एक नया पैनल खुलेगा

एनवायरमेंट का सेटअप

Cloud Shell में, अपना प्रोजेक्ट आईडी और अपने प्रोजेक्ट का प्रोजेक्ट नंबर सेट करें. उन्हें PROJECT_ID और PROJECT_ID वैरिएबल के तौर पर सेव करें.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

सेवाएं चालू करें

सभी ज़रूरी सेवाएं चालू करना:

gcloud services enable \
  cloudkms.googleapis.com \
  cloudbuild.googleapis.com \
  container.googleapis.com \
  containerregistry.googleapis.com \
  artifactregistry.googleapis.com \
  containerscanning.googleapis.com \
  ondemandscanning.googleapis.com \
  binaryauthorization.googleapis.com

Artifact Registry का डेटा स्टोर करने की जगह बनाएं

इस लैब में, अपनी इमेज सेव करने और स्कैन करने के लिए Artifact Registry का इस्तेमाल किया जा सकेगा. नीचे दिए गए निर्देश का इस्तेमाल करके, डेटा स्टोर करने की जगह बनाएं.

gcloud artifacts repositories create artifact-scanning-repo \
 
--repository-format=docker \
 
--location=us-central1 \
 
--description="Docker repository"

Artifact Registry को ऐक्सेस करते समय, अपने gcloud क्रेडेंशियल का इस्तेमाल करने के लिए डॉकर को कॉन्फ़िगर करें.

gcloud auth configure-docker us-central1-docker.pkg.dev

3. अपने-आप स्कैन होने की सुविधा

Artifact Registry या Container Registry में जब भी कोई नई इमेज भेजी जाती है, तो आर्टफ़ैक्ट स्कैनिंग अपने-आप ट्रिगर हो जाती है. नए जोखिमों का पता चलने पर, जोखिम की आशंका की जानकारी लगातार अपडेट की जाती है. इस सेक्शन में, आपको Artifact Registry में एक इमेज अटैच करने और नतीजों को एक्सप्लोर करने के बारे में जानकारी मिलेगी.

वर्क डायरेक्ट्री बनाएं और उसमें बदलाव करें

mkdir vuln-scan && cd vuln-scan

सैंपल इमेज तय करें

नीचे दिए गए कॉन्टेंट के साथ Dockerfile नाम की एक फ़ाइल बनाएं.

cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a

# System
RUN apt update && apt install python3-pip -y

# App
WORKDIR /app
COPY . ./

RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

EOF

इन कॉन्टेंट की मदद से, Main.py नाम की एक फ़ाइल बनाएं

cat > ./main.py << EOF
import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
   
name = os.environ.get("NAME", "Worlds")
   
return "Hello {}!".format(name)

if __name__ == "__main__":
   
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF

इमेज बनाएं और उसे एआर (ऑगमेंटेड रिएलिटी) पर भेजें

Cloud Build का इस्तेमाल करके, अपना कंटेनर बनाएं और उसे Artifact Registry में अपने-आप पुश करें. इमेज पर मौजूद bad टैग को नोट करें. इससे आपको बाद के चरणों में इसे पहचानने में मदद मिलेगी.

gcloud builds submit . -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad

इमेज की जानकारी की समीक्षा करें

बिल्ड प्रोसेस पूरी हो जाने के बाद, Artifact Registry के डैशबोर्ड में इमेज और जोखिम की आशंका से जुड़े नतीजों की समीक्षा करें.

  1. Cloud Console में Artifact Registry खोलें
  2. कॉन्टेंट देखने के लिए आर्टफ़ैक्ट-स्कैनिंग-रेपो पर क्लिक करें
  3. इमेज की जानकारी पर क्लिक करें
  4. अपनी इमेज की सबसे नई डाइजेस्ट पर क्लिक करें
  5. स्कैन पूरा होने के बाद, इमेज के लिए जोखिम की आशंकाओं वाले टैब पर क्लिक करें

जोखिम की आशंकाएं टैब से, आपको अभी-अभी बनाई गई इमेज के लिए, अपने-आप होने वाली स्कैनिंग के नतीजे दिखेंगे.

361be7b3bf293fca.png

अपने-आप स्कैन होने की सुविधा, डिफ़ॉल्ट रूप से चालू रहती है. यह जानने के लिए Artifact Registry की सेटिंग पर जाएं कि अपने-आप स्कैन होने की सुविधा को बंद/चालू कैसे किया जा सकता है.

4. मांग पर स्कैनिंग

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

कोई इमेज बनाएं

इस चरण में, अपने लोकल कैश मेमोरी में इमेज बनाने के लिए, लोकल डॉकर का इस्तेमाल किया जाएगा.

docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .

इमेज स्कैन करें

इमेज बन जाने के बाद, उसे स्कैन करने का अनुरोध करें. स्कैन के नतीजे, मेटाडेटा सर्वर में सेव किए जाते हैं. मेटाडेटा सर्वर में नतीजे की जगह के साथ काम पूरा होता है.

gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --format="value(response.scan)" > scan_id.txt

आउटपुट फ़ाइल की समीक्षा करें

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

cat scan_id.txt

स्कैन के नतीजों की ज़्यादा जानकारी देखें

स्कैन के असल नतीजे देखने के लिए, आउटपुट फ़ाइल में बताई गई रिपोर्ट की जगह पर list-vulnerabilities कमांड का इस्तेमाल करें.

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) 

आउटपुट में, इमेज में मौजूद सभी जोखिमों के बारे में काफ़ी डेटा शामिल होता है.

गंभीर समस्याओं के बारे में बताएं

रिपोर्ट में सेव किए गए डेटा का इस्तेमाल, शायद ही कभी सीधे तौर पर होता है. आम तौर पर, नतीजों का इस्तेमाल अपने-आप काम करने वाली प्रोसेस से किया जाता है. रिपोर्ट की जानकारी पढ़ने के लिए, नीचे दिए गए निर्देशों का इस्तेमाल करें. साथ ही, किसी भी गंभीर जोखिम की आशंका का पता चलने पर लॉग करें

export SEVERITY=CRITICAL

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi

इस निर्देश से मिलने वाला आउटपुट यह होगा:

Failed vulnerability check for CRITICAL level

5. पाइपलाइन स्कैनिंग की सुविधा बनाएं

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

Cloud Build के सेवा खाते के लिए ऐक्सेस दें

मांग पर उपलब्ध स्कैनिंग एपीआई को ऐक्सेस करने के लिए, Cloud Build के पास अधिकार होने चाहिए. इन निर्देशों का पालन करके ऐक्सेस दें.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
       
gcloud
projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/ondemandscanning.admin"

Cloud Build पाइपलाइन बनाना

यहां दिए गए निर्देश की मदद से, आपकी डायरेक्ट्री में एक cloudbuild.yaml फ़ाइल बनाई जाएगी, जिसका इस्तेमाल अपने-आप काम करने वाली प्रोसेस के लिए किया जाएगा. इस उदाहरण में दिए गए चरण, कंटेनर बनाने की प्रोसेस तक ही सीमित हैं. हालांकि, व्यावहारिक तौर पर आप कंटेनर चरणों के अलावा ऐप्लिकेशन के लिए खास निर्देश और टेस्ट भी शामिल करेंगे.

यहां दिए गए निर्देश से फ़ाइल बनाएं.

cat > ./cloudbuild.yaml << EOF
steps
:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

#Run a vulnerability scan at _SECURITY level
- id: scan
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    (gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --location us \
    --format="value(response.scan)") > /workspace/scan_id.txt

#Analyze the result of the scan
- id: severity check
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
      gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
      --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
      then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi

#Retag
- id: "retag"
  name: 'gcr.io/cloud-builders/docker'
  args: ['tag',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']


#pushing to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']

images
:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF

सीआई पाइपलाइन चलाएं

गंभीरता की गंभीर आशंका का पता चलने पर, बिल्ड ब्रेक की पुष्टि करने के लिए बिल्ड को प्रोसेस के लिए सबमिट करें.

gcloud builds submit

बिल्ड में गड़बड़ी की समीक्षा करें

आपने अभी-अभी जो बिल्ड सबमिट किया है वह काम नहीं करेगा, क्योंकि इमेज में CRITICAL से जुड़ी जोखिम की आशंकाएं मौजूद हैं.

Cloud Build इतिहास पेज पर जाकर, बिल्ड पूरा नहीं हो सका की समीक्षा करें

जोखिम की आशंका को दूर करना

Dockerfile को अपडेट करें, ताकि किसी ऐसी बुनियादी इमेज का इस्तेमाल किया जा सके जिसमें क्रिटिकल जोखिम की आशंका न हो.

नीचे दिए गए निर्देश की मदद से Debian 10 इमेज का इस्तेमाल करने के लिए, Dockerfile को ओवरराइट करें

cat > ./Dockerfile << EOF
from python:3.8-slim  

# App
WORKDIR
/app
COPY
. ./

RUN pip3 install
Flask==2.1.0
RUN pip3 install gunicorn
==20.1.0

CMD
exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app

EOF

अच्छी इमेज वाली सीआई प्रोसेस चलाएं

बिल्ड को प्रोसेसिंग के लिए सबमिट करें, ताकि गंभीर जोखिम की कोई आशंका न मिलने पर बिल्ड सफल हो.

gcloud builds submit

बिल्ड की सफलता की समीक्षा करें

आपने अभी-अभी जो बिल्ड सबमिट किया है वह सफल हो जाएगा, क्योंकि अपडेट की गई इमेज में कोई CRITICAL नहीं है.

Cloud Build इतिहास पेज पर जाकर, बिल्ड की सफलता की समीक्षा करें

स्कैन के नतीजों की समीक्षा करें

आर्टफ़ैक्ट रजिस्ट्री में अच्छी इमेज देखें

  1. Cloud Console में Artifact Registry खोलें
  2. कॉन्टेंट देखने के लिए आर्टफ़ैक्ट-स्कैनिंग-रेपो पर क्लिक करें
  3. इमेज की जानकारी पर क्लिक करें
  4. अपनी इमेज की सबसे नई डाइजेस्ट पर क्लिक करें
  5. इमेज के लिए जोखिम की आशंका वाले टैब पर क्लिक करें

6. साइनिंग इमेज

प्रमाणित करने वाले का नोट बनाएं

पुष्टि करने वाले का नोट, सिर्फ़ एक छोटा सा डेटा होता है. यह डेटा, जिस तरह के हस्ताक्षर लागू करता है उसके लिए लेबल के तौर पर काम करता है. उदाहरण के लिए, एक नोट जोखिम की आशंका स्कैन करने के बारे में बता सकता है, जबकि दूसरे नोट का इस्तेमाल QA साइन ऑफ़ के लिए किया जा सकता है. हस्ताक्षर करने की प्रोसेस के दौरान, नोट का इस्तेमाल किया जाएगा.

नोट बनाना

cat > ./vulnz_note.json << EOM
{
 
"attestation": {
   
"hint": {
     
"human_readable_name": "Container Vulnerabilities attestation authority"
   
}
 
}
}
EOM

नोट सेव करना

NOTE_ID=vulnz_note

curl
-vvv -X POST \
    -H "Content-Type: application/json"  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    --data-binary @./vulnz_note.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"

नोट की पुष्टि करें

curl -vvv  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"

प्रमाणित करने वाला व्यक्ति बनाना

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

प्रमाणित करने वाला व्यक्ति बनाएं

ATTESTOR_ID=vulnz-attestor

gcloud
container binauthz attestors create $ATTESTOR_ID \
    --attestation-authority-note=$NOTE_ID \
    --attestation-authority-note-project=${PROJECT_ID}

पुष्टि करने वाले की पुष्टि करें

gcloud container binauthz attestors list

ध्यान दें कि आखिरी लाइन से पता चलता है कि NUM_PUBLIC_KEYS: 0 आपको बाद के चरण में कुंजियां देनी होंगी

यह भी ध्यान रखें कि इमेज जनरेट करने वाला बिल्ड चलाने पर, Cloud Build आपके प्रोजेक्ट में built-by-cloud-build प्रमाणित करने वाला टूल अपने-आप बना देता है. इसलिए ऊपर दिया गया निर्देश, दो अटेस्टर vulnz-attestor और built-by-cloud-build दिखाता है. इमेज बनने के बाद, Cloud Build अपने-आप उन पर हस्ताक्षर करता है और उनकी पुष्टि करता है.

आईएएम की भूमिका जोड़ना

पुष्टि करने वाले नोट देखने के लिए, बाइनरी ऑथराइज़ेशन सेवा खाते के पास अधिकार होने चाहिए. इस एपीआई कॉल की मदद से ऐक्सेस दें

PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}"  --format="value(projectNumber)")

BINAUTHZ_SA_EMAIL
="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"


cat
> ./iam_request.json << EOM
{
  'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
  'policy': {
    'bindings': [
      {
        'role': 'roles/containeranalysis.notes.occurrences.viewer',
        'members': [
          'serviceAccount:${BINAUTHZ_SA_EMAIL}'
        ]
      }
    ]
  }
}
EOM

IAM नीति बनाने के लिए फ़ाइल का इस्तेमाल करना

curl -X POST  \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    --data-binary @./iam_request.json \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"

केएमएस कुंजी जोड़ना

नोट जोड़ने और पुष्टि किए जा सकने वाले हस्ताक्षर देने के लिए, प्रमाणित करने वाले व्यक्ति को क्रिप्टोग्राफ़िक कुंजियों की ज़रूरत होती है. इस चरण में, Cloud Build के लिए केएमएस में कुंजियां बनाकर सेव की जा सकती हैं, ताकि उन्हें बाद में ऐक्सेस किया जा सके.

नई कुंजी के बारे में बताने के लिए, सबसे पहले कुछ एनवायरमेंट वैरिएबल जोड़ें

KEY_LOCATION=global
KEYRING
=binauthz-keys
KEY_NAME
=codelab-key
KEY_VERSION
=1

कुंजियों के सेट को होल्ड करने के लिए एक कीरिंग बनाएं

gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"

प्रमाणित करने वाले के लिए, एसिमेट्रिक साइनिंग कुंजी का नया जोड़ा बनाएं

gcloud kms keys create "${KEY_NAME}" \
    --keyring="${KEYRING}" --location="${KEY_LOCATION}" \
    --purpose asymmetric-signing   \
    --default-algorithm="ec-sign-p256-sha256"

आपको अपनी कुंजी, Google Cloud Console के KMS पेज पर दिखेगी.

अब, gcloud binauthz कमांड के ज़रिए कुंजी को अपने प्रमाणित करने वाले के साथ जोड़ें:

gcloud beta container binauthz attestors public-keys add  \
    --attestor="${ATTESTOR_ID}"  \
    --keyversion-project="${PROJECT_ID}"  \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

अब आपको संस्थाओं की सूची दोबारा प्रिंट करने पर, रजिस्टर की गई कुंजी दिखेगी:

gcloud container binauthz attestors list

हस्ताक्षर किया गया प्रमाणित करना

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

CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image

DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:latest \
    --format='get(image_summary.digest)')

अब प्रमाणित करने के लिए gcloud का इस्तेमाल किया जा सकता है. यह निर्देश बस उस कुंजी की जानकारी लेता है जिसका इस्तेमाल आपको साइन करने के लिए करना है और जिस कंटेनर इमेज को आप मंज़ूरी देना चाहते हैं

gcloud beta container binauthz attestations sign-and-create  \
    --artifact-url="${CONTAINER_PATH}@${DIGEST}" \
    --attestor="${ATTESTOR_ID}" \
    --attestor-project="${PROJECT_ID}" \
    --keyversion-project="${PROJECT_ID}" \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

कंटेनर विश्लेषण की शर्तों में, यह एक नई घटना बनाएगा और उसे आपके प्रमाणित करने वाले के नोट में अटैच कर देगा. सब कुछ उम्मीद के मुताबिक काम करे, यह पक्का करने के लिए अपने दस्तावेज़ों की सूची बनाएं

gcloud container binauthz attestations list \
   --attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}

7. Cloud Build के साथ साइन इन करना

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

इस सेक्शन में, Cloud Build को अपने-आप पुष्टि करने की सुविधा कॉन्फ़िगर की जाएगी

भूमिकाएं

Cloud Build के सेवा खाते में, बाइनरी अनुमति देने वाले प्रमाणित करने वाले व्यूअर की भूमिका जोड़ें:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/binaryauthorization.attestorsViewer

Cloud Build सेवा खाते (केएमएस पर आधारित साइनिंग) में, क्लाउड केएमएस क्रिप्टोग्राफ़िक साइनर/वैरिफ़ायर की भूमिका जोड़ें:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/cloudkms.signerVerifier

Cloud Build सेवा खाते में कंटेनर विश्लेषण नोट अटैचमेंट की भूमिका जोड़ें:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/containeranalysis.notes.attacher

कस्टम बिल्ड का चरण तैयार करना

पुष्टि करने की प्रोसेस को आसान बनाने के लिए, Cloud Build में 'कस्टम बिल्ड' चरण का इस्तेमाल किया जा रहा है. Google, कस्टम बिल्ड का यह चरण उपलब्ध कराता है. इसमें, प्रोसेस को आसान बनाने के लिए हेल्पर फ़ंक्शन शामिल हैं. इस्तेमाल करने से पहले, पसंद के मुताबिक बनाए गए चरण के कोड को एक कंटेनर में बनाया जाना चाहिए और उसे Cloud Build में पुश किया जाना चाहिए. ऐसा करने के लिए, नीचे दिए गए कमांड चलाएँ:

git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud
-builders-community/binauthz-attestation
gcloud builds submit
. --config cloudbuild.yaml
cd
../..
rm
-rf cloud-builders-community

अपने Cloudbuild.yaml में साइनिंग स्टेप जोड़ें

इस चरण में, आपको पुष्टि करने का चरण, अपनी Cloud Build पाइपलाइन में जोड़ना होगा, जिसे आपने पहले बनाया था.

  1. जोड़े जाने वाले नए चरण की समीक्षा करें.

सिर्फ़ समीक्षा. कॉपी न करें

#Sign the image only if the previous severity check passes
- id: 'create-attestation'
  name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
  args:
    - '--artifact-url'
    - 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image'
    - '--attestor'
    - 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
    - '--keyversion'
    - 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
  1. अपडेट की गई पूरी पाइपलाइन की मदद से, अपनी cloudbuild.yaml फ़ाइल को ओवरराइट करें.
cat > ./cloudbuild.yaml << EOF
steps
:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

#Run a vulnerability scan at _SECURITY level
- id: scan
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    (gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --location us \
    --format="value(response.scan)") > /workspace/scan_id.txt

#Analyze the result of the scan
- id: severity check
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
      gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
      --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
      then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi

#Retag
- id: "retag"
  name: 'gcr.io/cloud-builders/docker'
  args: ['tag',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']


#pushing to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']


#Sign the image only if the previous severity check passes
- id: 'create-attestation'
  name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
  args:
    - '--artifact-url'
    - 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good'
    - '--attestor'
    - 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
    - '--keyversion'
    - 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'



images
:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good
EOF

बिल्ड चलाएं

gcloud builds submit

Cloud Build के इतिहास में बिल्ड की समीक्षा करें

Cloud Console को Cloud Build के इतिहास पेज पर खोलें और देखें कि नए बिल्ड और बिल्ड के चरणों को पूरा किया गया है या नहीं.

8. एडमिशन कंट्रोल से जुड़ी नीतियां

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

इस सुविधा को समझने के लिए, आपको डिफ़ॉल्ट GKE (जीकेई) नीति में बदलाव करना होगा, ताकि अनुमति देने का सख्त नियम लागू किया जा सके.

GKE (जीकेई) क्लस्टर बनाएं

GKE (जीकेई) क्लस्टर बनाएं:

gcloud beta container clusters create binauthz \
   
--zone us-central1-a  \
   
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE

Cloud Build को इस क्लस्टर में डिप्लॉय करने की अनुमति दें:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/container.developer"

सभी नीति के लिए अनुमति दें

पहले यह पुष्टि करें कि नीति की डिफ़ॉल्ट स्थिति क्या है और कोई इमेज डिप्लॉय की जा सकती है या नहीं

  1. मौजूदा नीति देखें
gcloud container binauthz policy export
  1. ध्यान दें कि नीति उल्लंघन ठीक करने के तरीके (एनफ़ोर्समेंट) की नीति ALWAYS_ALLOW पर सेट है

evaluationMode: ALWAYS_ALLOW

  1. सैंपल डिप्लॉय करें, ताकि यह पुष्टि की जा सके कि आप कुछ भी डिप्लॉय कर सकते हैं
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. काम कर चुके डिप्लॉयमेंट की पुष्टि करें
kubectl get pods

आपको यह आउटपुट दिखेगा

161db370d99ffb13.png

  1. डिप्लॉयमेंट मिटाएं
kubectl delete pod hello-server

सभी नीति अस्वीकार करें

अब सभी इमेज को अनुमति न देने के लिए, नीति को अपडेट करें.

  1. मौजूदा नीति को बदलाव की जा सकने वाली फ़ाइल में एक्सपोर्ट करें
gcloud container binauthz policy export  > policy.yaml
  1. नीति बदलें

टेक्स्ट एडिटर में, evaluationMode को ALWAYS_ALLOW से ALWAYS_DENY में बदलें.

edit policy.yaml

YAML नीति की फ़ाइल इस तरह दिखनी चाहिए:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_DENY
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy
  1. Terminal खोलें और नई नीति लागू करें. इसके बाद, बदलाव लागू होने के लिए कुछ सेकंड इंतज़ार करें
gcloud container binauthz policy import policy.yaml
  1. वर्कलोड डिप्लॉयमेंट के सैंपल की कोशिश करें
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. नीचे दिए गए मैसेज के साथ डिप्लॉयमेंट नहीं हो सका
Error from server (VIOLATES_POLICY): admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image gcr.io/google-samples/hello-app:1.0 denied by Binary Authorization default admission rule. Denied by always_deny admission rule

सभी को अनुमति देने के लिए, इस नीति को पहले जैसा करें

अगले सेक्शन पर जाने से पहले, नीति के बदलावों को पहले जैसा करना न भूलें

  1. नीति बदलें

टेक्स्ट एडिटर में, evaluationMode को ALWAYS_DENY से ALWAYS_ALLOW में बदलें.

edit policy.yaml

YAML नीति की फ़ाइल इस तरह दिखनी चाहिए:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy
  1. पहले जैसी की गई नीति लागू करें
gcloud container binauthz policy import policy.yaml

9. GKE (जीकेई) में जोखिम की आशंकाओं को ब्लॉक करें

इस सेक्शन में, आपने अब तक जो कुछ भी सीखा है उसे Cloud Build के साथ लागू करके, इमेज को स्कैन करने के लिए सीआई/सीडी पाइपलाइन का इस्तेमाल किया जाएगा. इसके बाद, इमेज पर हस्ताक्षर करने और उसे डिप्लॉय करने से पहले, जोखिम की आशंकाओं की जांच की जाएगी. इमेज को चलाने से पहले, GKE (जीकेई) इस बात की पुष्टि करने के लिए बाइनरी अनुमति का इस्तेमाल करेगा कि जोखिम की आशंका वाली जांच से इमेज पर हस्ताक्षर किया गया है.

d5c41bb89e22fd61.png

प्रमाणित करने की ज़रूरत के लिए, GKE (जीकेई) नीति को अपडेट करें

आपके प्रमाणित करने वाले व्यक्ति की इमेज पर हस्ताक्षर करना ज़रूरी है. ऐसा करने के लिए, आपकी GKE बिन अनुमति की नीति में clusterAdmissionRules जोड़ें

नीचे दिए गए निर्देश का इस्तेमाल करके, नीति को अपडेट किए गए कॉन्फ़िगरेशन से ओवरराइट करें.

COMPUTE_ZONE=us-central1-a

cat
> binauth_policy.yaml << EOM
defaultAdmissionRule
:
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
  evaluationMode: ALWAYS_DENY
globalPolicyEvaluationMode
: ENABLE
clusterAdmissionRules
:
  ${COMPUTE_ZONE}.binauthz:
    evaluationMode: REQUIRE_ATTESTATION
    enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    requireAttestationsBy:
    - projects/${PROJECT_ID}/attestors/vulnz-attestor
EOM

नीति लागू करें

gcloud beta container binauthz policy import binauth_policy.yaml

बिना हस्ताक्षर वाली इमेज को डिप्लॉय करने की कोशिश करें

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

हस्ताक्षर की पुष्टि करने के लिए, GKE (जीकेई) एडमिशन कंट्रोलर को लागू की जाने वाली सटीक इमेज के बारे में पता होना चाहिए. इसे पूरा करने के लिए आपको इमेज डाइजेस्ट के साथ-साथ एक आसान टैग का इस्तेमाल करना होगा.

खराब इमेज के लिए इमेज डाइजेस्ट पाएं

CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image


DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:bad \
    --format='get(image_summary.digest)')

Kubernetes कॉन्फ़िगरेशन में डाइजेस्ट का इस्तेमाल करें

cat > deploy.yaml << EOM
apiVersion
: v1
kind
: Service
metadata
:
  name: deb-httpd
spec
:
  selector:
    app: deb-httpd
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion
: apps/v1
kind
: Deployment
metadata
:
  name: deb-httpd
spec
:
  replicas: 1
  selector:
    matchLabels:
      app: deb-httpd
  template:
    metadata:
      labels:
        app: deb-httpd
    spec:
      containers:
      - name: deb-httpd
        image: ${CONTAINER_PATH}@${DIGEST}
        ports:
        - containerPort: 8080
        env:
          - name: PORT
            value: "8080"

EOM

ऐप्लिकेशन को GKE (जीकेई) पर डिप्लॉय करने की कोशिश

kubectl apply -f deploy.yaml

कंसोल में वर्कलोड की समीक्षा करें और डिप्लॉयमेंट को अस्वीकार करने वाली गड़बड़ी पर ध्यान दें:

No attestations found that were valid and signed by a key trusted by the attestor

हस्ताक्षर की हुई इमेज डिप्लॉय करना

खराब इमेज के लिए इमेज डाइजेस्ट पाएं

CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image


DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:good \
    --format='get(image_summary.digest)')

Kubernetes कॉन्फ़िगरेशन में डाइजेस्ट का इस्तेमाल करें

cat > deploy.yaml << EOM
apiVersion
: v1
kind
: Service
metadata
:
  name: deb-httpd
spec
:
  selector:
    app: deb-httpd
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion
: apps/v1
kind
: Deployment
metadata
:
  name: deb-httpd
spec
:
  replicas: 1
  selector:
    matchLabels:
      app: deb-httpd
  template:
    metadata:
      labels:
        app: deb-httpd
    spec:
      containers:
      - name: deb-httpd
        image: ${CONTAINER_PATH}@${DIGEST}
        ports:
        - containerPort: 8080
        env:
          - name: PORT
            value: "8080"

EOM

ऐप्लिकेशन को GKE (जीकेई) पर डिप्लॉय करें

kubectl apply -f deploy.yaml

कंसोल में वर्कलोड की समीक्षा करें और इमेज के सही तरीके से डिप्लॉय होने पर नोट करें.

10. बधाई हो!

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

हमने इन विषयों के बारे में बताया:

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

आने वाले समय में मिलने वाली सुविधाएं:

व्यवस्थित करें

इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, आपके Google Cloud खाते पर शुल्क न लगे. इसके लिए, उस प्रोजेक्ट को मिटा दें जिसमें संसाधन शामिल हैं या प्रोजेक्ट को बनाए रखें और अलग-अलग संसाधनों को मिटाएं.

प्रोजेक्ट मिटाया जा रहा है

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