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

১. ভূমিকা

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

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

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

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

আপনি যা শিখবেন

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

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

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

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

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

  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 vulnerabilities) না পাওয়া যায়, তবে এটি ইমেজটি রিপোজিটরিতে পুশ করবে। আর যদি গুরুতর দুর্বলতা পাওয়া যায়, তবে বিল্ডটি ব্যর্থ হবে এবং বন্ধ হয়ে যাবে।

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

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

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

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

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

ক্লাউড বিল্ড হিস্ট্রি পেজে বিল্ড ব্যর্থতা পর্যালোচনা করুন।

দুর্বলতাটি সমাধান করুন

এমন একটি বেস ইমেজ ব্যবহার করার জন্য 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

সঠিক ইমেজ দিয়ে CI প্রসেসটি চালান।

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

gcloud builds submit

বিল্ডের সাফল্য পর্যালোচনা করুন

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

ক্লাউড বিল্ড হিস্ট্রি পেজে বিল্ডের সাফল্য পর্যালোচনা করুন।

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

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

  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 কী যোগ করা

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

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

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 কমান্ডের মাধ্যমে আপনার অ্যাটেস্টরের সাথে কী-টি সংযুক্ত করুন:

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

ক্লাউড বিল্ড সার্ভিস অ্যাকাউন্টে ক্লাউড কেএমএস ক্রিপ্টো-কী সাইনার/ভেরিফায়ার রোল যোগ করুন (কেএমএস-ভিত্তিক সাইনিং):

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

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

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 কীভাবে কনফিগার করবেন

এরপর কী:

পরিষ্কার করা

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

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

বিলিং বন্ধ করার সবচেয়ে সহজ উপায় হলো টিউটোরিয়ালের জন্য তৈরি করা প্রজেক্টটি ডিলিট করে দেওয়া।