برنامه نویسی

پل زدن شکاف: استفاده از درایورهای CSI Store Secret برای دسترسی به اسرار از Google Secret Manager در GKE Cluster

امروزه حفظ و ذخیره امن اسرار مانند کلیدهای API، گذرواژه‌ها و گواهی‌ها، بخش مهمی از ایجاد و استقرار برنامه‌ها است.

Google Secret Manager یک راه حل قدرتمند و متمرکز برای مدیریت مخفی و همچنین یک صندوق امن برای ذخیره و دسترسی به اطلاعات حساس ارائه می دهد.

با این حال، دریافت این اسرار و ادغام یکپارچه آنها در برنامه ها ممکن است دشوار باشد. این پست به جزئیات این فرآیند می پردازد و نشان می دهد که چقدر ساده است که اسرار را از Google Secret Manager در یک خوشه GKE مصرف کنید.

قبل از شروع چند پیش نیاز وجود دارد:

  • مطمئن شوید که خوشه GKE که ایجاد می کنید باید WORKLOAD_IDENTITY فعال باشد.
  • مطمئن شوید که یک IAM SERVICE_ACCOUNT ایجاد شده با مجوزهای مناسب دارید.
  • یکی از مواردی که ما بیشتر به آن علاقه مندیم «دسترسی مخفی مدیر مخفی (roles/secretmanager.secretAccessor) است. برای جزئیات بیشتر به این مطلب مراجعه کنید.
  • خط فرمان gcloud راهی عالی برای ایجاد و از بین بردن سریع منابع در GCP می دهد.
  • در دستور زیر جایگزین کنید CLUSTER_NAME با نام خوشه GKE، PROJECT_ID با نام پروژه ای که می خواهید خوشه GKE را ایجاد کنید، SERVICE_ACCOUNT با نام حساب سرویس که حاوی مجوزهای لازم برای تعامل با منابع GCP است (به عنوان مثال در این مورد Google Secret Manager خواهد بود) MACHINE_TYPE با اندازه دستگاه برای استقرار بارهای کاری شما، زیرا ما چند منبع را نصب می کنیم، مطمئن شوید که یک ماشین متوسط ​​را انتخاب می کنید، ZONE با نام منطقه، NUMBER_OF_NODES با یک عدد صحیح که حداقل تعداد گره ها را در هر منطقه بیان می کند، CLUSTER_VERSION با نسخه ای از کلاستر GKE که می خواهید نصب کنید.

خوشه‌های کانتینر gcloud CLUSTER_NAME –workload-pool=PROJECT_ID.svc.id.goog –service-account=SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com –zone ZONE –نوع ماشین MACHINE_TYPE –num-OF_NODES –cluster-version=CLUSTER_VERSION

gcloud container clusters create test-k8s \
    --workload-pool=proj-101.svc.id.goog \
    --service-account=test-k8s@proj-101.iam.gserviceaccount.com \
    --zone us-central1-a \
    --machine-type e2-standard-4 \
    --num-nodes=1 \
    --cluster-version=1.23.17-gke.5600
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • درایورهای CSI Secret Store را نصب کنید، ساده ترین راه نصب آنها از طریق آن است helm.
  • علاوه بر این، اگر می‌خواهید منبع مخفی k8s ایجاد کنید، حتماً پرچم syncSecret را فعال کنید.
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts

helm upgrade --install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver --namespace kube-system 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • افزونه ارائه دهنده GCP را نصب کنید.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp/main/deploy/provider-gcp-plugin.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • مطمئن شوید که حساب سرویس شما به حساب IAM GCP متصل است
  • از دستور زیر برای افزودن/بررسی اتصال خط مشی IAM استفاده کنید.
  • اطمینان حاصل کنید که از قرارداد نامگذاری مناسب برای حساب سرویس پیروی می کنید [NAMESPACE/SERVICE_ACCOUNT_NAME] به عنوان مثال در اینجا ما داریم [default/app-sa].
gcloud iam service-accounts add-iam-policy-binding \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:$proj-101.svc.id.goog[default/app-sa]" \
    test-k8s@proj-101.iam.gserviceaccount.com
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از انجام همه این کارها، آماده استفاده از اسرار Google Secret Manager و استفاده از آنها در استقرار خود هستید.

  • از همان حساب سرویس GCP IAM در حاشیه نویسی حساب سرویس k8s استفاده کنید.
---
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    iam.gke.io/gcp-service-account: test-k8s@proj-101.iam.gserviceaccount.com
  name: app-sa
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • k8s را ایجاد کنید SecretProviderClass منبع و مسیر مخفی خود را به کلید resourceName اضافه کنید (این کلیدی است که از Google Secret Manager خواهد آمد).
  • در این مثال، من قبلاً یک مخفی به نام testpassword در GSM ایجاد کردم.
---
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test-secret
spec:
  provider: gcp
  parameters:
    secrets: |
      - resourceName: "projects/proj-101/secrets/testpassword/versions/latest"
        fileName: "testpassword"
  secretObjects:
  - secretName: testpassword
    data:
    - key: testpassword
      objectName: testpassword
    type: Opaque
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • pod/deployment را ایجاد کنید و از اسرار خود در برنامه خود استفاده کنید.
  • در اینجا ما یک آیتم حجمی ایجاد می کنیم که به درایورهای csi secrets-store.csi.k8s.io اشاره می کند و از secretProviderClass که در مرحله بالا ایجاد کردیم استفاده می کند.
  • علاوه بر این، ما در حال نصب این به عنوان یک حجم برای مصرف هستیم.
  • توجه: اگر قصد دارید از Secret به عنوان یک متغیر محیطی استفاده کنید، مطمئن شوید که راز (منبع k8s) وجود دارد.
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  serviceAccountName: app-sa
  containers:
  - image: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
    name: mypod
    resources:
      requests:
        cpu: 100m
    tty: true
    volumeMounts:
      - mountPath: "/var/secrets"
        name: vol-secret
        readOnly: true
  volumes:
  - name: vol-secret
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "test-secret"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

امیدوارم این پست برای شما مفید واقع شده باشد، در صورت تمایل نظرات یا نظرات خود را درج کنید.

یادگیری مبارک!

منابع:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا