نحوه اداره اسرار Kubernetes با ArgoCD و Sops

در این مقاله ، ما به دنبال روش های رایج برای محرمانه نگه داشتن اسرار در برنامه Kubernetes و نحوه مدیریت آنها در یک گردش کاری GitOps مبتنی بر ArgoCD با کمک Sops خواهیم بود.

مشکل به شرح زیر است: برنامه شما به برخی از اسرار بستگی دارد که شما باید آنها را ایمن ذخیره کرده و در دسترس برنامه در حال اجرا قرار دهید.

می توانید به این r آدرس دهید معادله به دو روش:

  • این اسرار را در مدیر مخفی از راه دور قرار می دهید ، به عنوان مثال ، Vault یا AWS Secret Manager و از API ارائه شده یا ابزارهای مناسب مانند اسرار خارجی استفاده می کنید
  • شما این اسرار را به عنوان اشیا Secret مخفی وانیلی Kubernetes نگه دارید ، آنها را با کد خود در مخزن Git خود مرتکب می شوید اما به عنوان مثال sops از رمزگذاری آنها مراقبت می کنید

این دوم راه حل یک مزیت آشکار دارد: شما می توانید کلید GPG خود را تهیه کنید و نیازی به اعتماد به ارائه دهنده ابری یا ابزار خارجی ندارید. اگر هدف شما یک استراتژی چند ابر است ، راهی برای پیشبرد آن است.

اگر از ArgoCD برای استقرار اشیا K Kubernetes ما استفاده می کنید ، ممکن است تعجب کنید چگونه ادغام Sops با ArgoCD بیایید ببینیم مستندات ArgoCD چه چیزی برای گفتن دارد.

اسناد ArgoCD کاملاً روشن می کند:

CD آرگو درباره نحوه اسرار نظر ندارد. مدیریت می شوند روش های مختلفی برای انجام این کار وجود دارد و هیچ راه حلی برای همه وجود ندارد.

اساساً ، شما فقط به دستگاه های خود سپرده شده اید تا sops با ArgoCD کار کنند. در این مقاله ، نگاهی خواهیم انداخت که چگونه می توانیم کار مخفیانه را به شکلی زیبا و بدون شکست انجام دهیم.

ابزارهای انتخابی ما

بیایید خلاصه کنیم ابزاری که استفاده خواهیم کرد:

  • اسرار با استفاده از sops رمزگذاری و رمزگشایی می شوند و ما کلید GPG خود را به عنوان کلید رمزگذاری ارائه می دهیم
  • برنامه ما با استفاده از Helm بسته بندی می شود < / li>
  • به جای اینکه مستقیماً با sops برخورد کنیم ، از اسرار Helm استفاده خواهیم کرد

اسرار هلم در واقع یک بسته بندی برای هلم است که اسرار را رمزگذاری و رمزگشایی می کند برای شما. گرچه دیگر تحت توسعه سنگین نیست ، اما هنوز هم خیلی خوب کار می کند.

اما مسئله این است که ArgoCD این افزونه را نمی داند زیرا فقط با باینری پایه Helm داخلی تعبیه شده است. بیایید اکنون به این مسئله بپردازیم.

ما یک تصویر docker جدید ArgoCD ایجاد خواهیم کرد که دقیقاً شامل همان چیزی است که ما به آن نیاز داریم:

  • GPG که کلید رمزگذاری را کنترل می کند
  • فروشگاه های رمزنگاری / رمزگشایی
  • افزونه Helm Secrets

پرونده Dockerfile به این شکل خواهد بود:

FROM argoproj / argocd: v1. 7.6 ARG SOPS_VERSION = “v3.6.1”
ARG HELM_SECRETS_VERSION = “2.0.2”
ARG SOPS_PGP_FP = “141B69EE206943BA9A64E691A00C9B1A7DCB6D07” ENV SOPS_PGP_FP = $ {SOPS_PGP_FP} ریشه USER
کپی helm-wrapper.sh / usr / محلی / bin /
RUN به روز رسانی apt-get && \ apt-get install -y \ حلقه \ gpg && \ apt-get clean && \ rm -rf / var / lib / apt / list / * / tmp / * / var / tmp / * && \ curl -o / usr / local / bin / sops -L https://github.com/mozilla/sops/releases/download/${SOPS_VERSION}/sops- $ {SOPS_VERSION} .linux && \ chmod + x / usr / محلی / bin / sops && \ cd / usr / محلی / bin && \ mv helm helm.bin && \ mv helm2 helm2.bin && \ helm-wrapper.sh helm && \ lm helm2 && \ chmod + x سکان دار helm2

پلاگین # helm secrets باید به عنوان argocd کاربر نصب شود در غیر اینصورت پیدا نمی شود
USER argocd
RUN /usr/ local/bin/helm.bin نصب افزونه https://github.com/zendesk/helm-secrets – نسخه $ {HELM_SECRETS_VERSION}
ENV HELM_PLUGINS = “/home/argocd/.local/share/helm/plugins/”

A موارد قابل توجهی:

  • ابتدا GPG و Sops را تنظیم می کنیم
  • سپس پلاگین Helm Secrets را نصب می کنیم
  • در آخر ، ArgoCD را منتقل می کنیم پیش فرض Helm binary به عنوان helm.bin و جایگزین آن با یک اسکریپت wrapper

این اسکریپت بسته بندی از کلید GPG مراقبت خواهد کرد (می توانید آن را به عنوان حجم مخفی نصب کنید) ) و اگر پیدا شود آن را وارد می کند. سپس تماس با اسرار هدایت را جایگزین هر تماس با سکان هدایت می کند. خوب ، این از نظر تئوری است زیرا اسرار Helm از تمام دستورات Helm پشتیبانی نمی کند و کاملاً گویا است بنابراین ما باید برای برخی از دستورات خروجی را تغییر دهیم.

#! / bin / sh

GPG_KEY = ‘/home/argocd/gpg/gpg.asc’ اگر [-f $ {GPG_KEY} ]
سپس gpg –quiet –import $ {GPG_KEY}
fi # اسرار هدایت فقط از چند دستور سکان پشتیبانی می کند
اگر [ $ 1 = “الگو” ] || [ $ 1 = “نصب” ] || [ $ 1 = “ارتقا” ] || [ $ 1 = “پرز” ] || [ $ 1 = “تفاوت” ]
سپس # اسرار Helm به هر دستور از جمله الگو ، خروجی های بی فایده اضافه می کند ، یعنی # ‘remove: .dec’ برای هر اسرار رمزگشایی شده. # همانطور که argocd از خروجی الگوی helm برای محاسبه منابع مورد استفاده استفاده می کند ، این خروجی ها # باعث ایجاد خطای تجزیه از argocd می شود ، بنابراین باید آنها را حذف کنیم. # ما نمی توانیم از exec در اینجا استفاده کنیم زیرا باید لوله خروجی را تأیید کنیم بنابراین در یک فرایند فرعی را صدا می کنیم و # خودمان کد بازگشت را کنترل کنیم. out = $ (اسرار helm.bin $ @ ) کد = $؟ if [ $ code -eq 0]؛ سپس # printf instock of echo در اینجا زیرا ما واقعاً نمی خواهیم هیچ کاراکتر پشت پرده ای پردازش کنیم printf ‘٪ s \ n’ $ out | sed -E “/ ^ حذف شد”. + \. dec “$ / d” خروج 0 دیگری خروج $ code fi
دیگری # helm.bin دودویی اصلی سکان دار است exec helm.bin $ @
fi

تصویر ArgoCD ما اکنون اسرار Helm را بدون هیچگونه پیکربندی اضافی می فهمد! جالب است.

برنامه آزمایش ما یک نمودار Helm با اسرار رمزگذاری شده است. لطفاً به فایل

secrets.yaml توجه کنید که قرار است حاوی داده های حساس باشد.

testapp
├── نمودار. yaml
├── نمودارها
├── رازها. yaml
الگوها
ES ├── NOTES.txt
hel ├── _helpers.tpl
│ ├── استقرار. yaml
├── hpa.yaml
ress ingress.yaml
│ ├── service.yaml
ac └── serviceaccount.yaml
└── Value.yaml

ما اسرار را با استفاده از کلید خصوصی خود با همان sops رمزگذاری می کنیم ، همان کسی که توسط اسکریپت Helm wrapper ما مراقبت می شود:

sops -i –encrypt testapp / secrets.yaml

سپس این نمودار Helm را در مخزن Git خود فشار می دهیم. تنها کاری که باید انجام شود ایجاد برنامه CRD مربوطه برای تماشای این مخزن جدید است:

apiVersion: argoproj.io/v1alpha1
نوع: برنامه
فراداده:
نام: testapp
namespace: argocd
مشخصات:
پروژه : پیش فرض
منبع:
repoURL: [email protected]: my / repo / charts.git
targetRevision: استاد
مسیر: نمودارها / testapp
سکان:
releaseName: testapp
valueFiles:
“secrets.yaml”
مقصد:
سرور: https: //kubernetes.default.svc
namespace: testapp
syncPolicy:
خودکار: {}
syncOptions:
CreateNamespace=true

پس از kubectl اعمال – برای این ، شما باید ببینید که برنامه جدید شما در داشبورد ArgoCD. اسرار با استفاده از کلید GPG ارائه شده در زیر کاپوت رمزگشایی شده و برنامه به درستی کار می کند.

از نظر ArgoCD ، بسته بندی Helm به عنوان دودویی Helm داخلی تعبیه می شود ، بنابراین هر گونه ویژگی های GUI مربوط به Helm هنوز طبق معمول کار می کنند.

برای اینکه جامع باشد ، بیایید یک راه حل ساده تر برای مشکل خود ذکر کنیم. ما می توانستیم از یک پلاگین ArgoCD استفاده کنیم. مسئولیت پلاگین این است که مقداری YAML ارسال کنید که ArgoCD سپس به API Kubernetes ارسال می کند.

برای ساخت این کار ، هنوز به یک Dockerfile ArgoCD سفارشی نیاز دارید اما جایگزین Helm نخواهید شد باینری ، فقط sops و اسرار Helm را اضافه می کند. سپس پلاگین را اعلام می کنید. مثال زیر عصاره ای از پرونده

values.yaml با استفاده از نمودار ArgoCD Helm است:

سرور: < / span>
پیکربندی:
configManagementPlugins: |
– نام: helmSecrets
شروع:
دستور: [“gpg”]
args: [“–import” ، “/home/argocd/gpg/gpg.asc” < span>]
# به عنوان یک راز کوبه نصب می شود
تولید کنید:
دستور : [“/ bin / sh” ، “-c” ]
args: [“helm اسرار الگو $ HELM_OPTS $ RELEASE_NAME . “]

این همان فلسفه است: ما هنگام راه اندازی اولیه افزونه کلید GPG را وارد می کنیم و سپس برای تولید اشیا expected مورد انتظار YAML با الگوی اسرار helm با پارامترهای موجود در محیط تماس بگیرید.

برای استفاده از پلاگین در یک برنامه ، این کار را اینگونه انجام دهید:

piVersion: argoproj.io/v1alpha1
نوع: برنامه
فراداده:
نام: testapp
namespace: argocd
مشخصات:
پروژه : پیش فرض
منبع:
repoURL: [email protected]: my / repo / charts.git
targetRevision: استاد
مسیر: نمودارها / testapp
پلاگین:
نام: helmSecrets
env:
– نام: HELM_OPTS
مقدار: “secrets.yaml”
– نام: RELEASE_NAME
مقدار: “testapp”
مقصد:
سرور: https: //kubernetes.default.svc
namespace: testapp
syncPolicy:
خودکار: {}
syncOptions:
CreateNamespace=true

شما باید همان نتیجه ای را که با راه حل قبلی ما دارید بدست آورید اما با یک استثنا قابل توجه: ArgoCD نمی تواند تشخیص دهد پلاگین شما در واقع Helm مبدل است بنابراین هر گونه ویژگی GUI مربوط به Helm مانند دیدن مقادیر و پارامترها در دسترس نخواهد بود. پیچیده تر ، کاملاً برتر است. حتی اگر ArgoCD به خودی خود اسرار را کنترل نکند ، واقعاً خوب فکر شده است زیرا شما می توانید ابزارهای شخصی خود را به راحتی ادغام کنید. faun / handling-kubernetes-secrets-with-argocd-and-sops-650df91de173