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

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

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

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

1. परिचय

ead1609267034bf7.png

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

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

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

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

इस लैब में आप:

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

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 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

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

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 क्रेडेंशियल का इस्तेमाल करने के लिए डॉकर को कॉन्फ़िगर करें.

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. कॉन्टेंट देखने के लिए आर्टफ़ैक्ट-स्कैनिंग-रेपो पर क्लिक करें
  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 की मदद से CICD में स्कैन करना

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. इमेज के लिए जोखिम की आशंका वाले टैब पर क्लिक करें

8. बधाई हो!

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

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

  • Cloud Build की मदद से इमेज बनाना
  • कंटेनर के लिए Artifact Registry
  • जोखिम की आशंका को अपने-आप स्कैन करना
  • मांग पर स्कैन
  • Cloud Build की मदद से CICD में स्कैन करना

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

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

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

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

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

पिछला अपडेट: 21/3/23