1. परिचय

सॉफ़्टवेयर की कमज़ोरियां ऐसी समस्याएं होती हैं जिनकी वजह से सिस्टम अचानक काम करना बंद कर सकता है. साथ ही, ये समस्याएं बुरे लोगों को आपके सॉफ़्टवेयर को नुकसान पहुंचाने का मौका दे सकती हैं. कंटेनर विश्लेषण, कंटेनर में कमज़ोरियों का पता लगाने के लिए दो तरह की ओएस स्कैनिंग की सुविधा देता है:
- On-Demand Scanning API की मदद से, कंटेनर इमेज को ओएस की कमियों के लिए मैन्युअल तरीके से स्कैन किया जा सकता है. ऐसा आपके कंप्यूटर पर स्थानीय तौर पर या Container Registry या Artifact Registry में रिमोट तरीके से किया जा सकता है.
- Container Scanning API की मदद से, ओएस की कमज़ोरियों का पता लगाने की प्रोसेस को अपने-आप होने वाली प्रोसेस में बदला जा सकता है. जब भी Container Registry या Artifact Registry में कोई इमेज पुश की जाती है, तब यह प्रोसेस अपने-आप शुरू हो जाती है. इस एपीआई को चालू करने से, Go और Java की कमियों के लिए भाषा पैकेज स्कैन करने की सुविधा भी चालू हो जाती है.
On-Demand Scanning API की मदद से, अपने कंप्यूटर पर लोकल तौर पर सेव की गई इमेज को स्कैन किया जा सकता है. इसके अलावा, Container Registry या Artifact Registry में रिमोट तौर पर सेव की गई इमेज को भी स्कैन किया जा सकता है. इससे आपको उन कंटेनर पर ज़्यादा विस्तृत कंट्रोल मिलता है जिनमें आपको जोखिम की आशंकाओं के लिए स्कैन करना है. ऑन-डिमांड स्कैनिंग का इस्तेमाल करके, अपनी CI/CD पाइपलाइन में मौजूद इमेज को स्कैन किया जा सकता है. इससे यह तय करने में मदद मिलती है कि इमेज को किसी रजिस्ट्री में सेव करना है या नहीं.
आपको क्या सीखने को मिलेगा
इस लैब में, आपको ये काम करने का मौका मिलेगा:
- Cloud Build की मदद से इमेज बनाना
- कंटेनर के लिए Artifact Registry का इस्तेमाल करना
- जोखिम की आशंका का अपने-आप पता लगाने वाली स्कैनिंग की सुविधा का इस्तेमाल करना
- मांग पर स्कैन करने की सुविधा कॉन्फ़िगर करना
- Cloud Build में सीआई/सीडी के दौरान इमेज स्कैनिंग की सुविधा जोड़ना
2. सेटअप और ज़रूरी शर्तें
अपनी स्पीड से एनवायरमेंट सेट अप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.



- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते हैं. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग को अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे
PROJECT_IDके तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक रहेगा. - आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
- इसके बाद, आपको 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 डैशबोर्ड में समीक्षा की प्रोग्रेस देखें.
- Cloud Console में Cloud Build खोलें
- कॉन्टेंट देखने के लिए, बिल्ड पर क्लिक करें
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 के डैशबोर्ड में जाकर इमेज और कमज़ोरियों के नतीजे देखें.
- Cloud Console में Artifact Registry खोलें
- कॉन्टेंट देखने के लिए, artifact-scanning-repo पर क्लिक करें
- इमेज की जानकारी पर क्लिक करें
- अपनी इमेज के सबसे नए डाइजेस्ट पर क्लिक करें
- स्कैन पूरा होने के बाद, इमेज के लिए मौजूद 'कमज़ोरियां' टैब पर क्लिक करें
कमज़ोरियों वाले टैब में, आपको अभी बनाई गई इमेज की अपने-आप स्कैनिंग के नतीजे दिखेंगे.

स्कैनिंग को अपने-आप होने की सुविधा डिफ़ॉल्ट रूप से चालू होती है. अपने-आप स्कैन होने की सुविधा को बंद या चालू करने का तरीका जानने के लिए, 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 में अच्छी इमेज की समीक्षा करना
- Cloud Console में Artifact Registry खोलें
- कॉन्टेंट देखने के लिए, artifact-scanning-repo पर क्लिक करें
- इमेज की जानकारी पर क्लिक करें
- अपनी इमेज के सबसे नए डाइजेस्ट पर क्लिक करें
- इमेज के लिए, 'कमज़ोरियां' टैब पर क्लिक करें
8. बधाई हो!
बधाई हो, आपने कोडलैब पूरा कर लिया है!
हमने इन विषयों पर बात की:
- Cloud Build की मदद से इमेज बनाना
- कंटेनर के लिए Artifact Registry
- कमियों का अपने-आप पता लगाने की सुविधा
- मांग पर स्कैन करने की सुविधा
- Cloud Build की मदद से सीआईसीडी में स्कैन करना
इसके बाद क्या होगा:
- Cloud Run और Google Kubernetes Engine पर इमेज डिप्लॉयमेंट को सुरक्षित करना | Cloud Build का दस्तावेज़
- क्विकस्टार्ट: GKE के साथ बाइनरी ऑथराइज़ेशन की नीति कॉन्फ़िगर करना | Google Cloud
व्यवस्थित करें
इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, संसाधनों वाला प्रोजेक्ट मिटाएं या प्रोजेक्ट को बनाए रखें और अलग-अलग संसाधनों को मिटाएं.
प्रोजेक्ट मिटाना
बिलिंग को बंद करने का सबसे आसान तरीका यह है कि ट्यूटोरियल के लिए बनाया गया प्रोजेक्ट मिटा दिया जाए.
—
पिछली बार अपडेट किए जाने की तारीख: 21/3/23