1. مقدمه
آسیبپذیریهای نرمافزار نقاط ضعفی هستند که میتوانند باعث خرابی تصادفی سیستم شوند یا عوامل بد را ابزاری برای به خطر انداختن نرمافزار شما قرار دهند. Container Analysis دو نوع اسکن سیستم عامل را برای یافتن آسیبپذیریها در کانتینرها ارائه میکند:
- On-Demand Scanning API به شما امکان می دهد تا به صورت دستی تصاویر کانتینر را برای آسیب پذیری های سیستم عامل اسکن کنید، چه به صورت محلی در رایانه خود یا از راه دور در Container Registry یا Artifact Registry.
- Container Scanning API به شما امکان می دهد تا تشخیص آسیب پذیری سیستم عامل را خودکار کنید و هر بار که تصویری را به رجیستری کانتینر یا رجیستری مصنوع فشار می دهید اسکن کنید. فعال کردن این API همچنین اسکن بسته های زبان را برای آسیب پذیری های Go و Java فعال می کند.
On-Demand Scanning API به شما امکان می دهد تصاویر ذخیره شده به صورت محلی در رایانه خود یا از راه دور در Container Registry یا Artifact Registry را اسکن کنید. این به شما کنترل دقیقی بر روی کانتینرهایی که می خواهید برای آسیب پذیری ها اسکن کنید، می دهد. میتوانید از اسکن درخواستی برای اسکن تصاویر در خط لوله CI/CD خود قبل از تصمیمگیری در مورد ذخیره آنها در رجیستری استفاده کنید.
چیزی که یاد خواهید گرفت
در این آزمایشگاه شما:
- ساخت تصاویر با Cloud Build
- از رجیستری مصنوع برای کانتینرها استفاده کنید
- از اسکن خودکار آسیب پذیری استفاده کنید
- پیکربندی اسکن درخواستی
- اسکن تصویر را در CICD در Cloud Build اضافه کنید
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید 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 برای دسترسی به api اسکن درخواستی به حقوق نیاز دارد. با دستورات زیر دسترسی را فراهم کنید.
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 را ایجاد کنید
دستور زیر یک فایل 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
خط لوله CI را اجرا کنید
ساخت را برای پردازش ارسال کنید
gcloud builds submit
بررسی جزئیات ساخت
هنگامی که فرآیند ساخت شروع شد، پیشرفت را در داشبورد Cloud Build بررسی کنید.
- Cloud Build را در Cloud Console باز کنید
- برای مشاهده مطالب بر روی ساخت کلیک کنید
4. رجیستری مصنوع برای کانتینرها
مخزن رجیستری مصنوع را ایجاد کنید
در این آزمایشگاه شما از Artifact Registry برای ذخیره و اسکن تصاویر خود استفاده خواهید کرد. با دستور زیر مخزن را ایجاد کنید.
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
خط لوله ساخت ابر را به روز کنید
خط لوله ساخت خود را تغییر دهید تا تصویر حاصل به آرتیفکت رجیستری فشار داده شود
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
خط لوله CI را اجرا کنید
ساخت را برای پردازش ارسال کنید
gcloud builds submit
5. اسکن خودکار آسیب پذیری
اسکن مصنوع به طور خودکار هر بار که تصویر جدیدی را به رجیستری مصنوع یا رجیستری کانتینر فشار می دهید، فعال می شود. هنگامی که آسیب پذیری های جدید کشف می شود، اطلاعات آسیب پذیری به طور مداوم به روز می شود. در این بخش، تصویری را که به تازگی ساختهاید و به رجیستری Artifact فرستادهاید، مرور میکنید و نتایج آسیبپذیری را بررسی میکنید.
بررسی جزئیات تصویر
پس از تکمیل فرآیند ساخت قبلی، تصویر و آسیبپذیری را در داشبورد Artifact Registry بررسی کنید.
- رجیستری Artifact را در Cloud Console باز کنید
- برای مشاهده مطالب روی artifact-scanning-repo کلیک کنید
- روی جزئیات تصویر کلیک کنید
- روی آخرین خلاصه تصویر خود کلیک کنید
- پس از پایان اسکن، روی تب آسیب پذیری تصویر کلیک کنید
از برگه آسیب پذیری ها، نتایج اسکن خودکار تصویری را که به تازگی ساخته اید، مشاهده خواهید کرد.
اسکن خودکار به طور پیش فرض فعال است. تنظیمات رجیستری مصنوع را کاوش کنید تا ببینید چگونه می توانید اسکن خودکار را خاموش/روشن کنید.
6. اسکن بر اساس تقاضا
سناریوهای مختلفی وجود دارد که ممکن است لازم باشد قبل از فشار دادن تصویر به یک مخزن، یک اسکن انجام دهید. به عنوان مثال، یک توسعه دهنده کانتینر ممکن است قبل از فشار دادن کد به کنترل منبع، یک تصویر را اسکن کرده و مشکلات را برطرف کند. در مثال زیر قبل از اقدام بر روی نتایج، تصویر را به صورت محلی ساخته و آنالیز خواهید کرد.
یک تصویر بسازید
در این مرحله از docker محلی برای ساختن تصویر در حافظه پنهان محلی خود استفاده خواهید کرد.
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. اسکن در CICD با Cloud Build
دسترسی برای حساب خدمات ساخت ابری فراهم کنید
Cloud Build برای دسترسی به api اسکن درخواستی به حقوق نیاز دارد. با دستورات زیر دسترسی را فراهم کنید.
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 را اجرا کنید
ساخت را برای پردازش ارسال کنید تا وقتی آسیبپذیری با شدت بحرانی پیدا شد، خرابیهای ساخت را تأیید کنید.
gcloud builds submit
بررسی خرابی ساخت
ساختنی که ارسال کردید با شکست مواجه می شود زیرا تصویر حاوی آسیب پذیری های مهمی است.
شکست ساخت را در صفحه Cloud Build History مرور کنید
آسیب پذیری را برطرف کنید
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
فرآیند CI را با تصویر خوب اجرا کنید
ساخت را برای پردازش ارسال کنید تا تأیید شود که وقتی هیچ آسیبپذیری با شدت بحرانی پیدا نشد، ساخت موفق میشود.
gcloud builds submit
بررسی موفقیت ساخت
ساختنی که به تازگی ارسال کردید موفق خواهد شد زیرا تصویر به روز شده حاوی هیچ آسیب پذیری مهمی نیست.
موفقیت ساخت را در صفحه Cloud Build History مرور کنید
نتایج اسکن را مرور کنید
تصویر خوب را در رجیستری Artifact مرور کنید
- رجیستری Artifact را در Cloud Console باز کنید
- برای مشاهده مطالب روی artifact-scanning-repo کلیک کنید
- روی جزئیات تصویر کلیک کنید
- روی آخرین خلاصه تصویر خود کلیک کنید
- روی تب آسیب پذیری برای تصویر کلیک کنید
8. تبریک!
تبریک می گویم، شما نرم افزار کد را تمام کردید!
آنچه ما پوشش داده ایم:
- ساخت تصاویر با Cloud Build
- رجیستری مصنوع برای کانتینرها
- اسکن خودکار آسیب پذیری ها
- اسکن بر اساس تقاضا
- اسکن در CICD با Cloud Build
بعدش چیه:
- ایمن سازی استقرار تصاویر در Cloud Run و Google Kubernetes Engine | مستندات ساخت ابر
- شروع سریع: یک خط مشی مجوز باینری را با GKE | پیکربندی کنید Google Cloud
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، یا پروژه حاوی منابع را حذف کنید یا پروژه را نگه دارید و منابع فردی را حذف کنید.
حذف پروژه
ساده ترین راه برای حذف صورتحساب، حذف پروژه ای است که برای آموزش ایجاد کرده اید.
-
آخرین به روز رسانی: 3/21/23