বাইনারি প্রমাণের সাথে গেটিং স্থাপনা

1। পরিচিতি

বাইনারি অথরাইজেশন হল একটি ডিপ্লয়-টাইম সিকিউরিটি কন্ট্রোল যা নিশ্চিত করে যে শুধুমাত্র বিশ্বস্ত কন্টেইনার ইমেজগুলি Google Kubernetes Engine (GKE) বা ক্লাউড রানে স্থাপন করা হয়েছে। বাইনারি অনুমোদনের সাথে, আপনি বিকাশ প্রক্রিয়া চলাকালীন বিশ্বস্ত কর্তৃপক্ষের দ্বারা চিত্রগুলি স্বাক্ষর করার প্রয়োজন করতে পারেন এবং তারপর স্থাপন করার সময় স্বাক্ষরের বৈধতা প্রয়োগ করতে পারেন৷ বৈধতা প্রয়োগ করে, আপনি নিশ্চিত করে আপনার কন্টেইনার পরিবেশের উপর কঠোর নিয়ন্ত্রণ অর্জন করতে পারেন শুধুমাত্র যাচাইকৃত ছবিগুলিকে বিল্ড-এব-রিলিজ প্রক্রিয়ায় একত্রিত করা হয়েছে।

নিম্নলিখিত চিত্রটি একটি বাইনারি অনুমোদন/ক্লাউড বিল্ড সেটআপের উপাদানগুলি দেখায়:

ক্লাউড বিল্ড বাইনারি অনুমোদন প্রত্যয়ন পাইপলাইন। **চিত্র 1.**ক্লাউড বিল্ড পাইপলাইন যা একটি বাইনারি অনুমোদন প্রত্যয়ন তৈরি করে।

এই পাইপলাইনে:

  1. কন্টেইনার ইমেজ তৈরি করার জন্য কোড একটি সোর্স রিপোজিটরিতে পুশ করা হয়, যেমন ক্লাউড সোর্স রিপোজিটরি
  2. একটি ক্রমাগত ইন্টিগ্রেশন (CI) টুল, ক্লাউড বিল্ড কন্টেইনার তৈরি করে এবং পরীক্ষা করে।
  3. বিল্ড কনটেইনার ইমেজটিকে কনটেইনার রেজিস্ট্রি বা অন্য রেজিস্ট্রিতে ঠেলে দেয় যা আপনার তৈরি করা ছবিগুলিকে সঞ্চয় করে।
  4. ক্লাউড কী ম্যানেজমেন্ট সার্ভিস , যা ক্রিপ্টোগ্রাফিক কী জোড়ার জন্য কী ব্যবস্থাপনা প্রদান করে, ধারক চিত্রে স্বাক্ষর করে। ফলস্বরূপ স্বাক্ষর তারপর একটি নতুন তৈরি সত্যায়ন সংরক্ষণ করা হয়.
  5. স্থাপনের সময়, প্রত্যয়ক কী জোড়া থেকে সর্বজনীন কী ব্যবহার করে প্রত্যয়ন যাচাই করে। বাইনারি অনুমোদন কন্টেইনার ইমেজ স্থাপন করার জন্য স্বাক্ষরিত প্রত্যয়ন প্রয়োজন দ্বারা নীতি প্রয়োগ করে।

এই ল্যাবে আপনি স্থাপন করা আর্টিফ্যাক্টগুলিকে সুরক্ষিত করার জন্য সরঞ্জাম এবং কৌশলগুলিতে ফোকাস করবেন। এই ল্যাবটি আর্টিফ্যাক্টগুলি (পাত্রে) তৈরি করার পরে ফোকাস করে কিন্তু কোনও নির্দিষ্ট পরিবেশে স্থাপন করা হয়নি।

আপনি কি শিখবেন

  • ইমেজ সাইনিং
  • ভর্তি নিয়ন্ত্রণ নীতি
  • সাইনিং স্ক্যান করা ছবি
  • স্বাক্ষরিত ছবি অনুমোদন করা হচ্ছে
  • স্বাক্ষরবিহীন ছবি ব্লক করা হয়েছে

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

এনভায়রনমেন্ট সেটআপ

ক্লাউড শেলে, আপনার প্রকল্পের আইডি এবং আপনার প্রকল্পের জন্য প্রকল্প নম্বর সেট করুন। সেগুলিকে 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 auth configure-docker us-central1-docker.pkg.dev

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

mkdir vuln-scan && cd vuln-scan

একটি নমুনা চিত্র সংজ্ঞায়িত করুন

নিম্নলিখিত বিষয়বস্তু সহ ডকারফাইল নামে একটি ফাইল তৈরি করুন।

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

নিম্নলিখিত বিষয়বস্তু সহ 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-তে পুশ করুন

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

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

3. ইমেজ সাইনিং

একটি Attestor কি

অ্যাটেস্টর

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

এই ভূমিকাগুলির প্রত্যেকটি একজন ব্যক্তিকে প্রতিনিধিত্ব করতে পারে, বা আপনার সংস্থার লোকেদের একটি দল। একটি উত্পাদন পরিবেশে, এই ভূমিকাগুলি সম্ভবত পৃথক Google ক্লাউড প্ল্যাটফর্ম (GCP) প্রকল্পগুলির দ্বারা পরিচালিত হবে এবং ক্লাউড IAM ব্যবহার করে সীমিত ফ্যাশনে তাদের মধ্যে সংস্থানগুলিতে অ্যাক্সেস ভাগ করা হবে৷

a37eb2ed54b9c2eb.png

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

উদাহরণ হিসেবে, হার্টব্লিড দুর্বলতা ট্র্যাক করতে একটি নোট তৈরি করা যেতে পারে। নিরাপত্তা বিক্রেতারা তারপর দুর্বলতার জন্য কন্টেইনার ইমেজ পরীক্ষা করার জন্য স্ক্যানার তৈরি করবে, এবং প্রতিটি আপস করা কন্টেইনারের সাথে যুক্ত একটি ঘটনা তৈরি করবে।

208aa5ebc53ff2b3.png

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

বাইনারি অথরাইজেশন এপিআই "প্রমাণকারী" এবং "প্রত্যয়ন" এর ধারণাগুলি ব্যবহার করে, তবে এগুলি কন্টেইনার বিশ্লেষণ API-এ সংশ্লিষ্ট নোট এবং ঘটনাগুলি ব্যবহার করে প্রয়োগ করা হয়।

63a701bd0057ea17.png

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

একটি অ্যাটেস্টর নোট হ'ল একটি ছোট ডেটা যা প্রয়োগ করা স্বাক্ষরের প্রকারের জন্য একটি লেবেল হিসাবে কাজ করে। উদাহরণস্বরূপ একটি নোট দুর্বলতার স্ক্যান নির্দেশ করতে পারে, অন্যটি QA সাইন অফের জন্য ব্যবহার করা যেতে পারে। নোটটি স্বাক্ষর প্রক্রিয়ার সময় উল্লেখ করা হবে।

919f997db0ffb881.png

একটি নোট তৈরি করুন

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}"

আপনার নোট এখন কন্টেইনার বিশ্লেষণ API-এর মধ্যে সংরক্ষিত হয়েছে।

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

প্রত্যয়নকারীরা প্রকৃত চিত্র স্বাক্ষর প্রক্রিয়া সম্পাদন করতে ব্যবহৃত হয় এবং পরবর্তী যাচাইকরণের জন্য ইমেজের সাথে নোটের একটি ঘটনা সংযুক্ত করবে। আপনার অ্যাটেস্টর ব্যবহার করতে, আপনাকে অবশ্যই বাইনারি অনুমোদনের সাথে নোটটি নিবন্ধন করতে হবে:

ed05d438c79b654d.png

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

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 । ছবিগুলি সফলভাবে নির্মিত হওয়ার পরে, ক্লাউড বিল্ড স্বয়ংক্রিয়ভাবে স্বাক্ষর করে এবং তাদের জন্য প্রত্যয়ন তৈরি করে৷

আইএএম ভূমিকা যোগ করা হচ্ছে

বাইনারি অনুমোদন পরিষেবা অ্যাকাউন্টের প্রত্যয়নমূলক নোটগুলি দেখার অধিকারের প্রয়োজন হবে। নিম্নলিখিত 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

আইএএম নীতি তৈরি করতে ফাইলটি ব্যবহার করুন

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 কী যোগ করা হচ্ছে

1e3af7c177f7a311.png

আপনি এই অ্যাটেস্টরটি ব্যবহার করার আগে, আপনার কর্তৃপক্ষকে একটি ক্রিপ্টোগ্রাফিক কী জোড়া তৈরি করতে হবে যা কন্টেইনার চিত্রগুলিতে স্বাক্ষর করতে ব্যবহার করা যেতে পারে৷ এটি Google ক্লাউড কী ম্যানেজমেন্ট সার্ভিস (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"

আপনি Google ক্লাউড কনসোলের 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

একটি স্বাক্ষরিত প্রত্যয়ন তৈরি করা

এই মুহুর্তে আপনার কাছে এমন বৈশিষ্ট্যগুলি কনফিগার করা আছে যা আপনাকে চিত্রগুলিতে স্বাক্ষর করতে সক্ষম করে। আপনি যে কন্টেইনার ইমেজটির সাথে কাজ করছেন সেটিতে সাইন ইন করতে আপনি পূর্বে তৈরি করা অ্যাটেস্টর ব্যবহার করুন।

858d7e6feeb6f159.png

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

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}

4. ভর্তি নিয়ন্ত্রণ নীতি

বাইনারি অনুমোদন হল 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. নীতি পরিবর্তন করুন

একটি পাঠ্য সম্পাদকে, মূল্যায়ন মোড 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

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

আরও জটিল নীতিগুলি কীভাবে তৈরি করা যায় তার নির্দেশাবলীর জন্য, বাইনারি অনুমোদন ডকুমেন্টেশন দেখুন।

657752497e59378c.png

  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. নীতি পরিবর্তন করুন

একটি পাঠ্য সম্পাদকে, মূল্যায়ন মোডকে 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

5. স্ক্যান করা ছবিগুলিতে স্বাক্ষর করা

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

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

ভূমিকা

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

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

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

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

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"

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

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

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

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

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

6. স্বাক্ষরিত ছবি অনুমোদন করা

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

d5c41bb89e22fd61.png

সত্যায়নের প্রয়োজনে GKE নীতি আপডেট করুন

আপনার GKE BinAuth নীতিতে ক্লাস্টারঅ্যাডমিশন রুলস যোগ করে আপনার অ্যাটেস্টর দ্বারা ছবিগুলি স্বাক্ষর করা প্রয়োজন

বর্তমানে, আপনার ক্লাস্টার একটি নিয়মের সাথে একটি নীতি চালাচ্ছে: অফিসিয়াল রিপোজিটরি থেকে কন্টেইনারগুলিকে অনুমতি দিন এবং অন্য সবগুলি প্রত্যাখ্যান করুন৷

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

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

আপনার এখন ডিস্কে একটি নতুন ফাইল থাকা উচিত, যার নাম updated_policy.yaml। এখন, সমস্ত ছবি প্রত্যাখ্যান করার ডিফল্ট নিয়মের পরিবর্তে, এটি প্রথমে যাচাইকরণের জন্য আপনার প্রমাণকারীকে পরীক্ষা করে।

822240fc0b02408e.png

বাইনারি অনুমোদনে নতুন নীতি আপলোড করুন:

gcloud beta container binauthz policy import binauth_policy.yaml

একটি স্বাক্ষরিত ছবি স্থাপন করুন

ভালো ছবির জন্য ইমেজ ডাইজেস্ট পান

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

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

7. স্বাক্ষরবিহীন ছবি ব্লক করা হয়েছে

একটি চিত্র তৈরি করুন

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

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

স্বাক্ষরবিহীন চিত্রটিকে রেপোতে পুশ করুন

docker push us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad

খারাপ ছবির জন্য ইমেজ ডাইজেস্ট পান

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

8. অভিনন্দন!

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

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

  • ইমেজ সাইনিং
  • ভর্তি নিয়ন্ত্রণ নীতি
  • সাইনিং স্ক্যান করা ছবি
  • স্বাক্ষরিত ছবি অনুমোদন করা হচ্ছে
  • স্বাক্ষরবিহীন ছবি ব্লক করা হয়েছে

এরপর কি:

পরিষ্কার কর

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

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

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

-

শেষ আপডেট: 3/21/23