নিরাপদ বিল্ড & ক্লাউড বিল্ড, আর্টিফ্যাক্ট রেজিস্ট্রি এবং GKE এর সাথে স্থাপন করুন

1. ভূমিকা

কন্টেইনার বিশ্লেষণ কন্টেইনারগুলির জন্য দুর্বলতা স্ক্যানিং এবং মেটাডেটা স্টোরেজ প্রদান করে। স্ক্যানিং পরিষেবাটি আর্টিফ্যাক্ট রেজিস্ট্রি এবং কন্টেইনার রেজিস্ট্রিতে থাকা চিত্রগুলিতে দুর্বলতা স্ক্যান করে, তারপর ফলস্বরূপ মেটাডেটা সংরক্ষণ করে এবং এটি একটি API এর মাধ্যমে ব্যবহারের জন্য উপলব্ধ করে। মেটাডেটা স্টোরেজ আপনাকে বিভিন্ন উৎস থেকে তথ্য সংরক্ষণ করতে দেয়, যার মধ্যে দুর্বলতা স্ক্যানিং, গুগল ক্লাউড পরিষেবা এবং তৃতীয় পক্ষের সরবরাহকারী অন্তর্ভুক্ত।

দুর্বলতা স্ক্যানিং স্বয়ংক্রিয়ভাবে বা চাহিদা অনুযায়ী ঘটতে পারে:

  • যখন স্বয়ংক্রিয় স্ক্যানিং সক্ষম করা থাকে, তখন প্রতিবার যখন আপনি একটি নতুন ছবি আর্টিফ্যাক্ট রেজিস্ট্রি বা কন্টেইনার রেজিস্ট্রিতে পুশ করেন তখন স্ক্যানিং স্বয়ংক্রিয়ভাবে শুরু হয়। নতুন দুর্বলতা আবিষ্কৃত হলে দুর্বলতার তথ্য ক্রমাগত আপডেট করা হয়।
  • যখন অন-ডিমান্ড স্ক্যানিং সক্ষম করা থাকে, তখন আপনাকে স্থানীয় ছবি বা আর্টিফ্যাক্ট রেজিস্ট্রি বা কন্টেইনার রেজিস্ট্রিতে থাকা কোনও ছবি স্ক্যান করার জন্য একটি কমান্ড চালাতে হবে। অন-ডিমান্ড স্ক্যানিং আপনাকে কন্টেইনার স্ক্যান করার সময় নমনীয়তা প্রদান করে। উদাহরণস্বরূপ, আপনি স্থানীয়ভাবে তৈরি একটি ছবি স্ক্যান করতে পারেন এবং রেজিস্ট্রিতে সংরক্ষণ করার আগে দুর্বলতাগুলি সংশোধন করতে পারেন। স্ক্যান সম্পন্ন হওয়ার 48 ঘন্টা পর্যন্ত স্ক্যানিং ফলাফল পাওয়া যায় এবং স্ক্যানের পরে দুর্বলতার তথ্য আপডেট করা হয় না।

আপনার CI/CD পাইপলাইনে কন্টেইনার বিশ্লেষণ সংহত করার মাধ্যমে, আপনি সেই মেটাডেটার উপর ভিত্তি করে সিদ্ধান্ত নিতে পারেন। উদাহরণস্বরূপ, আপনি বাইনারি অথরাইজেশন ব্যবহার করে এমন স্থাপনা নীতি তৈরি করতে পারেন যা শুধুমাত্র বিশ্বস্ত রেজিস্ট্রি থেকে অনুগত চিত্রগুলির জন্য স্থাপনার অনুমতি দেয়।

তুমি কি শিখবে

  • কীভাবে স্বয়ংক্রিয় স্ক্যানিং সক্ষম করবেন
  • অন-ডিমান্ড স্ক্যানিং কীভাবে করবেন
  • একটি বিল্ড পাইপলাইনে স্ক্যানিং কীভাবে একীভূত করবেন
  • অনুমোদিত ছবিগুলিতে কীভাবে স্বাক্ষর করবেন
  • ছবি ব্লক করার জন্য GKE ভর্তি কন্ট্রোলার কীভাবে ব্যবহার করবেন
  • শুধুমাত্র স্বাক্ষরিত অনুমোদিত ছবিগুলিকে অনুমতি দেওয়ার জন্য GKE কীভাবে কনফিগার করবেন

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

  1. গুগল ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন অথবা বিদ্যমান একটি পুনরায় ব্যবহার করুন। যদি আপনার ইতিমধ্যেই একটি জিমেইল বা গুগল ওয়ার্কস্পেস অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png সম্পর্কে

a99b7ace416376c4.png সম্পর্কে

bd84a6d3004737c5.png সম্পর্কে

  • এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রজেক্টের নামটি প্রদর্শন করা হবে। এটি একটি অক্ষর স্ট্রিং যা Google API গুলি ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • সমস্ত Google ক্লাউড প্রোজেক্টে প্রোজেক্ট আইডি অনন্য এবং অপরিবর্তনীয় (সেট করার পরে এটি পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটি কী তা নিয়ে চিন্তা করেন না। বেশিরভাগ কোডল্যাবে, আপনাকে প্রোজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। যদি আপনি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি র্যান্ডম তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন যে এটি উপলব্ধ কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে।
  • আপনার তথ্যের জন্য, তৃতীয় একটি মান আছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপর, ক্লাউড রিসোর্স/API ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবটি চালানোর জন্য খুব বেশি খরচ হবে না, এমনকি কিছু খরচও হবে না। এই টিউটোরিয়ালের পরে যাতে আপনাকে বিলিং করতে না হয় সেজন্য রিসোর্সগুলি বন্ধ করতে, আপনি আপনার তৈরি রিসোর্সগুলি মুছে ফেলতে পারেন অথবা পুরো প্রকল্পটি মুছে ফেলতে পারেন। গুগল ক্লাউডের নতুন ব্যবহারকারীরা $300 USD ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউডশেল এডিটর শুরু করুন

এই ল্যাবটি গুগল ক্লাউড শেল এডিটরের সাথে ব্যবহারের জন্য ডিজাইন এবং পরীক্ষিত হয়েছিল। এডিটর অ্যাক্সেস করতে,

  1. https://console.cloud.google.com এ আপনার গুগল প্রোজেক্ট অ্যাক্সেস করুন।
  2. উপরের ডান কোণে ক্লাউড শেল এডিটর আইকনে ক্লিক করুন।

8560cc8d45e8c112.png সম্পর্কে

  1. আপনার উইন্ডোর নীচে একটি নতুন ফলক খুলবে।

পরিবেশ সেটআপ

ক্লাউড শেলে, আপনার প্রোজেক্ট আইডি এবং প্রোজেক্ট নম্বর সেট করুন। 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 

আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করুন

এই ল্যাবে আপনি আপনার ছবিগুলি সংরক্ষণ এবং স্ক্যান করার জন্য আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করবেন। নিম্নলিখিত কমান্ড ব্যবহার করে সংগ্রহস্থল তৈরি করুন।

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

আর্টিফ্যাক্ট রেজিস্ট্রি অ্যাক্সেস করার সময় আপনার gcloud শংসাপত্রগুলি ব্যবহার করার জন্য ডকার কনফিগার করুন।

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

৩. স্বয়ংক্রিয় স্ক্যানিং

আর্টিফ্যাক্ট রেজিস্ট্রি বা কন্টেইনার রেজিস্ট্রিতে নতুন ছবি পুশ করার সময় আর্টিফ্যাক্ট স্ক্যানিং স্বয়ংক্রিয়ভাবে ট্রিগার হয়। নতুন দুর্বলতা আবিষ্কৃত হলে দুর্বলতার তথ্য ক্রমাগত আপডেট করা হয়। এই বিভাগে আপনি একটি ছবি আর্টিফ্যাক্ট রেজিস্ট্রিতে পুশ করবেন এবং ফলাফলগুলি অন্বেষণ করবেন।

একটি কাজের ডিরেক্টরি তৈরি করুন এবং পরিবর্তন করুন

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

ছবি তৈরি করুন এবং AR তে পুশ করুন

ক্লাউড বিল্ড ব্যবহার করে আপনার কন্টেইনার তৈরি করুন এবং স্বয়ংক্রিয়ভাবে আর্টিফ্যাক্ট রেজিস্ট্রিতে পুশ করুন। ছবিতে bad ট্যাগটি লক্ষ্য করুন। এটি আপনাকে পরবর্তী পদক্ষেপগুলির জন্য এটি সনাক্ত করতে সাহায্য করবে।

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

ছবির বিবরণ পর্যালোচনা করুন

বিল্ড প্রক্রিয়া সম্পন্ন হলে, আর্টিফ্যাক্ট রেজিস্ট্রি ড্যাশবোর্ডে ছবিটি এবং ভালনারেবিলিটি ফলাফল পর্যালোচনা করুন।

  1. ক্লাউড কনসোলে আর্টিফ্যাক্ট রেজিস্ট্রি খুলুন
  2. বিষয়বস্তু দেখতে আর্টিফ্যাক্ট-স্ক্যানিং-রেপোতে ক্লিক করুন।
  3. ছবির বিস্তারিত বিবরণে ক্লিক করুন
  4. আপনার ছবির সর্বশেষ সংক্ষেপে ক্লিক করুন।
  5. স্ক্যান শেষ হয়ে গেলে ছবির জন্য দুর্বলতা ট্যাবে ক্লিক করুন।

দুর্বলতা ট্যাব থেকে আপনি আপনার তৈরি করা ছবিটির স্বয়ংক্রিয় স্ক্যানিংয়ের ফলাফল দেখতে পাবেন।

361be7b3bf293fca.png সম্পর্কে

স্বয়ংক্রিয় স্ক্যানিং ডিফল্টরূপে সক্রিয় থাকে। আপনি কীভাবে স্বয়ংক্রিয় স্ক্যানিং বন্ধ/চালু করতে পারেন তা দেখতে আর্টিফ্যাক্ট রেজিস্ট্রি সেটিংস ঘুরে দেখুন।

৪. চাহিদা অনুযায়ী স্ক্যানিং

বিভিন্ন পরিস্থিতিতে ছবিটিকে রিপোজিটরিতে পুশ করার আগে আপনাকে স্ক্যান করতে হতে পারে। উদাহরণস্বরূপ, একজন কন্টেইনার ডেভেলপার সোর্স কন্ট্রোলে কোডটি পুশ করার আগে একটি ছবি স্ক্যান করে সমস্যাগুলি সমাধান করতে পারে। নীচের উদাহরণে আপনি ফলাফলের উপর কাজ করার আগে স্থানীয়ভাবে ছবিটি তৈরি এবং বিশ্লেষণ করবেন।

একটি ছবি তৈরি করুন

এই ধাপে আপনি আপনার স্থানীয় ক্যাশে ছবিটি তৈরি করতে স্থানীয় ডকার ব্যবহার করবেন।

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

৫. পাইপলাইন স্ক্যানিং তৈরি করুন

এই বিভাগে আপনি একটি স্বয়ংক্রিয় বিল্ড পাইপলাইন তৈরি করবেন যা আপনার কন্টেইনার ইমেজ তৈরি করবে, এটি স্ক্যান করবে এবং ফলাফল মূল্যায়ন করবে। যদি কোনও CRITICAL দুর্বলতা পাওয়া না যায় তবে এটি ছবিটিকে রিপোজিটরিতে ঠেলে দেবে। যদি CRITICAL দুর্বলতা পাওয়া যায় তবে বিল্ডটি ব্যর্থ হবে এবং প্রস্থান করবে।

ক্লাউড বিল্ড পরিষেবা অ্যাকাউন্টের জন্য অ্যাক্সেস প্রদান করুন

অন-ডিমান্ড স্ক্যানিং এপিআই অ্যাক্সেস করার জন্য ক্লাউড বিল্ডের অধিকারের প্রয়োজন হবে। নিম্নলিখিত কমান্ডগুলি ব্যবহার করে অ্যাক্সেস প্রদান করুন।

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"

ক্লাউড বিল্ড পাইপলাইন তৈরি করুন

নিম্নলিখিত কমান্ডটি আপনার ডিরেক্টরিতে একটি 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

CI পাইপলাইন চালান

CRITICAL তীব্রতার দুর্বলতা পাওয়া গেলে বিল্ড ব্রেক যাচাই করার জন্য প্রক্রিয়াকরণের জন্য বিল্ড জমা দিন।

gcloud builds submit

পর্যালোচনা বিল্ড ব্যর্থতা

আপনার জমা দেওয়া বিল্ডটি ব্যর্থ হবে কারণ ছবিতে CRITICAL দুর্বলতা রয়েছে।

ক্লাউড বিল্ড ইতিহাস পৃষ্ঠায় বিল্ড ব্যর্থতা পর্যালোচনা করুন

দুর্বলতা ঠিক করুন

ডকারফাইল আপডেট করে এমন একটি বেস ইমেজ ব্যবহার করুন যাতে CRITICAL দুর্বলতা নেই।

নিম্নলিখিত কমান্ড দিয়ে ডেবিয়ান 10 ইমেজ ব্যবহার করতে ডকারফাইলটি ওভাররাইট করুন।

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

ভালো ইমেজ দিয়ে CI প্রক্রিয়া চালান।

কোনও CRITICAL তীব্রতার দুর্বলতা না পাওয়া গেলে বিল্ডটি সফল হবে কিনা তা যাচাই করার জন্য প্রক্রিয়াকরণের জন্য বিল্ড জমা দিন।

gcloud builds submit

পর্যালোচনা তৈরির সাফল্য

আপনার জমা দেওয়া বিল্ডটি সফল হবে কারণ আপডেট করা ছবিতে কোনও CRITICAL দুর্বলতা নেই।

ক্লাউড বিল্ড ইতিহাস পৃষ্ঠায় বিল্ড সাফল্য পর্যালোচনা করুন।

স্ক্যান ফলাফল পর্যালোচনা করুন

আর্টিফ্যাক্ট রেজিস্ট্রিতে ভালো ছবিটি পর্যালোচনা করুন

  1. ক্লাউড কনসোলে আর্টিফ্যাক্ট রেজিস্ট্রি খুলুন
  2. বিষয়বস্তু দেখতে আর্টিফ্যাক্ট-স্ক্যানিং-রেপোতে ক্লিক করুন।
  3. ছবির বিস্তারিত বিবরণে ক্লিক করুন
  4. আপনার ছবির সর্বশেষ সংক্ষেপে ক্লিক করুন।
  5. ছবির জন্য দুর্বলতা ট্যাবে ক্লিক করুন।

৬. ছবি স্বাক্ষর করা

একটি অ্যাটেস্টর নোট তৈরি করুন

একটি অ্যাটেস্টর নোট হল কেবলমাত্র একটি ছোট ডেটা যা প্রয়োগ করা স্বাক্ষরের ধরণের জন্য একটি লেবেল হিসাবে কাজ করে। উদাহরণস্বরূপ, একটি নোট দুর্বলতা স্ক্যান নির্দেশ করতে পারে, অন্যটি 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 নির্দেশ করে, আপনি পরবর্তী ধাপে কীগুলি প্রদান করবেন।

আরও মনে রাখবেন যে, ক্লাউড বিল্ড আপনার প্রোজেক্টে স্বয়ংক্রিয়ভাবে built-by-cloud-build অ্যাটেস্টার তৈরি করে যখন আপনি এমন একটি বিল্ড চালান যা ছবি তৈরি করে। তাই উপরের কমান্ডটি দুটি অ্যাটেস্টার ফেরত দেয়, vulnz-attestor এবং built-by-cloud-build । ছবিগুলি সফলভাবে তৈরি হওয়ার পরে, ক্লাউড বিল্ড স্বয়ংক্রিয়ভাবে স্বাক্ষর করে এবং তাদের জন্য অ্যাটেস্টেশন তৈরি করে।

IAM ভূমিকা যোগ করা হচ্ছে

বাইনারি অথরাইজেশন সার্ভিস অ্যাকাউন্টের সত্যায়ন নোট দেখার অধিকার প্রয়োজন হবে। নিম্নলিখিত API কলের মাধ্যমে অ্যাক্সেস প্রদান করুন

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"

একটি KMS কী যোগ করা হচ্ছে

নোট সংযুক্ত করতে এবং যাচাইযোগ্য স্বাক্ষর প্রদানের জন্য অ্যাটেস্টরের ক্রিপ্টোগ্রাফিক কী প্রয়োজন। এই ধাপে আপনি ক্লাউড বিল্ডের পরে অ্যাক্সেসের জন্য KMS-এ কী তৈরি এবং সংরক্ষণ করবেন।

প্রথমে নতুন কী বর্ণনা করার জন্য কিছু পরিবেশগত ভেরিয়েবল যোগ করুন।

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"

গুগল ক্লাউড কনসোলের KMS পৃষ্ঠায় আপনার কীটি প্রদর্শিত হবে।

এখন, gcloud binauthz কমান্ডের মাধ্যমে আপনার attester এর সাথে কীটি সংযুক্ত করুন:

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}

৭. ক্লাউড বিল্ডের সাথে স্বাক্ষর করা

আপনি ইমেজ সাইনিং সক্ষম করেছেন এবং আপনার নমুনা ইমেজ সাইন করার জন্য ম্যানুয়ালি অ্যাটেস্টর ব্যবহার করেছেন। বাস্তবে আপনি CI/CD পাইপলাইনের মতো স্বয়ংক্রিয় প্রক্রিয়াগুলির সময় অ্যাটেস্টেশন প্রয়োগ করতে চাইবেন।

এই বিভাগে আপনি স্বয়ংক্রিয়ভাবে ছবি যাচাই করার জন্য ক্লাউড বিল্ড কনফিগার করবেন

ভূমিকা

ক্লাউড বিল্ড সার্ভিস অ্যাকাউন্টে বাইনারি অথরাইজেশন অ্যাটেস্টর ভিউয়ার রোল যোগ করুন:

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

ক্লাউড বিল্ড সার্ভিস অ্যাকাউন্টে (KMS-ভিত্তিক সাইনিং) ক্লাউড KMS CryptoKey সাইনার/যাচাইকারীর ভূমিকা যোগ করুন:

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

ক্লাউড বিল্ড সার্ভিস অ্যাকাউন্টে কন্টেইনার বিশ্লেষণ নোটস অ্যাটাচারের ভূমিকা যোগ করুন:

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

কাস্টম বিল্ড ক্লাউড বিল্ড ধাপ প্রস্তুত করুন

আপনি ক্লাউড বিল্ডে একটি কাস্টম বিল্ড ধাপ ব্যবহার করবেন যাতে প্রত্যয়ন প্রক্রিয়াটি সহজ করা যায়। গুগল এই কাস্টম বিল্ড ধাপটি প্রদান করে যাতে প্রক্রিয়াটি সহজতর করার জন্য সহায়ক ফাংশন রয়েছে। ব্যবহারের আগে, কাস্টম বিল্ড ধাপের কোডটি একটি পাত্রে তৈরি করতে হবে এবং ক্লাউড বিল্ডে পুশ করতে হবে। এটি করার জন্য, নিম্নলিখিত কমান্ডগুলি চালান:

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-এ একটি সাইনিং ধাপ যোগ করুন

এই ধাপে আপনি আপনার পূর্বে তৈরি করা ক্লাউড বিল্ড পাইপলাইনে প্রত্যয়ন ধাপটি যোগ করবেন।

  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

ক্লাউড বিল্ড ইতিহাসে বিল্ড পর্যালোচনা করুন

ক্লাউড কনসোল থেকে ক্লাউড বিল্ড ইতিহাস পৃষ্ঠাটি খুলুন এবং সর্বশেষ বিল্ড এবং বিল্ড ধাপগুলির সফল সম্পাদন পর্যালোচনা করুন।

৮. ভর্তি নিয়ন্ত্রণ নীতিমালা

GKE এবং Cloud Run-এর মধ্যে বাইনারি অথরাইজেশন হল একটি বৈশিষ্ট্য যা একটি কন্টেইনার ছবি চালানোর আগে নিয়ম যাচাই করার ক্ষমতা প্রদান করে। কোনও ছবি চালানোর জন্য যেকোনো অনুরোধের ক্ষেত্রেই এই যাচাইকরণ কার্যকর হয়, তা সে কোনও বিশ্বস্ত CI/CD পাইপলাইন থেকে হোক বা কোনও ব্যবহারকারী ম্যানুয়ালি কোনও ছবি স্থাপন করার চেষ্টা করুক না কেন। এই ক্ষমতা আপনাকে কেবল CI/CD পাইপলাইন চেকের চেয়ে আপনার রানটাইম পরিবেশকে আরও কার্যকরভাবে সুরক্ষিত করতে দেয়।

এই ক্ষমতাটি বোঝার জন্য আপনাকে একটি কঠোর অনুমোদনের নিয়ম প্রয়োগ করার জন্য ডিফল্ট GKE নীতি পরিবর্তন করতে হবে।

GKE ক্লাস্টার তৈরি করুন

GKE ক্লাস্টার তৈরি করুন:

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

এই ক্লাস্টারে ক্লাউড বিল্ড স্থাপনের অনুমতি দিন:

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. টার্মিনাল খুলুন এবং নতুন নীতি প্রয়োগ করুন এবং পরিবর্তনটি প্রচারিত হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন।
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

৯. GKE-তে ব্লক দুর্বলতা

এই বিভাগে আপনি এখন পর্যন্ত যা শিখেছেন তা একত্রিত করে ক্লাউড বিল্ডের সাথে একটি CI/CD পাইপলাইন বাস্তবায়ন করবেন যা ছবিগুলি স্ক্যান করবে, তারপর ছবিটি স্বাক্ষর করার আগে এবং স্থাপনের চেষ্টা করার আগে দুর্বলতাগুলি পরীক্ষা করবে। GKE ছবিটি চালানোর অনুমতি দেওয়ার আগে ভালনারেবিলিটি স্ক্যানিং থেকে স্বাক্ষর আছে কিনা তা যাচাই করার জন্য বাইনারি অথরাইজেশন ব্যবহার করবে।

d5c41bb89e22fd61.png সম্পর্কে

প্রত্যয়ন বাধ্যতামূলক করার জন্য GKE নীতি আপডেট করুন

আপনার GKE BinAuth নীতিতে clusterAdmissionRules যোগ করে ছবিগুলি আপনার Attester দ্বারা স্বাক্ষরিত হওয়া আবশ্যক।

নিচের কমান্ডটি ব্যবহার করে আপডেট করা কনফিগারেশন দিয়ে নীতিটি ওভাররাইট করুন।

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

কনসোলে কাজের চাপ পর্যালোচনা করুন এবং ছবিটির সফল স্থাপনা লক্ষ্য করুন।

১০. অভিনন্দন!

অভিনন্দন, তুমি কোডল্যাব শেষ করেছ!

আমরা যা কভার করেছি:

  • কীভাবে স্বয়ংক্রিয় স্ক্যানিং সক্ষম করবেন
  • অন-ডিমান্ড স্ক্যানিং কীভাবে করবেন
  • একটি বিল্ড পাইপলাইনে স্ক্যানিং কীভাবে একীভূত করবেন
  • অনুমোদিত ছবিগুলিতে কীভাবে স্বাক্ষর করবেন
  • ছবি ব্লক করার জন্য GKE ভর্তি কন্ট্রোলার কীভাবে ব্যবহার করবেন
  • শুধুমাত্র স্বাক্ষরিত অনুমোদিত ছবিগুলিকে অনুমতি দেওয়ার জন্য GKE কীভাবে কনফিগার করবেন

এরপর কি:

পরিষ্কার করা

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সের জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, হয় রিসোর্স ধারণকারী প্রজেক্টটি মুছে ফেলুন, অথবা প্রজেক্টটি রেখে পৃথক রিসোর্সগুলি মুছে ফেলুন।

প্রকল্পটি মুছে ফেলা হচ্ছে

বিলিং দূর করার সবচেয়ে সহজ উপায় হল টিউটোরিয়ালের জন্য তৈরি করা প্রকল্পটি মুছে ফেলা।