कंटेनर बिल्ड की सुरक्षा करना

1. परिचय

ead1609267034bf7.png

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

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

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

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

इस लैब में, आपको ये काम करने का मौका मिलेगा:

  • Cloud Build की मदद से इमेज बनाना
  • कंटेनर के लिए Artifact Registry का इस्तेमाल करना
  • जोखिम की आशंका का अपने-आप पता लगाने वाली स्कैनिंग की सुविधा का इस्तेमाल करना
  • मांग पर स्कैन करने की सुविधा कॉन्फ़िगर करना
  • Cloud Build में सीआई/सीडी के दौरान इमेज स्कैन करने की सुविधा जोड़ना

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 में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या पूरे प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

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

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 

3. Cloud Build की मदद से इमेज बनाना

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

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"

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

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 पाइपलाइन बनाना

नीचे दी गई कमांड, आपकी डायरेक्ट्री में 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: ['-']


EOF

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

प्रोसेसिंग के लिए बिल्ड सबमिट करना

gcloud builds submit

बिल्ड की जानकारी की समीक्षा करना

बिल्ड प्रोसेस शुरू होने के बाद, Cloud Build डैशबोर्ड में समीक्षा की प्रोग्रेस देखें.

  1. Cloud Console में Cloud Build खोलें
  2. कॉन्टेंट देखने के लिए, बिल्ड पर क्लिक करें

4. कंटेनर के लिए Artifact Registry

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

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

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

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

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

Cloud Build पाइपलाइन को अपडेट करना

बिल्ड पाइपलाइन में बदलाव करके, इमेज को Artifact Registry में पुश करें

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: ['-']

# push 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']

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

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

प्रोसेसिंग के लिए बिल्ड सबमिट करना

gcloud builds submit

5. कमियों का अपने-आप पता लगाने की सुविधा

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

इमेज की जानकारी देखना

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

  1. Cloud Console में Artifact Registry खोलें
  2. कॉन्टेंट देखने के लिए, artifact-scanning-repo पर क्लिक करें
  3. इमेज की जानकारी पर क्लिक करें
  4. अपनी इमेज के सबसे नए डाइजेस्ट पर क्लिक करें
  5. स्कैन पूरा होने के बाद, इमेज के लिए 'कमज़ोरियां' टैब पर क्लिक करें

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

361be7b3bf293fca.png

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

6. मांग पर स्कैन करने की सुविधा

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

इमेज बनाना

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

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

7. Cloud Build की मदद से सीआई/सीडी में स्कैन करना

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

बिल्ड की समीक्षा नहीं हो सकी

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

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

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

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

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

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

Artifact Registry में अच्छी इमेज की समीक्षा करना

  1. Cloud Console में Artifact Registry खोलें
  2. कॉन्टेंट देखने के लिए, artifact-scanning-repo पर क्लिक करें
  3. इमेज की जानकारी पर क्लिक करें
  4. अपनी इमेज के सबसे नए डाइजेस्ट पर क्लिक करें
  5. इमेज के लिए, 'कमज़ोरियां' टैब पर क्लिक करें

8. बधाई हो!

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

हमने इन विषयों के बारे में जानकारी दी है:

  • Cloud Build की मदद से इमेज बनाना
  • कंटेनर के लिए Artifact Registry
  • कमियों का अपने-आप पता लगाने की सुविधा
  • मांग पर स्कैन करने की सुविधा
  • Cloud Build की मदद से सीआई/सीडी में स्कैन करना

इसके बाद क्या होगा:

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

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

प्रोजेक्ट मिटाना

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

पिछली बार अपडेट किए जाने की तारीख: 21/3/23