در بخش ششم از سلسه مطلب «آموزش نصب و پیکربندی Cilium در Kubernetes» ، قصد داریم تا در مورد L7 Policy صحبت کنیم.
آزمایش و انجام HTTP-aware L7 Policy
در سناریوی ساده بالا، کافی بود که به tiefighter / xwing دسترسی کامل به API deathstar داده شود یا اصلاً دسترسی نداشته باشد. اما برای ارائه بالاترین امنیت (به عنوان مثال، enforce least-privilege isolation) بین میکروسرویسها، هر سرویسی که API deathstar را فراخوانی میکند باید محدود به ایجاد مجموعهای از درخواستهای HTTP باشد که برای عملکرد درست لازم است. به عنوان مثال، در نظر بگیرید که سرویس deathstar برخی از maintenance API ها را expose می کند که نباید توسط فضاپیماهای امپراتوری به صورت تصادفی فراخوانی شوند. برای دیدن آن می توانید دستور زیر را اجرا کنید:
kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port
یک نمونه خروجی از اجرای دستور گفته شده را در تصویر پایین مشاهده می کنید:
در حالی که این یک مثال گویا است، دسترسی غیرمجاز مانند بالا میتواند پیامدهای امنیتی نامطلوبی داشته باشد.
L7 Policy با Cilium و Kubernetes
Cilium میتواند policy های لایه HTTP (یعنی L7) را برای محدود کردن URLهایی که tiefighter مجاز است به آن دسترسی پیدا کند، اعمال کند. در اینجا یک فایل policy به عنوان نمونه است که policy اصلی ما را با محدود کردن tiefighter به برقراری POST API call به /v1/request-landing و اجازه ندان به سایر call ها (از جمله PUT /v1/exhaust-port) گسترش می دهد.
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "rule1" spec: description: "L7 policy to restrict access to specific HTTP call" endpointSelector: matchLabels: org: empire class: deathstar ingress: - fromEndpoints: - matchLabels: org: empire toPorts: - ports: - port: "80" protocol: TCP rules: http: - method: "POST" path: "/v1/request-landing"
بروزرسانی rule موجود جهت اعمال L7-aware policy برای محافظت از deathstar با استفاده از دستور زیر:
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.12/examples/minikube/sw_l3_l4_l7_policy.yaml
اکنون میتوانیم همان آزمایش بالا را دوباره اجرا کنیم، اما نتیجه متفاوتی خواهیم دید:
kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port
همانطور که می بینید، با Cilium L7 security policies، ما می توانیم به tiefighter اجازه دهیم فقط به منابع API مورد نیاز در deathstar دسترسی داشته باشد و بدین ترتیب یک رویکرد امنیتی «least privilege» را برای ارتباط بین میکروسرویس ها پیاده سازی کنیم. توجه داشته باشید که مسیر دقیقاً با URL مطابقت دارد، برای مثال اگر میخواهید هر چیزی در /v1/ را allow کنید، باید از یک regular expression استفاده کنید:
path: "/v1/.*"
می توانید L7 policy را با استفاده از kubectl مشاهده کنید:
kubectl describe ciliumnetworkpolicies
و از طریق cilium CLI :
kubectl -n kube-system exec cilium-rwmwr -- cilium policy get
همچنین می توان درخواست های HTTP را به صورت live با استفاده از «cilium monitor» نظارت کرد:
kubectl exec -it -n kube-system cilium-rwmwr -- cilium monitor -v --type l7
خروجی بالا یک پاسخ موفقیت آمیز به یک درخواست POST و به دنبال آن یک درخواست PUT را نشان می دهد که توسط L7 policy رد شده است.
تمیزکاری:
برای پاک کردن کارهایی که در این آزمایش ها انجام دادیم کافیست تا دستورهای زیر را اجرا کنید:
kubectl delete -f https://raw.githubusercontent.com/cilium/cilium/1.11.5/examples/minikube/http-sw-app.yaml kubectl delete cnp rule1
ادامه دهید …
در این سلسه مطالب، نصب Cilium بر روی Kubernetes آموزش داده شد و به برخی از قابلیت های آن اشاره شد. برای اطلاعات بیشتر و یادگیری در مورد Cilium کافیست تا به وب سایت، مستندات و Github آن مراجعه کنید:
https://cilium.io
https://docs.cilium.io/en/stable
https://github.com/cilium/cilium
همچنین جهت آزمایش سناریوهای مختلف با استفاده از Cilium می توانید از Lab های آن به آدرس زیر استفاده کنید:
https://isovalent.com/resource-library/labs/
امید است تا این سلسه مطالب برای شما مفید بوده باشد.
Bitte schauen