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

1. परिचय

ead1609267034bf7.png

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

  • मांग पर स्कैन करने वाले एपीआई से, आपको कंटेनर की इमेज को मैन्युअल रूप से स्कैन करने की सुविधा मिलती है. इससे, ओएस की गड़बड़ियों को स्थानीय तौर पर आपके कंप्यूटर या कंटेनर रजिस्ट्री या आर्टफ़ैक्ट रजिस्ट्री में दूर से स्कैन किया जा सकता है.
  • 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 में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. 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 का डेटा स्टोर करने की जगह बनाएं

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

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 में आर्टफ़ैक्ट रजिस्ट्री खोलें
  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

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

आपने अभी-अभी जो बिल्ड सबमिट किया है वह काम नहीं करेगा, क्योंकि इमेज में 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 में आर्टफ़ैक्ट रजिस्ट्री खोलें
  2. कॉन्टेंट देखने के लिए, artifact-scanning-repo पर क्लिक करें
  3. इमेज की जानकारी पर क्लिक करें
  4. अपनी इमेज के नए डाइजेस्ट पर क्लिक करें
  5. इमेज के लिए, 'सुरक्षा से जुड़ी समस्याएं' टैब पर क्लिक करें

8. बधाई हो!

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

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

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

आगे क्या करना है:

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

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

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

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

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