پل زدن شکاف: استفاده از درایورهای 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"
امیدوارم این پست برای شما مفید واقع شده باشد، در صورت تمایل نظرات یا نظرات خود را درج کنید.
یادگیری مبارک!
منابع: