ایمن‌سازی سیستم تشخیص ایمنی محل کار

۱. مقدمه

در این Codelab، شما یک برنامه نمایشی پایه خواهید ساخت که نحوه ادغام سرویس‌های مختلف Google Cloud را برای سرویسی که در یک پروژه با محدودیت‌های انطباق قرار دارد، نشان می‌دهد. این پروژه از قابلیت‌های امنیتی زیر استفاده می‌کند:

این Codelab برای توسعه‌دهندگان در تمام سطوح، از جمله مبتدیان، مناسب است. شما از رابط خط فرمان در Google Cloud Shell و کد پایتون استفاده خواهید کرد. نیازی نیست که متخصص پایتون باشید، اما درک اولیه از نحوه خواندن کد به شما در درک مفاهیم کمک می‌کند.

توجه: این یک اثبات مفهوم ساده‌شده است، نه یک برنامه‌ی کاربردی. اقدامات احتیاطی بیشتری مانند دسترسی خارجی احراز هویت‌شده و امن به این سرویس را در یک سناریوی دنیای واقعی اعمال کنید.

۲. قبل از شروع

راه‌اندازی پروژه

../shared/_project-setup.md

شروع پوسته ابری

Cloud Shell یک محیط خط فرمان است که در Google Cloud اجرا می‌شود و ابزارهای لازم از قبل روی آن بارگذاری شده‌اند.

  1. روی فعال کردن Cloud Shell در بالای کنسول Google Cloud کلیک کنید:

404e4cce0f23e5c5.png

  1. پس از اتصال به Cloud Shell، این دستور را برای تأیید احراز هویت خود در Cloud Shell اجرا کنید:
gcloud auth list
  1. برای تأیید اینکه پروژه شما برای استفاده با gcloud پیکربندی شده است، دستور زیر را اجرا کنید:
gcloud config get project
  1. تأیید کنید که پروژه مطابق انتظار است و سپس دستور زیر را برای تنظیم شناسه پروژه خود اجرا کنید:
export PROJECT_ID=$(gcloud config get project)

مجوزهای مورد نیاز IAM

حسابی که برای این codelab استفاده می‌کنید باید نقش‌های IAM زیر را داشته باشد. این مجوزها برای ایجاد منابع مورد نیاز Google Cloud (پروژه‌ها، پوشه‌ها، خوشه‌های GKE، کلیدهای KMS، حساب‌های سرویس و غیره) و پیکربندی Assured Workload ضروری هستند.

در سطح سازمان:

  • roles/assuredworkloads.admin (مدیر بارهای کاری مطمئن): برای ایجاد و مدیریت خود منبع بارهای کاری مطمئن، و حصول اطمینان از پیکربندی انطباق.

در سطح حساب صورتحساب (در حساب صورتحساب شما):

  • roles/billing.accountUser (کاربر حساب صورتحساب): برای پیوند دادن حساب صورتحساب مشخص شده.

پیکربندی متغیرهای Codelab

برای ایجاد زیرساخت مورد نیاز، باید متغیرهای محیطی زیر را فراهم کنید:

# The ID of the Billing Account in the format (XXXXXX-XXXXXX-XXXXXX).
# This value will be used to attach in the projects created using Assured Workloads
export BILLING_ACCOUNT=

# The ID of a Google Cloud Platform organization
# Run `gcloud organizations list` to check all your available organizations
export GCP_ORGANIZATION=

# The numeric ID of a folder where the Assured Workloads will create the resources.
export FOLDER_ID=

# Region where the application will be deployed.
# Since you are using Assured Workloads, you MUST use one of the valid locations as described here: <https://docs.cloud.google.com/assured-workloads/docs/locations>
export REGION="us-central1"

# The ID of an existing Google Cloud project to be used for API quota and billing purposes.
# This project will only be used to enable the Assured Workloads API and create an Assured Workload.
export QUOTA_PROJECT_ID=

# Random suffix used to avoid naming collisions when creating the GCP projects.
export RANDOM_SUFFIX=$(cat /dev/urandom | tr -dc 'a-z0-9' | head -c 5 ; echo)

# The ID of the projects that will be created using Assured Workloads.
# You can modify this value if you want a custom id.
export PROJECT_ID="il5-gemini-vision-aw-${RANDOM_SUFFIX}"
export KMS_PROJECT_ID="il5-gemini-vision-kms-${RANDOM_SUFFIX}"

۳. ایجاد پایه و اساس حجم کاری تضمین‌شده

اکنون می‌توانید پایه و اساس برنامه خود را در یک محیط تنظیم‌شده بنا کنید. از بارهای کاری مطمئن (Assured Workloads) برای کمک به اجرای الزامات انطباق با ایجاد یک محیط کنترل‌شده برای منابع خود استفاده کنید.

پروژه سهمیه‌بندی خود را پیکربندی کنید

API مربوط به Assured Workloads را در پروژه سهمیه‌بندی خود فعال کنید. این API برای ایجاد و مدیریت Assured Workloads مورد نیاز است.

gcloud services enable assuredworkloads.googleapis.com \
  --project="${QUOTA_PROJECT_ID}"

محیط کاری مطمئن ایجاد کنید

دستور زیر یک «منطقه فرود» امن برای نسخه آزمایشی شما ایجاد می‌کند. این دستور دو پروژه جدید Google Cloud را در پوشه و حساب صورتحساب مشخص شده شما ایجاد می‌کند.

  • یک پروژه، کلاستر و برنامه GKE شما را میزبانی می‌کند.
  • پروژه دیگر، کلیدهای رمزگذاری مدیریت‌شده توسط مشتری (CMEK) شما را مدیریت می‌کند.

این به طور خودکار کنترل‌های انطباق مشخص شده IL5 را از لحظه ایجاد هر دو پروژه بر روی آنها اعمال می‌کند.

برای ایجاد محیط بار کاری، موارد زیر را اجرا کنید.

export ASSURED_WORKLOAD_ID=$(gcloud assured workloads create \
    --project="${QUOTA_PROJECT_ID}" \
    --display-name="DoD IL5 Gemini Vision Demo" \
    --compliance-regime="IL5" \
    --billing-account="billingAccounts/${BILLING_ACCOUNT}" \
    --location="${REGION}" \
    --organization="${GCP_ORGANIZATION}" \
    --provisioned-resources-parent="folders/${FOLDER_ID}" \
    --resource-settings="consumer-project-id=${PROJECT_ID},consumer-project-name=DoD IL5 Workloads,encryption-keys-project-id=${KMS_PROJECT_ID},encryption-keys-project-name=DoD IL5 KMS" \
    --labels="codelab=gemini-vision-demo" \
    --format="value(name)")

echo "Assured Workload created: ${ASSURED_WORKLOAD_ID}"

export WORKLOAD_FOLDER_ID=$(gcloud assured workloads describe ${ASSURED_WORKLOAD_ID} \
    --location="${REGION}" \
    --project="${QUOTA_PROJECT_ID}" \
    --format="json" | grep -B 1 "CONSUMER_FOLDER" | grep -oE "[0-9]{10,}")

echo "Assured Workload folder created: ${WORKLOAD_FOLDER_ID}"

gcloud projects create "${PROJECT_ID}" \
    --folder="${WORKLOAD_FOLDER_ID}" \
    --name="DoD IL5 Workloads"

gcloud billing projects link "${PROJECT_ID}" \
    --billing-account="${BILLING_ACCOUNT}"

export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")

فعال کردن API های مورد نیاز Google Cloud

قبل از ساخت، API های مورد نیاز را برای سرویس‌های مورد نیاز فعال کنید.

دستور زیر تمام سرویس‌های لازم برای این Codelab را در پروژه اصلی شما فعال می‌کند.

gcloud services enable \
    aiplatform.googleapis.com \
    artifactregistry.googleapis.com \
    cloudkms.googleapis.com \
    compute.googleapis.com \
    container.googleapis.com \
    iam.googleapis.com \
    logging.googleapis.com \
    monitoring.googleapis.com \
    --project="${PROJECT_ID}"

۴. راه‌اندازی زیرساخت GKE

زیرساخت اصلی که از کلاستر GKE شما پشتیبانی می‌کند را بسازید. این شامل راه‌اندازی یک شبکه اختصاصی برای کلاستر شما و پیکربندی کلیدهای رمزگذاری خودتان برای محافظت از داده‌های روی گره‌هایتان است.

پیکربندی شبکه VPC

یک ابر خصوصی مجازی (VPC) و زیرشبکه سفارشی ایجاد کنید. این رویکرد به شما کنترل کامل بر محدوده آدرس IP می‌دهد و تضمین می‌کند که خوشه شما طبق برنامه ایزوله شده است.

دستورات زیر را برای ایجاد شبکه VPC و یک زیرشبکه در منطقه مشخص شده خود اجرا کنید.

export GKE_NETWORK_NAME="il5-gke-network"
export GKE_SUBNETWORK_NAME="il5-gke-subnet"

gcloud compute networks create "${GKE_NETWORK_NAME}" \
    --description="VPC network for GKE cluster in DoD IL5 Assured Workload" \
    --subnet-mode="custom" \
    --project="${PROJECT_ID}"

gcloud compute networks subnets create "${GKE_SUBNETWORK_NAME}" \
    --network="${GKE_NETWORK_NAME}" \
    --range="10.10.0.0/20" \
    --region="${REGION}" \
    --description="Subnet for GKE cluster nodes in DoD IL5 Assured Workload" \
    --project="${PROJECT_ID}"

پیکربندی رمزگذاری با Cloud KMS

برای برآورده کردن الزامات سختگیرانه مربوط به داده‌های در حال استراحت، از کلیدهای رمزگذاری مدیریت‌شده توسط مشتری (CMEK) استفاده کنید. این به شما امکان کنترل مستقیم بر کلیدهای مورد استفاده برای رمزگذاری دیسک‌های بوت گره‌های GKE شما را می‌دهد.

export KMS_KEYRING_NAME="il5_gke_key_ring"
export KMS_KEY_NAME="il5_gke_key"

gcloud kms keyrings create "${KMS_KEYRING_NAME}" \
    --location="$REGION" \
    --project="${KMS_PROJECT_ID}"

gcloud kms keys create "${KMS_KEY_NAME}" \
    --keyring="${KMS_KEYRING_NAME}" \
    --location="${REGION}" \
    --purpose="encryption" \
    --project="${KMS_PROJECT_ID}"

از آنجا که کلید رمزگذاری در یک پروژه KMS جداگانه از سرویسی که باید از آن استفاده کند وجود دارد، عامل سرویس Google Compute Engine در پروژه بار کاری نیاز به دسترسی به کلید دارد.

شما باید صریحاً به عامل سرویس GCE از پروژه بار کاری، مجوز استفاده از این کلید را اعطا کنید. دستور زیر یک اتصال سیاست IAM به کلید اضافه می‌کند و نقش لازم را به عامل سرویس می‌دهد.

gcloud kms keys add-iam-policy-binding "${KMS_KEY_NAME}" \
    --location="${REGION}" \
    --keyring="${KMS_KEYRING_NAME}" \
    --member="serviceAccount:service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com" \
    --role="roles/cloudkms.cryptoKeyEncrypterDecrypter" \
    --project="${KMS_PROJECT_ID}"

پیکربندی حساب سرویس گره GKE

export GKE_NODE_SA=gke-node-sa

gcloud iam service-accounts create "${GKE_NODE_SA}" \
    --display-name="GKE Node Service Account" \
    --project="${PROJECT_ID}"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter"

۵. ایجاد و پیکربندی کلاستر GKE

اکنون می‌توانید خوشه GKE را ایجاد کنید. دستور زیر یک خوشه GKE با چندین ویژگی امنیتی فعال فراهم می‌کند.

این کار چند دقیقه طول می‌کشد تا تکمیل شود، زیرا گوگل کلود گره‌ها و صفحه کنترل را آماده می‌کند.

export GKE_CLUSTER=ppe-app

gcloud beta container clusters create "${GKE_CLUSTER}" \
    --project="$PROJECT_ID" \
    --region="$REGION" \
    --service-account="${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
    --release-channel="regular" \
    --machine-type="n2d-standard-4" \
    --image-type="COS_CONTAINERD" \
    --disk-type="pd-ssd" \
    --disk-size="50" \
    --boot-disk-kms-key="projects/${KMS_PROJECT_ID}/locations/${REGION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}" \
    --metadata disable-legacy-endpoints=true \
    --num-nodes="1" \
    --network="projects/${PROJECT_ID}/global/networks/${GKE_NETWORK_NAME}" \
    --subnetwork="projects/${PROJECT_ID}/regions/${REGION}/subnetworks/${GKE_SUBNETWORK_NAME}" \
    --security-posture="standard" \
    --workload-vulnerability-scanning="disabled" \
    --workload-pool="${PROJECT_ID}.svc.id.goog" \
    --workload-metadata=GKE_METADATA \
    --addons="HorizontalPodAutoscaling,HttpLoadBalancing,NodeLocalDNS,GcePersistentDiskCsiDriver" \
    --max-surge-upgrade=1 \
    --max-unavailable-upgrade=0 \
    --binauthz-evaluation-mode="DISABLED" \
    --no-enable-basic-auth \
    --enable-autoupgrade \
    --enable-autorepair \
    --enable-confidential-nodes \
    --confidential-node-type=sev \
    --enable-ip-access \
    --enable-ip-alias \
    --enable-managed-prometheus \
    --enable-dns-access \
    --enable-shielded-nodes \
    --shielded-integrity-monitoring \
    --shielded-secure-boot

اتصال به خوشه جدید

برای تعامل با کلاستر جدید خود، ابزار خط فرمان محلی kubectl خود را پیکربندی کنید.

این دستور اعتبارنامه‌ها و نقطه پایانی کلاستر را دریافت می‌کند و به طور خودکار فایل kubeconfig محلی شما را پیکربندی می‌کند. پس از اجرای این دستور، هر دستور kubectl که اجرا کنید به کلاستر GKE جدید شما هدایت می‌شود.

gcloud container clusters get-credentials "${GKE_CLUSTER}" \
    --region="${REGION}" \
    --project="${PROJECT_ID}" \
    --dns-endpoint

۶. پیکربندی هویت برنامه

برای اتصال یک حساب سرویس Kubernetes به یک حساب سرویس Google Cloud IAM، Workload Identity را پیکربندی کنید.

ایجاد حساب‌های خدماتی

یک حساب کاربری سرویس Kubernetes (KSA) اختصاصی درون کلاستر خود ایجاد کنید.

export GKE_NAMESPACE=default
export GKE_SA=ppe-sa

kubectl create sa "${GKE_SA}" --namespace="${GKE_NAMESPACE}"

در مرحله بعد، برنامه شما به یک هویت در Google Cloud نیاز دارد. یک حساب سرویس Google Cloud IAM برای برنامه ایجاد کنید. پس از ایجاد حساب سرویس، نقش‌های لازم را به آن اعطا کنید.

# Create GCP service account
gcloud iam service-accounts create "${GKE_SA}" \
    --project="${PROJECT_ID}"
# Grant necessary roles
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/aiplatform.user"

اجازه دادن به حساب کاربری سرویس Kubernetes برای جعل هویت حساب کاربری IAM

با ایجاد هر دو حساب سرویس، مرحله نهایی ایجاد پیوند بین آنها است. این یک فرآیند دو بخشی است. ابتدا، یک سیاست IAM به حساب سرویس Google Cloud خود اضافه کنید.

# Allow the Kubernetes service account to act as GCP service account by using Workload Identity
gcloud iam service-accounts add-iam-policy-binding "${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
    --project="${PROJECT_ID}" \
    --role="roles/iam.workloadIdentityUser" \
    --member="serviceAccount:${PROJECT_ID}.svc.id.goog[${GKE_NAMESPACE}/${GKE_SA}]"

دوم، حساب سرویس Kubernetes خود را حاشیه‌نویسی کنید.

kubectl annotate --namespace="${GKE_NAMESPACE}" serviceaccount "$GKE_SA" \
    iam.gke.io/gcp-service-account="${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com"

با تکمیل این مرحله، هر پادی که در کلاستر شما با حساب سرویس Kubernetes در حال اجرا باشد، اکنون می‌تواند به Vertex API دسترسی داشته باشد.

توجه: برای ساده‌سازی این پیکربندی، می‌توان جعل هویت حساب کاربری سرویس را حذف کرد. برای جزئیات و محدودیت‌ها به اینجا مراجعه کنید.

۷. ساخت و استقرار برنامه

وقت آن رسیده که برنامه خود را بسته‌بندی، ذخیره و در کلاستر GKE خود مستقر کنید.

ایجاد مخزن رجیستری مصنوعات

قبل از اینکه بتوانید برنامه را اجرا کنید، آن را به عنوان یک کانتینر Docker بسته‌بندی کرده و در مخزن Artifact Registry ذخیره کنید. برای ایجاد این مخزن از دستور زیر استفاده کنید.

export REPOSITORY_ID=ppe-repo

gcloud artifacts repositories create "${REPOSITORY_ID}" \
  --repository-format=docker \
  --location="${REGION}" \
  --project="${PROJECT_ID}" \
  --description="Regional Docker repo for PPE App"

شما باید صریحاً به حساب سرویس مورد استفاده توسط گره‌های GKE اجازه دهید که از مخزن جدید شما بخواند.

gcloud artifacts repositories add-iam-policy-binding "${REPOSITORY_ID}" \
    --location="${REGION}" \
    --role="roles/artifactregistry.reader" \
    --project="${PROJECT_ID}" \
    --member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com"

ساخت و وارد کردن ایمیج داکر

ایمیج داکر را بسازید و به مخزن اضافه کنید. ابتدا کد منبع را کپی کنید و ایمیج کانتینر را بسازید. سپس، مسیر کامل رجیستری Artifact را به آن برچسب بزنید و آن را به مخزنی که قبلاً ایجاد کرده‌اید، اضافه کنید.

git clone https://github.com/GoogleCloudPlatform/next-26-sessions.git

cd BRK3-034-workplace-safety

cd ppe

export IMAGE_TAG="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_ID}/ppe-app:v15"
docker build -t "${IMAGE_TAG}" .
docker push "${IMAGE_TAG}"

استقرار در GKE

با در دسترس بودن تصویر کانتینر در رجیستری Artifact، مرحله نهایی، دستور دادن به GKE برای دریافت و اجرای آن است. این کار با تعریف منابع برنامه شما در یک فایل مانیفست Kubernetes و اعمال آن به کلاستر انجام می‌شود. این دستور، اشیاء Deployment و Service تعریف شده در فایل را ایجاد می‌کند.

export GKE_DEPLOY=ppe-detector

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${GKE_DEPLOY}
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ${GKE_DEPLOY}
  template:
    metadata:
      labels:
        app: ${GKE_DEPLOY}
    spec:
      serviceAccountName: ${GKE_SA}
      containers:
      - name: ${GKE_DEPLOY}
        image: ${IMAGE_TAG}
        env:
        - name: PROJECT_ID
          value: ${PROJECT_ID}
        - name: LOCATION
          value: ${REGION}
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
          limits:
            cpu: "500m"
            memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
  name: ${GKE_DEPLOY}
spec:
  type: LoadBalancer
  selector:
    app: ${GKE_DEPLOY}
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
EOF

۸. تست برنامه

مرحله آخر، دسترسی و آزمایش برنامه آزمایشی است. این شامل بازیابی آدرس IP خارجی اختصاص داده شده به سرویس و تعامل با آن از طریق یک رابط کاربری ساده است.

بازیابی IP خارجی سرویس

دریافت IP خارجی سرویس در معرض خطر (زمان آماده‌سازی حدود ۳۰ ثانیه طول می‌کشد)

export IP_ADDRESS=$(kubectl get service "${GKE_DEPLOY}" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $IP_ADDRESS

اجرای فرانت‌اند به صورت محلی

برای این نمایش، رابط کاربری یک صفحه ساده HTML/JavaScript است که بخشی از پیاده‌سازی GKE نیست. این صفحه برای اجرا روی دستگاه محلی شما طراحی شده است.

رابط کاربری (front-end) باید از طریق GCP در یک برنامه کاربردی عملیاتی ارائه شود. روی دستگاه محلی:

# Update the index.html file with the server IP address
cd frontend

# For Linux
sed -i "s#\(const BACKEND_URL = \"http://\)[^/]\+\(\/analyze\";\)#\1${IP_ADDRESS}\2#g" "index.html"

# For MacOS
#sed -i '' "s#\(const BACKEND_URL = #\"http://\)[^/]*\(\/analyze\";\)#\1${IP_ADDRESS}\2#g" "index.html"

python3 -m http.server 8001

آدرس http://localhost:8001/index.html را در کروم باز کنید.

۹. تمیز کردن

برای جلوگیری از هزینه‌های جاری، منابع ایجاد شده در این codelab را حذف کنید.

از بین بردن خوشه GKE

برای حذف کل برنامه، فقط باید خوشه GKE را حذف کنید. برای انجام این کار، دستور زیر را اجرا کنید:

gcloud container clusters delete "${GKE_CLUSTER}" \
    --region="$REGION" \
    --project="${PROJECT_ID}"

حذف بارهای کاری تضمین‌شده

دستورات زیر را برای حذف تمام منابع مرتبط با Assured Workload اجرا کنید.

# Workload project deletion
gcloud billing projects unlink "${PROJECT_ID}"
gcloud projects delete "${PROJECT_ID}"

# KMS project deletion
gcloud billing projects unlink "${KMS_PROJECT_ID}"
gcloud projects delete "${KMS_PROJECT_ID}"

# Assured Workload folder deletion
gcloud resource-manager folders delete ${WORKLOAD_FOLDER_ID} --quiet

# Assured Workload deletion
gcloud assured workloads delete "${ASSURED_WORKLOAD_ID}" \
    --location="${REGION}" \
    --organization="${GCP_ORGANIZATION}" \
    --project="${QUOTA_PROJECT_ID}"

۱۰. تبریک

ماموریت تکمیل شد! شما با موفقیت یک سیستم تشخیص ایمنی محل کار برای صنایع تحت نظارت ساختید که از Gemini برای تشخیص کلاه‌های ایمنی استفاده می‌کند.

کاری که شما انجام دادید:

  • حفاظت از داده‌ها و حریم خصوصی: شما یک گره GKE محرمانه را با CMEK تأمین کردید
  • مرزهای داده: شما کنترل‌های انطباق پلتفرم را برای یک محیط تنظیم‌شده فعال کرده‌اید.

اسناد مرجع