
بخش 5. مبانی امنیت در Kubernetes
فصل 1. مدیریت Service Accounts و RBAC (Role-Based Access Control)
- Service Accounts:
- تعریف و استفاده از Service Accounts برای Pods.
- ایجاد و مدیریت Service Accounts جدید.
- پیکربندی Podها برای استفاده از Service Accounts خاص.
- Role-Based Access Control (RBAC):
- تعریف مفاهیم Role و ClusterRole.
- ایجاد و مدیریت RoleBinding و ClusterRoleBinding.
- محدودسازی دسترسی کاربران و منابع Kubernetes.
- بررسی دسترسی کاربران با استفاده از دستورات
kubectl auth can-i
.
فصل 2. استفاده از Security Context برای Pods و کانتینرها
- SecurityContext:
- تعریف و تنظیم Security Context در سطح Pod.
- محدود سازی دسترسیهای سیستم فایل (ReadOnlyRootFilesystem).
- اجرای کانتینرها با کاربرهای غیر ریشه (Non-Root Users).
- تنظیم قابلیتهای Linux (Linux Capabilities) برای محدود سازی دسترسی.
- Pod Security Standards (PSS):
- معرفی استانداردهای امنیتی Pod.
- استفاده از PodSecurityPolicy (Deprecated) و جایگزینهای آن.
فصل 3. پیکربندی و استفاده از Network Policies
- Network Policies:
- تعریف Network Policies برای محدود کردن ترافیک ورودی و خروجی.
- پیکربندی قوانین ترافیک بین Pods.
- استفاده از Labels برای مدیریت ترافیک شبکه.
- نمونهسازی یک Network Policy برای مسدود کردن ترافیک غیرمجاز.
فصل 4. ذخیرهسازی امن اطلاعات حساس با Secrets
- Secrets در Kubernetes:
- تعریف و انواع Secrets: Generic و Docker Registry.
- ذخیرهسازی اطلاعات حساس مانند رمز عبور، توکن و گواهینامهها.
- استفاده از Secrets در Pods و کانتینرها.
- دسترسی به Secrets از طریق Volume و محیط متغیر (Environment Variables).
- امنیت Secrets:
- استفاده از رمزنگاری در سطح ذخیرهسازی (Encryption at Rest).
- محدودسازی دسترسی به Secrets با RBAC.
- چرخش (Rotation) و مدیریت دورهای Secrets.
فصل 5. حفاظت از Cluster و منابع
- Admission Controllers:
- آشنایی با Admission Controllers مانند
PodSecurityAdmission
وImagePolicyWebhook
. - پیکربندی Admission Controllers برای افزایش امنیت.
- آشنایی با Admission Controllers مانند
- Image Security:
- استفاده از تصاویر معتبر و امن.
- امضای تصاویر کانتینرها (Container Image Signing).
- محدودسازی دسترسی به Registryهای خارجی.
- Resource Quotas:
- تعریف Resource Quotas برای جلوگیری از مصرف بیش از حد منابع.
- مدیریت دسترسی تیمها به منابع مشخص.
فصل 6. مدیریت گواهینامهها و TLS
- TLS/SSL در Kubernetes:
- پیکربندی TLS برای ارتباطات بین سرویسها.
- ایجاد و مدیریت گواهینامههای TLS.
- Cert Manager:
- استفاده از Cert Manager برای مدیریت خودکار گواهینامهها.
- صدور و تمدید خودکار گواهینامههای SSL.
فصل 7. شناسایی و رفع آسیبپذیریها
- آسیبپذیریهای رایج در Kubernetes:
- بررسی حملات رایج مانند Privilege Escalation و Data Exfiltration.
- ابزارهای شناسایی آسیبپذیری:
- استفاده از ابزارهای امنیتی مانند
Trivy
وKube-bench
. - اسکن Cluster برای شناسایی تنظیمات ناامن.
- استفاده از ابزارهای امنیتی مانند
- Patch Management:
- بهروزرسانی مداوم Cluster و اجزای آن برای جلوگیری از سوءاستفاده.
بخش 6. نظارت و Debugging در Kubernetes
فصل 1. مشاهده و بررسی لاگها
- دستور
kubectl logs
:- مشاهده لاگهای یک Pod.
- بررسی لاگهای یک کانتینر خاص در Podهای چند کانتینری.
- استفاده از پارامتر
-f
برای مشاهده بلادرنگ لاگها (Follow Mode).
- مدیریت حجم بالای لاگها:
- فیلتر کردن لاگها با ابزارهایی مانند
grep
. - ذخیره لاگها برای تحلیلهای بعدی.
- فیلتر کردن لاگها با ابزارهایی مانند
فصل 2. بررسی وضعیت منابع با دستورات اصلی
- دستور
kubectl describe
:- دریافت اطلاعات جزئی در مورد Podها، Deploymentها، و سایر منابع.
- مشاهده وقایع مرتبط (Events) برای هر منبع.
- دستور
kubectl get
:- مشاهده وضعیت کلی منابع Kubernetes.
- استفاده از فرمتهای خروجی مانند
-o yaml
یا-o json
برای تحلیل دقیقتر.
- دستور
kubectl top
:- مشاهده مصرف CPU و حافظه Podها و Nodeها.
- شناسایی منابعی که بیشترین بار را دارند.
فصل 3. عیبیابی Pods و کانتینرها
- دستور
kubectl exec
:- دسترسی به ترمینال کانتینرها برای اجرای دستورات مستقیم.
- بررسی وضعیت درون کانتینر (مثل فایلها، پیکربندیها، و سرویسها).
- دستور
kubectl port-forward
:- ایجاد تونل برای دسترسی به برنامههای داخل یک Pod.
- Debug کردن سرویسها در محیط توسعه.
- بررسی وضعیت Pod:
- شناسایی دلایل خرابی (CrashLoopBackOff، ImagePullBackOff، و غیره).
- بررسی وضعیت Liveness و Readiness Probes.
فصل 4. مدیریت Events و رویدادها
- دستور
kubectl get events
:- مشاهده رویدادهای اخیر مرتبط با منابع.
- تشخیص مشکلات شبکه، محدودیت منابع، یا خطاهای مرتبط با زمانبندی (Scheduling).
- تحلیل وقایع:
- مرتبسازی وقایع بر اساس زمان یا نوع رویداد.
- استفاده از ابزارهای خارجی برای ثبت و تحلیل وقایع.
فصل 5. رفع مشکلات ارتباطات شبکه
- بررسی Network Policies:
- شناسایی محدودیتهای شبکه با بررسی تنظیمات Network Policy.
- بررسی سرویسها و DNS:
- تست ارتباطات بین Podها و سرویسها.
- استفاده از ابزارهایی مانند
nslookup
یاdig
برای بررسی مشکلات DNS.
- دستور
kubectl proxy
:- راهاندازی پروکسی برای دسترسی به سرویسهای داخلی.
فصل 6. استفاده از ابزارهای داخلی و خارجی
- ابزارهای داخلی Kubernetes:
- استفاده از Dashboard برای نظارت گرافیکی.
- ابزارهای داخلی مانند
kubectl debug
(در نسخههای جدید).
- ابزارهای خارجی برای مانیتورینگ:
- استفاده از Prometheus و Grafana برای نظارت دقیق منابع.
- ELK Stack برای مدیریت و تحلیل لاگها.
- ابزارهای دیگر مانند Fluentd، Datadog، یا New Relic.
فصل 7. بررسی وضعیت سلامت (Health)
- Liveness و Readiness Probes:
- بررسی کانفیگ Probeها برای تشخیص مشکلات.
- بهینهسازی زمانبندی و حساسیت پروبها.
- مدیریت Restart Policy:
- تنظیم و تحلیل Restart Policyها برای Pods.
فصل 8. مدیریت فضای دیسک و ذخیرهسازی
- بررسی مشکلات مربوط به Volumes:
- شناسایی مشکلات Mount یا دسترسی به Persistent Volumeها.
- دستور
kubectl df-pv
:- مشاهده مصرف فضای PVها.
فصل 9. عیبیابی Image و کانتینرها
- مشکلات Image:
- بررسی مشکلات Pull Image (مانند خطاهای ImagePullBackOff).
- استفاده از Registryهای خصوصی با Secretها.
- Debugging کانتینرها:
- استفاده از ابزارهای داخل کانتینر مانند
curl
یاping
برای تست ارتباطات.
- استفاده از ابزارهای داخل کانتینر مانند
بخش 7. ابزارها و دستورات Kubernetes
فصل 1. مدیریت منابع با kubectl
- نحوه نصب و پیکربندی ابزار
kubectl
- ایجاد منابع:
- استفاده از
kubectl create
برای ایجاد منابع (مثل Pods، Services، Deployments) - ساخت منابع از فایلهای YAML
- استفاده از
- اعمال تغییرات:
- استفاده از
kubectl apply
برای بهروزرسانی منابع - مقایسه تغییرات با
kubectl diff
- استفاده از
- حذف منابع:
- استفاده از
kubectl delete
برای حذف منابع با نام یا نوع مشخص - حذف منابع از فایلهای YAML
- استفاده از
فصل 2. مشاهده و مدیریت منابع
- فهرست منابع:
- استفاده از
kubectl get
برای مشاهده منابع مختلف (Pods، Nodes، Deployments و …) - فیلتر کردن خروجیها با
-o
(مانند-o json
یا-o wide
)
- استفاده از
- توضیحات منابع:
- استفاده از
kubectl describe
برای مشاهده جزئیات منابع
- استفاده از
- نظارت بر منابع:
- استفاده از
kubectl top
برای مشاهده مصرف منابع (CPU و Memory)
- استفاده از
فصل 3. مدیریت Namespaceها
- مشاهده Namespaceهای موجود با
kubectl get namespaces
- تغییر Namespace پیشفرض با
kubectl config set-context
- ایجاد و حذف Namespaceها
فصل 4. بررسی و Debugging
- بررسی وضعیت Pods با
kubectl logs
- مشاهده لاگهای همه کانتینرها با
--all-containers
- مشاهده لاگهای همه کانتینرها با
- استفاده از
kubectl exec
برای اجرای دستورات در داخل کانتینرها - مشاهده وقایع (Events) با
kubectl get events
- بررسی مشکلات منابع با
kubectl describe
فصل 5. مدیریت فایلهای YAML
- ایجاد فایلهای YAML برای منابع Kubernetes
- خواندن و ویرایش منابع از فایلهای YAML:
- استفاده از
kubectl edit
برای ویرایش مستقیم منابع - اعمال تغییرات با
kubectl apply -f <file>
- استفاده از
- بررسی وضعیت منابع تعریفشده در YAML با
kubectl get -f <file>
فصل 6. مدیریت Contextها و Clusterها
- مشاهده Contextهای موجود با
kubectl config get-contexts
- تغییر Context پیشفرض با
kubectl config use-context <name>
- اضافه کردن Cluster جدید به تنظیمات
kubectl
فصل 7. دستورات پیشرفته و خودکارسازی
- Labeling و Annotating:
- افزودن Label به منابع با
kubectl label
- افزودن Annotation به منابع با
kubectl annotate
- افزودن Label به منابع با
- Patch کردن منابع:
- اعمال تغییرات جزئی با
kubectl patch
- اعمال تغییرات جزئی با
- Export منابع:
- استفاده از
kubectl get <resource> -o yaml
برای استخراج تعریف YAML
- استفاده از
- آزمایش و تست منابع:
- تست فایلهای YAML با
kubectl dry-run
وkubectl validate
- تست فایلهای YAML با
فصل 8. دستورات متداول برای Scaling
- تغییر تعداد Replicas با
kubectl scale
: - مدیریت Auto-scaling با
kubectl autoscale
:
فصل 9. مدیریت ConfigMaps و Secrets
- ایجاد ConfigMaps
- ایجاد Secrets
فصل 10. استفاده از kubectl برای مانیتورینگ
- مشاهده وضعیت Health منابع با
kubectl get pods --show-labels
- مشاهده Nodeها و وضعیتشان با
kubectl get nodes
- نمایش وضعیت منابع با
kubectl describe nodes
بخش 8. طراحی برنامههای Cloud-Native
فصل 1. اصول Cloud-Native Development
- آشنایی با مفهوم Cloud-Native و کاربرد آن در توسعه برنامهها
- درک معماری مبتنی بر میکروسرویسها (Microservices Architecture)
- مدیریت حالت بیحالت (Stateless) و حالتدار (Stateful) در برنامهها
- مزایا و چالشهای طراحی برنامههای Cloud-Native:
- تحمل خطا (Fault Tolerance)
- مقیاسپذیری (Scalability)
- خودکارسازی (Automation)
- پویایی در محیط ابری
فصل 2. مدیریت مقیاسپذیری برنامهها
- تعریف و اهمیت مقیاسپذیری افقی و عمودی (Horizontal & Vertical Scaling)
- آشنایی با Horizontal Pod Autoscaler (HPA):
- نحوه پیکربندی و استفاده از HPA
- تنظیم مقیاسپذیری بر اساس معیارهایی مانند CPU و Memory
- مدیریت منابع در Kubernetes:
- تنظیم Resource Requests (درخواست منابع)
- تنظیم Resource Limits (محدودیت منابع)
- جلوگیری از Overcommit منابع
فصل 3. طراحی برای تحمل خطا (Fault Tolerance)
- مفاهیم تحمل خطا در برنامههای توزیعشده
- پیکربندی برنامهها برای بازیابی خودکار (Self-Healing):
- استفاده از Probes (Liveness و Readiness)
- کاربرد Restart Policies
- طراحی برنامهها برای بازیابی از خرابی (Failover)
فصل 4. استفاده از Config Maps و Secrets
- مدیریت متغیرهای محیطی با Config Maps
- ذخیرهسازی امن اطلاعات حساس (مانند رمزهای عبور) با Secrets
- بهترین روشها در استفاده از Config Maps و Secrets در برنامههای Cloud-Native
فصل 5. مدیریت ترافیک و Networking
- مدیریت Networking بین سرویسها:
- استفاده از Services (ClusterIP، NodePort، LoadBalancer)
- آشنایی با Ingress برای مدیریت درخواستهای HTTP/HTTPS
- استفاده از Network Policies برای محدود سازی ترافیک شبکه
- پیکربندی DNS داخلی Kubernetes
فصل 6. طراحی برای مقیاسپذیری بالا (High Availability)
- طراحی سیستمهایی با مقیاسپذیری بالا:
- استفاده از ReplicaSets و Deployments
- توزیع بار با استفاده از Load Balancer
- درک توزیع بار و توزیع منطقی Pods در Nodeها
فصل 7. مدیریت Logging و Monitoring
- جمعآوری و مدیریت لاگها در برنامههای Cloud-Native
- استفاده از ابزارهای مانیتورینگ مانند Prometheus و Grafana
- بهترین روشها برای بررسی سلامت و کارایی سیستم
فصل 8. بهینهسازی هزینهها در Kubernetes
- کاهش هزینههای منابع با تنظیم Resource Requests و Limits
- شناسایی و مدیریت منابع بلا استفاده
- استفاده از Auto-Scaling برای بهینهسازی استفاده از منابع
فصل 9. طراحی برنامهها برای CI/CD در Kubernetes
- ادغام CI/CD با Kubernetes:
- آشنایی با ابزارهای CI/CD مانند Jenkins، GitLab CI/CD و ArgoCD
- استفاده از Helm Charts برای مدیریت Deploymentها
- مدیریت Rolloutها و Rollbackها بهصورت خودکار
فصل 10. امنیت در طراحی برنامههای Cloud-Native
- پیادهسازی امنیت در سطح Pod با SecurityContext
- استفاده از RBAC (Role-Based Access Control) برای مدیریت دسترسیها
- استفاده از Network Policies برای محدود کردن دسترسیها
پیشنیازهای شرکت در دوره
- آشنایی اولیه با مفاهیم کانتینرها و Docker
- آشنایی با مفاهیم شبکه و مدیریت منابع
- تجربه در کار با فایلهای YAML و command-line interface
جمعبندی
دوره CKAD به شما کمک میکند تا مهارتهای لازم برای توسعه و مدیریت برنامههای کاربردی در Kubernetes را به دست آورید. این دوره برای کسانی که قصد دارند در محیطهای حرفهای Cloud-Native فعالیت کنند و دانش خود را در Kubernetes اثبات کنند، بسیار مفید است.
بخش 5. مبانی امنیت در Kubernetes
فصل 1. مدیریت Service Accounts و RBAC (Role-Based Access Control)
Service Accounts:
تعریف Service Account سخنرانی
توضیحات کامل
هر Service Account به همراه یک یا چند Token و Secret ایجاد میشود که برای احراز هویت درخواستها به API سرور Kubernetes استفاده میشود. این Service Accountها میتوانند بهطور خاص برای دسترسی به منابع مختلف، مانند ConfigMaps، Secrets، یا حتی اجزای Kubernetes نظیر Pods یا Services محدود شوند.
چرا از Service Account برای Pods استفاده میشود؟
- به هر Pod اجازه میدهد تا با استفاده از یک هویت خاص به Kubernetes API دسترسی داشته باشد.
- میتوان دسترسی به منابع مختلف را با استفاده از Role و RoleBinding کنترل کرد.
- برای احراز هویت و دسترسی به منابع داخلی Kubernetes، نیازی به ایجاد و مدیریت credentials دستی نیست.
در نهایت، Service Accountها به Kubernetes کمک میکنند که دسترسیها بهصورت ایمن و مدیریتشده برای هر پاد تعریف شوند.
استفاده پیشفرض از Service Account در Kubernetes
پادها بهطور پیشفرض از Service Account به نام default
در namespace خود استفاده میکنند. این Service Account دسترسیهای محدودی به منابع Kubernetes دارد و معمولاً برای بیشتر کاربردهای عمومی مناسب است. اما در موارد خاص که نیاز به دسترسیهای خاصتر یا جداگانه باشد، باید یک Service Account جدید ایجاد و برای پاد تنظیم شود.
ایجاد Service Account جدید
برای ایجاد یک Service Account جدید به نام my-service-account
در namespace جاری، از دستور زیر استفاده میکنیم:
kubectl create serviceaccount my-service-account
برای مشاهده لیست Service Accountها در namespace جاری:
kubectl get serviceaccounts
پیکربندی Podها برای استفاده از Service Account خاص
پس از ایجاد یک Service Account جدید، باید فایل YAML پاد را طوری پیکربندی کنیم که از آن Service Account خاص استفاده کند. این کار با اضافه کردن بخش serviceAccountName
به فایل YAML پاد انجام میشود.
نمونه فایل YAML پاد که از Service Account خاص استفاده میکند:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
serviceAccountName: my-service-account
containers:
- name: mycontainer
image: nginx
در اینجا:
serviceAccountName: my-service-account
مشخص میکند که پادmypod
باید از Service Account به نامmy-service-account
استفاده کند.
برای اعمال این پیکربندی و ایجاد پاد:
kubectl apply -f pod-definition.yaml
مشاهده Service Accountها
برای مشاهده لیست Service Accountها در namespace جاری:
kubectl get serviceaccounts
برای دیدن جزئیات یک Service Account خاص، از دستور زیر استفاده میکنیم:
kubectl describe serviceaccount my-service-account
این دستور اطلاعاتی مانند Secrets و Tokens مرتبط با Service Account را نمایش میدهد.
جمع بندی
در این بخش، با Service Account آشنا شدیم که به Pods و سرویسها اجازه میدهد تا با استفاده از هویتی خاص به منابع Kubernetes دسترسی داشته باشند. این Service Accountها میتوانند برای ایجاد دسترسیهای ایمن و محدود به منابع مختلف استفاده شوند. ما همچنین یاد گرفتیم که چگونه میتوانیم یک Service Account جدید ایجاد کرده و پادها را به استفاده از آن تنظیم کنیم. این روش به ما این امکان را میدهد که دسترسیهای مختلف را بهطور دقیقتر مدیریت کنیم.
ایجاد و مدیریت Service Accounts جدید سخنرانی
توضیحات کامل
در این بخش، به صورت دقیق به چگونگی ایجاد و مدیریت Service Accountها پرداخته میشود.
ایجاد یک Service Account جدید
برای ایجاد یک Service Account جدید در Kubernetes، میتوانید از دستور kubectl create serviceaccount
استفاده کنید.
1. ایجاد Service Account جدید
برای ایجاد یک Service Account جدید به نام my-service-account
در namespace جاری، از دستور زیر استفاده کنید:
kubectl create serviceaccount my-service-account
این دستور یک Service Account جدید با نام my-service-account
در namespace جاری ایجاد میکند.
2. ایجاد Service Account در یک Namespace خاص
اگر بخواهید Service Account را در یک namespace خاص ایجاد کنید، میتوانید از دستور زیر استفاده کنید:
kubectl create serviceaccount my-service-account -n my-namespace
در اینجا -n my-namespace
مشخص میکند که Service Account جدید در namespace my-namespace
ایجاد شود.
3. مشاهده Service Accountها
برای مشاهده لیست تمامی Service Accountها در namespace جاری:
kubectl get serviceaccounts
اگر بخواهید Service Accountها را در یک namespace خاص مشاهده کنید، از دستور زیر استفاده کنید:
kubectl get serviceaccounts -n my-namespace
4. مشاهده جزئیات Service Account
برای مشاهده اطلاعات دقیقتر در مورد یک Service Account خاص، از دستور describe
استفاده کنید:
kubectl describe serviceaccount my-service-account
این دستور اطلاعاتی مانند Tokens و Secrets مربوط به Service Account را نمایش میدهد.
ایجاد Service Account از طریق فایل YAML
شما میتوانید Service Account را از طریق یک فایل YAML نیز تعریف کنید. این روش برای ایجاد و مدیریت Service Accountها در پروژههای بزرگ یا برای استفاده در pipelineهای CI/CD مناسب است.
نمونه فایل YAML برای ایجاد یک Service Account به نام my-service-account
در namespace my-namespace
:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: my-namespace
برای ایجاد این Service Account از فایل YAML:
kubectl apply -f serviceaccount.yaml
تغییرات در Service Accountها
پس از ایجاد Service Account، ممکن است بخواهید تنظیمات یا جزئیات آن را تغییر دهید. به طور مستقیم نمیتوان Service Accountها را ویرایش کرد، اما میتوانید آنها را حذف کرده و با تنظیمات جدید ایجاد کنید.
برای حذف یک Service Account، از دستور زیر استفاده کنید:
kubectl delete serviceaccount my-service-account
اگر بخواهید یک Service Account را در namespace خاصی حذف کنید:
kubectl delete serviceaccount my-service-account -n my-namespace
دسترسی به Secrets و Tokens مرتبط با Service Account
هر Service Account به طور خودکار Token و Secret برای احراز هویت به API سرور Kubernetes تولید میکند. برای مشاهده Secrets مربوط به یک Service Account، از دستور زیر استفاده کنید:
kubectl get secrets
برای مشاهده جزئیات یک Secret خاص که به Service Account متصل است:
kubectl describe secret <secret-name>
این اطلاعات برای احراز هویت و ارتباط با Kubernetes API مفید است.
استفاده از Service Account در Pods
پس از ایجاد یک Service Account جدید، میتوانید آن را برای استفاده در Pods تنظیم کنید. برای این کار باید نام Service Account را در فایل YAML پاد مشخص کنید.
نمونه فایل YAML برای پاد که از Service Account جدید استفاده میکند:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
serviceAccountName: my-service-account
containers:
- name: mycontainer
image: nginx
در اینجا، serviceAccountName: my-service-account
مشخص میکند که پاد باید از Service Account به نام my-service-account
استفاده کند.
برای اعمال این پیکربندی و ایجاد پاد:
kubectl apply -f pod-definition.yaml
جمع بندی
در این بخش، یاد گرفتیم که چگونه یک Service Account جدید ایجاد کرده و آن را در Kubernetes مدیریت کنیم. استفاده از دستور kubectl create serviceaccount
یا فایلهای YAML به ما این امکان را میدهد که به راحتی Service Accountها را در namespaceهای مختلف ایجاد کنیم. همچنین، مشاهده جزئیات و دسترسی به Secrets و Tokens مرتبط با Service Account به ما کمک میکند که بتوانیم دسترسیها را به صورت دقیقتری مدیریت کنیم. در نهایت، با استفاده از تنظیمات صحیح در فایلهای YAML، میتوانیم Service Account را برای استفاده در Pods تنظیم کرده و از آن برای دسترسی به منابع Kubernetes استفاده کنیم.
پیکربندی Podها برای استفاده از Service Accounts خاص سخنرانی
توضیحات کامل
۱. مفهوم Service Account در Pods
در Kubernetes، هر Pod میتواند به یک Service Account خاص اختصاص یابد. این تخصیص به Pod این امکان را میدهد که از Token و Secret موجود در Service Account برای احراز هویت و دسترسی به API سرور Kubernetes استفاده کند.
در صورتی که برای یک Pod، Service Account مشخص نشود، Kubernetes به صورت خودکار یک Service Account به نام default
به آن Pod اختصاص میدهد.
۲. پیکربندی Pod برای استفاده از Service Account خاص
برای اینکه یک Pod از Service Account خاص استفاده کند، باید در فایل پیکربندی آن Pod (که معمولاً در قالب فایل YAML است) گزینه serviceAccountName
را تنظیم کنید.
۲.۱. مثال پیکربندی Pod برای استفاده از یک Service Account خاص
در این مثال، قصد داریم یک Pod به نام myapp-pod
ایجاد کنیم که از Service Account به نام my-service-account
استفاده میکند. فایل YAML این Pod به صورت زیر خواهد بود:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
serviceAccountName: my-service-account # استفاده از Service Account خاص
containers:
- name: myapp-container
image: nginx
در این فایل YAML:
serviceAccountName: my-service-account
به Kubernetes میگوید که این Pod باید از Service Account به نامmy-service-account
استفاده کند.- اگر این Service Account وجود نداشته باشد، Kubernetes خطا میدهد.
۲.۲. اعمال پیکربندی و ایجاد Pod
برای ایجاد Pod از این پیکربندی، دستور زیر را اجرا کنید:
kubectl apply -f pod-definition.yaml
این دستور Pod را با نام myapp-pod
ایجاد میکند که از Service Account مشخصشده (my-service-account
) استفاده خواهد کرد.
۳. بررسی وضعیت Pod و Service Account
برای بررسی وضعیت Pod و مطمئن شدن از اینکه Pod به درستی از Service Account خاص استفاده میکند، میتوانید از دستور describe
استفاده کنید:
kubectl describe pod myapp-pod
در قسمت Service Account که در اطلاعات Pod نمایش داده میشود، باید نام my-service-account
را مشاهده کنید.
۴. بررسی دسترسیها و استفاده از Token
برای اینکه مطمئن شوید Pod به درستی از Service Account استفاده میکند، میتوانید Tokenهای مربوط به آن Service Account را بررسی کنید. هر Pod که از Service Account خاص استفاده میکند، به طور خودکار Token مربوط به آن Service Account را در اختیار خواهد داشت.
برای بررسی Secretها و Tokenها، دستور زیر را اجرا کنید:
kubectl get secrets
سپس، Secret مربوط به Service Account را پیدا کرده و جزئیات آن را مشاهده کنید:
kubectl describe secret <secret-name>
۵. استفاده از Service Account در دسترسی به API Kubernetes
هر Pod که به Service Account خاصی اختصاص یابد، از Tokenهای آن Service Account برای دسترسی به API Kubernetes استفاده میکند. این دسترسیها شامل خواندن منابع مانند پادها، خدمات، و سایر منابع Kubernetes میشود.
برای مثال، اگر شما یک Pod دارید که نیاز دارد به صورت برنامهنویسی به API سرور Kubernetes دسترسی پیدا کند، میتوانید از kubectl client یا از کتابخانههای خاص برای دسترسی به API استفاده کنید. در این حالت، توکن مربوط به Service Account به طور خودکار برای احراز هویت استفاده میشود.
۶. تنظیمات پیشرفته: استفاده از Service Account در Deploymentها و سایر منابع
شما میتوانید از Service Accountها نه تنها در Pods، بلکه در منابع دیگری مانند Deployments، StatefulSets، DaemonSets و غیره نیز استفاده کنید. در اینجا نمونهای از پیکربندی یک Deployment که از یک Service Account خاص استفاده میکند آورده شده است:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
serviceAccountName: my-service-account # استفاده از Service Account خاص
containers:
- name: myapp-container
image: nginx
در اینجا، serviceAccountName: my-service-account
باعث میشود که Podsهای ایجاد شده توسط این Deployment از Service Account خاص استفاده کنند.
جمع بندی
در این بخش، نحوه پیکربندی Pods برای استفاده از Service Account خاص بررسی شد. با تخصیص یک Service Account خاص به یک Pod، میتوان دسترسیهای مشخص و امن را برای Pods فراهم کرد. این تخصیص به طور معمول از طریق گزینه serviceAccountName
در فایل YAML انجام میشود و میتواند به راحتی در انواع منابع Kubernetes از جمله Pods و Deployments به کار رود. استفاده صحیح از Service Accountها به شما کمک میکند که دسترسیها را کنترل کنید و امنیت برنامههای خود را افزایش دهید.
Role-Based Access Control (RBAC):
تعریف مفاهیم Role و ClusterRole سخنرانی
توضیحات کامل
۱. مفهوم Role
Role در Kubernetes مجموعهای از مجوزها (permissions) است که به منابع خاصی در یک Namespace معین اجازه دسترسی میدهد. این مجوزها میتوانند شامل عملیاتهایی مانند مشاهده، ایجاد، بروزرسانی یا حذف منابع مختلفی مانند Pods، Services، ConfigMaps و دیگر منابع باشند.
مفهوم Role برای کنترل دسترسی دقیق و در مقیاس کوچک به کار میرود و فقط به منابع داخل یک Namespace خاص اعمال میشود. به عبارت دیگر، اگر شما یک Role در یک Namespace ایجاد کنید، دسترسیهای آن فقط برای منابع همان Namespace معتبر خواهد بود.
۱.۱. مثال پیکربندی یک Role
در این مثال، یک Role به نام pod-reader
تعریف میشود که فقط مجوز خواندن (get
, list
, watch
) از منابع Pods را در یک Namespace خاص میدهد.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
در این پیکربندی:
- apiGroups: [“”] نشاندهنده گروه API برای منابع پایه است.
- resources: [“pods”] منابعی هستند که دسترسی به آنها مجاز است.
- verbs: [“get”, “list”, “watch”] مشخص میکنند که کاربر میتواند این عملیاتها را روی منابع انجام دهد.
برای اعمال این Role، میتوانید از دستور زیر استفاده کنید:
kubectl apply -f role-definition.yaml
۲. مفهوم ClusterRole
ClusterRole مشابه Role است، اما با این تفاوت که ClusterRole میتواند دسترسیهایی را در سطح کل کلاستر (تمامی Namespaceها) اعمال کند. به عبارت دیگر، ClusterRole به منابع موجود در تمامی Namespaceها دسترسی میدهد، نه فقط یک Namespace خاص.
این امکان برای تنظیم دسترسیهای سطح کل کلاستر مانند مشاهده منابع در تمامی Namespaceها یا مدیریت منابع خاص در کلاستر مفید است.
۲.۱. مثال پیکربندی یک ClusterRole
در این مثال، یک ClusterRole به نام cluster-admin
تعریف میشود که تمامی عملیاتها را بر روی تمامی منابع در تمام Namespaceها مجاز میکند.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: [""]
resources: ["pods", "services", "nodes"]
verbs: ["*"]
در این پیکربندی:
- apiGroups: [“”] گروه API برای منابع پایه است.
- resources: [“pods”, “services”, “nodes”] منابعی هستند که دسترسی به آنها مجاز است.
- verbs: [“*”] به این معنی است که تمامی عملیاتها مانند ایجاد، خواندن، بروزرسانی و حذف برای این منابع مجاز هستند.
برای اعمال این ClusterRole، میتوانید از دستور زیر استفاده کنید:
kubectl apply -f clusterrole-definition.yaml
۳. تفاوت اصلی بین Role و ClusterRole
ویژگی | Role | ClusterRole |
---|---|---|
محدوده دسترسی | محدود به یک Namespace خاص | اعمال دسترسیها در سطح کل کلاستر، شامل تمامی Namespaceها |
زمان استفاده | برای مدیریت دسترسیها در سطح Namespace | برای مدیریت دسترسیها در سطح کلاستر، مستقل از Namespace |
استفادههای معمول | دسترسی به منابع مانند Pods، Services در یک Namespace خاص | دسترسیهای جهانی مانند مشاهده تمامی Pods و خدمات در کل کلاستر |
۴. استفاده از Role و ClusterRole در ترکیب با RoleBinding و ClusterRoleBinding
برای اینکه یک کاربر، گروه یا Service Account بتواند از Role یا ClusterRole استفاده کند، باید یک RoleBinding یا ClusterRoleBinding ایجاد کنید. این تنظیمات مجوزها را برای کاربران یا سرویسها در سطح خاص (Namespace یا کلاستر) اعمال میکنند.
۴.۱. RoleBinding برای Role
اگر بخواهید یک Role خاص را به یک کاربر در یک Namespace مشخص تخصیص دهید، باید از RoleBinding استفاده کنید.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: User
name: "example-user" # کاربر یا سرویساکانت مورد نظر
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader # نام Role که تخصیص داده میشود
apiGroup: rbac.authorization.k8s.io
۴.۲. ClusterRoleBinding برای ClusterRole
اگر بخواهید یک ClusterRole را به یک کاربر یا سرویساکانت در سطح کلاستر تخصیص دهید، باید از ClusterRoleBinding استفاده کنید.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: User
name: "example-user" # کاربر یا سرویساکانت مورد نظر
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin # نام ClusterRole که تخصیص داده میشود
apiGroup: rbac.authorization.k8s.io
جمع بندی
در این بخش، مفاهیم Role و ClusterRole در Kubernetes معرفی و توضیح داده شد. Role به شما این امکان را میدهد که دسترسیها را در سطح یک Namespace خاص کنترل کنید، در حالی که ClusterRole دسترسیها را در سطح کل کلاستر فراهم میآورد. برای تخصیص این دسترسیها به کاربران، گروهها یا سرویساکانتها، از RoleBinding و ClusterRoleBinding استفاده میشود. این ابزارها نقش بسیار مهمی در مدیریت دسترسیها و امنیت در Kubernetes ایفا میکنند.
ایجاد و مدیریت RoleBinding و ClusterRoleBinding سخنرانی
توضیحات کامل
RoleBinding
RoleBinding یک اتصال بین یک Role و یک یا چند subject (مثل کاربران، سرویساکانتها یا گروهها) در یک Namespace خاص است. با استفاده از RoleBinding، دسترسیهای موجود در یک Role را میتوان به کاربران خاص یا سرویساکانتها در همان Namespace تخصیص داد.
ساختار پیکربندی RoleBinding
در اینجا یک مثال از RoleBinding برای تخصیص یک Role به یک ServiceAccount آورده شده است:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default # Namespace مورد نظر
subjects:
- kind: ServiceAccount
name: example-service-account # نام سرویساکانت
namespace: default # Namespace که سرویساکانت در آن قرار دارد
roleRef:
kind: Role
name: pod-reader # نام Role که باید به آن دسترسی داده شود
apiGroup: rbac.authorization.k8s.io
در این پیکربندی:
- subjects: کاربر یا سرویساکانت مورد نظر که میخواهید دسترسیها را به آن بدهید.
- roleRef: اشاره به Role یا ClusterRole که میخواهید دسترسیها از آن گرفته شود.
- namespace: مشخص میکند که این RoleBinding در کدام Namespace اعمال شود (در اینجا default).
برای اعمال این RoleBinding، میتوانید دستور زیر را اجرا کنید:
kubectl apply -f rolebinding-definition.yaml
ClusterRoleBinding
ClusterRoleBinding مشابه RoleBinding است، با این تفاوت که ClusterRoleBinding برای تخصیص دسترسیها در سطح کلاستر (یعنی برای تمام Namespaceها) به کار میرود. به این معنی که اگر بخواهید یک ClusterRole را به یک کاربر یا سرویساکانت در سطح کلاستر تخصیص دهید، باید از ClusterRoleBinding استفاده کنید.
ساختار پیکربندی ClusterRoleBinding
در اینجا یک مثال از ClusterRoleBinding برای تخصیص یک ClusterRole به یک ServiceAccount آورده شده است:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: ServiceAccount
name: example-service-account # نام سرویساکانت
namespace: default # Namespace که سرویساکانت در آن قرار دارد
roleRef:
kind: ClusterRole
name: cluster-admin # نام ClusterRole که باید به آن دسترسی داده شود
apiGroup: rbac.authorization.k8s.io
در این پیکربندی:
- subjects: کاربر یا سرویساکانت که میخواهید دسترسیها را به آن بدهید.
- roleRef: اشاره به ClusterRole یا Role که میخواهید دسترسیها از آن گرفته شود.
- namespace: در اینجا Namespace سرویساکانت مشخص شده است. این بخش در ClusterRoleBinding تأثیری ندارد زیرا دسترسیها در سطح کلاستر اعمال میشود.
برای اعمال این ClusterRoleBinding، میتوانید دستور زیر را اجرا کنید:
kubectl apply -f clusterrolebinding-definition.yaml
ویرایش و حذف RoleBinding و ClusterRoleBinding
برای ویرایش یا حذف RoleBinding یا ClusterRoleBinding میتوانید از دستورات زیر استفاده کنید.
ویرایش RoleBinding و ClusterRoleBinding
برای ویرایش RoleBinding یا ClusterRoleBinding میتوانید از دستور kubectl edit
استفاده کنید:
kubectl edit rolebinding pod-reader-binding -n default
kubectl edit clusterrolebinding cluster-admin-binding
این دستورها ویرایشگر پیشفرض سیستم را باز کرده و به شما اجازه میدهند پیکربندی را تغییر دهید.
حذف RoleBinding و ClusterRoleBinding
برای حذف RoleBinding یا ClusterRoleBinding از دستور زیر استفاده کنید:
kubectl delete rolebinding pod-reader-binding -n default
kubectl delete clusterrolebinding cluster-admin-binding
جمع بندی
در این بخش، نحوه ایجاد و مدیریت RoleBinding و ClusterRoleBinding در Kubernetes بررسی شد. RoleBinding برای تخصیص دسترسیهای یک Role به کاربران یا سرویساکانتها در یک Namespace خاص استفاده میشود، در حالی که ClusterRoleBinding برای تخصیص دسترسیهای یک ClusterRole در سطح کلاستر استفاده میشود. این مفاهیم به شما امکان میدهند تا دسترسیهای پیچیده را به راحتی مدیریت کرده و امنیت کلاستر خود را بهینه کنید.
محدودسازی دسترسی کاربران و منابع Kubernetes سخنرانی
توضیحات کامل
در این بخش، به بررسی روشهای مختلف محدودسازی دسترسی به منابع و کاربران در Kubernetes خواهیم پرداخت.
1. استفاده از Role-Based Access Control (RBAC)
RBAC یک مدل امنیتی است که به شما این امکان را میدهد تا دسترسی به منابع را بر اساس نقشها و حقوق کاربران کنترل کنید. همانطور که پیشتر اشاره شد، در RBAC از مفاهیم Role و ClusterRole برای تعریف نقشها و سطح دسترسی استفاده میشود. پس از تعریف این نقشها، میتوانید با استفاده از RoleBinding و ClusterRoleBinding دسترسیها را به سرویساکانتها و کاربران تخصیص دهید.
محدودسازی دسترسی با استفاده از Roles
برای محدودسازی دسترسی به منابع مختلف در یک Namespace خاص، میتوانید از Role استفاده کنید. یک Role به شما اجازه میدهد تا دسترسیهای خاصی (مثل خواندن، نوشتن، حذف و غیره) را به منابع خاص (مثل Pods، Services، و Deployments) در یک Namespace معین بدهید.
مثال:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
در این مثال، یک Role با نام pod-reader
ایجاد شده که به کاربر یا سرویساکانت دسترسی خواندن (get
و list
) به منابع Pods در Namespace default
میدهد.
2. استفاده از Network Policies
Network Policies یکی از ابزارهای بسیار مهم برای محدودسازی دسترسی بین پادها (Pods) در Kubernetes است. با استفاده از Network Policies، میتوانید مشخص کنید که کدام پادها مجاز به ارتباط با پادهای دیگر هستند. این امر به ویژه برای جداسازی و کنترل ترافیک شبکه در کلاسترهای بزرگ و پیچیده بسیار مفید است.
ساختار Network Policy
در یک Network Policy، میتوانید تعیین کنید که کدام پادها از چه IPها یا پورتهایی اجازه برقراری ارتباط دارند.
مثال:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-access
namespace: default
spec:
podSelector:
matchLabels:
app: db
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- protocol: TCP
port: 3306
در این پیکربندی:
- podSelector: مشخص میکند که کدام پادها تحت تاثیر این سیاست قرار میگیرند.
- ingress: مشخص میکند که از کجا و از چه پورتهایی ترافیک به این پادها مجاز است. در اینجا فقط پادهایی با برچسب
app: web
میتوانند به پادهایی با برچسبapp: db
روی پورت 3306 دسترسی داشته باشند.
برای اعمال این سیاست شبکه، دستور زیر را اجرا کنید:
kubectl apply -f networkpolicy-definition.yaml
3. استفاده از Resource Quotas
برای محدودسازی استفاده از منابع مانند CPU، حافظه و تعداد پادها در یک Namespace، میتوانید از Resource Quotas استفاده کنید. Resource Quotas به شما اجازه میدهد تا سقفی برای منابع استفادهشده توسط پادها و دیگر منابع در یک Namespace تعیین کنید.
ساختار Resource Quota
مثال:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: default
spec:
hard:
requests.cpu: "2"
requests.memory: 4Gi
limits.cpu: "4"
limits.memory: 8Gi
pods: "10"
در این پیکربندی:
- requests.cpu و requests.memory: مقدار حداقل منابعی که هر پاد باید درخواست کند.
- limits.cpu و limits.memory: حداکثر منابعی که یک پاد میتواند مصرف کند.
- pods: تعداد پادهایی که میتوانند در این Namespace ایجاد شوند.
برای اعمال این محدودیت، دستور زیر را اجرا کنید:
kubectl apply -f resourcequota-definition.yaml
4. استفاده از PodSecurityPolicies
PodSecurityPolicies (اگر فعال باشد) میتوانند برای محدود کردن رفتار پادها در Kubernetes استفاده شوند. این سیاستها به شما این امکان را میدهند که رفتارهای خطرناک پادها مانند اجرای کانتینرها با دسترسی ریشه (root)، استفاده از حجمهای مشترک و یا دسترسی به شبکههای خارجی را محدود کنید.
ساختار PodSecurityPolicy
مثال:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-psp
spec:
privileged: false
volumes:
- 'emptyDir'
- 'configMap'
- 'secret'
allowedCapabilities: []
requiredDropCapabilities:
- NET_ADMIN
- SYS_TIME
runAsUser:
rule: 'MustRunAsNonRoot'
در این پیکربندی:
- privileged: تعیین میکند که پاد نمیتواند به صورت privileged اجرا شود.
- allowedCapabilities: قابلیتهای مجاز برای پادها را محدود میکند.
- runAsUser: نیاز به اجرای کانتینرها با کاربر غیر ریشه دارد.
برای اعمال این سیاست، دستور زیر را اجرا کنید:
kubectl apply -f podsecuritypolicy-definition.yaml
جمع بندی
در این بخش، روشهای مختلف محدودسازی دسترسی کاربران و منابع در Kubernetes را بررسی کردیم. با استفاده از RBAC میتوانید دسترسیهای دقیقتری به منابع مختلف در کلاستر خود اعمال کنید. از Network Policies میتوانید برای کنترل ترافیک شبکه و ارتباط بین پادها استفاده کنید. Resource Quotas به شما این امکان را میدهند که منابع را در یک Namespace محدود کنید. همچنین PodSecurityPolicies میتوانند برای محدود کردن رفتار پادها و افزایش امنیت استفاده شوند. این ابزارها به شما کمک میکنند که از دسترسیهای غیرمجاز جلوگیری کرده و امنیت کلاستر خود را بهبود بخشید.
بررسی دسترسی کاربران با استفاده از دستورات kubectl auth can-i سخنرانی
توضیحات کامل
برای این منظور، ابزار kubectl auth can-i
در Kubernetes طراحی شده است که به شما این امکان را میدهد تا بررسی کنید که آیا یک کاربر یا سرویساکانت خاص اجازه انجام عملی خاص را دارد یا خیر. این ابزار بهویژه زمانی مفید است که بخواهید دسترسیها را عیبیابی کرده و از صحیح بودن تنظیمات Role و ClusterRole خود اطمینان حاصل کنید.
1. ساختار دستور kubectl auth can-i
دستور kubectl auth can-i
به شما این امکان را میدهد که بررسی کنید آیا یک کاربر یا سرویساکانت خاص اجازه انجام عملی خاص را بر روی منابع Kubernetes دارد یا خیر. این دستور برای شبیهسازی دسترسیها استفاده میشود و از دستورات زیر میتوان به آن دسترسی پیدا کرد:
kubectl auth can-i <action> <resource> [--namespace=<namespace>] [--as=<user>]
در اینجا:
<action>
: عملی است که میخواهید دسترسی آن را بررسی کنید. این عمل میتواند یکی از مواردی مانندget
،create
،delete
،update
و غیره باشد.<resource>
: نام منبعی است که میخواهید دسترسی به آن را بررسی کنید. به عنوان مثال،pods
،services
،deployments
و غیره.--namespace=<namespace>
: در صورتی که بخواهید دسترسی را در یک Namespace خاص بررسی کنید، میتوانید این پارامتر را مشخص کنید.--as=<user>
: برای بررسی دسترسی کاربری خاص به جای کاربر فعلی، میتوانید این پارامتر را به کار ببرید.
2. مثالهای عملی برای استفاده از kubectl auth can-i
بررسی دسترسی برای مشاهده (Read) منابع Pods
برای بررسی اینکه آیا کاربر یا سرویساکانت خاصی میتواند اطلاعات Pods را در Namespace خاصی مشاهده کند، از دستور زیر استفاده کنید:
kubectl auth can-i get pods --namespace=default
این دستور بررسی میکند که آیا کاربر فعلی مجاز به انجام عمل get
روی Pods در Namespace default
است یا خیر.
بررسی دسترسی برای ایجاد (Create) منابع Deployment
اگر بخواهید بررسی کنید که آیا کاربر یا سرویساکانت خاصی مجاز به ایجاد یک Deployment در Namespace خاصی است، دستور زیر را وارد کنید:
kubectl auth can-i create deployments --namespace=default
این دستور بررسی میکند که آیا کاربر فعلی اجازه ایجاد Deployment در Namespace default
را دارد یا خیر.
بررسی دسترسی برای حذف (Delete) منابع Service
برای بررسی اینکه آیا کاربر خاصی اجازه حذف یک Service را در Namespace خاصی دارد، از دستور زیر استفاده کنید:
kubectl auth can-i delete services --namespace=default
این دستور بررسی میکند که آیا کاربر فعلی میتواند Services را در Namespace default
حذف کند یا خیر.
بررسی دسترسی برای دسترسی به منابع در یک Cluster بهصورت کلی
برای بررسی دسترسی به یک منبع در سطح کلاستر، میتوانید از دستور زیر استفاده کنید:
kubectl auth can-i get pods --as=admin
در این دستور، بررسی میکنیم که آیا کاربر admin
مجاز به انجام عملیات get
روی منابع Pods است یا خیر.
بررسی دسترسی برای ایجاد (Create) منابع Secret برای کاربر خاص
برای بررسی اینکه آیا کاربر خاصی میتواند Secret در Namespace خاصی ایجاد کند، دستور زیر را وارد کنید:
kubectl auth can-i create secrets --namespace=default --as=john
این دستور بررسی میکند که آیا کاربر john
مجاز به ایجاد Secrets در Namespace default
است یا خیر.
3. نتایج دستور kubectl auth can-i
دستور kubectl auth can-i
دو نتیجه ممکن دارد:
- yes: نشاندهنده این است که کاربر یا سرویساکانت مجاز به انجام عمل موردنظر است.
- no: نشاندهنده این است که کاربر یا سرویساکانت مجاز به انجام عمل موردنظر نیست.
4. استفاده از kubectl auth can-i
برای تست RoleBindings و ClusterRoleBindings
با استفاده از این ابزار، میتوانید بررسی کنید که آیا یک RoleBinding یا ClusterRoleBinding به درستی دسترسیها را تخصیص داده است یا خیر. به عنوان مثال، برای بررسی دسترسی یک سرویساکانت به منابع مختلف در کلاستر، میتوانید دستورات زیر را به کار ببرید:
kubectl auth can-i get pods --as=serviceaccount:default:my-service-account --namespace=default
این دستور بررسی میکند که آیا سرویساکانت my-service-account
که در Namespace default
قرار دارد، میتواند Pods را مشاهده کند یا خیر.
5. بررسی دسترسی برای کاربران در سطح کلاستر
اگر بخواهید بررسی کنید که آیا یک کاربر خاص به منابع در سطح کلاستر دسترسی دارد یا خیر، میتوانید از دستور زیر استفاده کنید:
kubectl auth can-i get nodes --as=admin
این دستور بررسی میکند که آیا کاربر admin
مجاز به مشاهده Nodes در کلاستر است یا خیر.
جمع بندی
دستور kubectl auth can-i
ابزاری قدرتمند برای بررسی و عیبیابی دسترسیها در Kubernetes است. این دستور به شما این امکان را میدهد که بررسی کنید آیا یک کاربر یا سرویساکانت خاص مجاز به انجام عمل خاصی بر روی منابع مختلف است یا خیر. استفاده از این دستور میتواند به شما در شبیهسازی دسترسیها و اطمینان از صحت تنظیمات Role و ClusterRole کمک کند و امنیت کلاستر شما را تقویت کند.
فصل 2. استفاده از Security Context برای Pods و کانتینرها
SecurityContext:
تعریف و تنظیم Security Context در سطح Pod سخنرانی
توضیحات کامل
Security Context در سطح Pod به شما این امکان را میدهد که امنیت کلی Pod و تمام Containers داخل آن را تعریف کنید. بهطور کلی، این تنظیمات شامل مواردی مثل User ID (UID)، Group ID (GID)، و دسترسیهای سطح پایین به منابع سیستم میباشد.
1. ساختار کلی یک Security Context در سطح Pod
Security Context در سطح Pod میتواند بهصورت زیر در فایل YAML تعریف شود:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seLinuxOptions:
level: "s0:c123,c456"
containers:
- name: example-container
image: example-image
securityContext:
allowPrivilegeEscalation: false
privileged: false
در اینجا:
runAsUser
: تعیین میکند که تمامی Containers در داخل Pod تحت چه User ID (UID) اجرا شوند.runAsGroup
: مشخص میکند که تمامی Containers در داخل Pod تحت چه Group ID (GID) اجرا شوند.fsGroup
: به شما این امکان را میدهد که مشخص کنید چه Group ID (GID) برای دسترسی به سیستمفایلها در اختیار Containers قرار گیرد.seLinuxOptions
: برای تعیین تنظیمات خاص SELinux استفاده میشود.allowPrivilegeEscalation
: این تنظیم مشخص میکند که آیا میتوان از سطح دسترسیهای پایینتر به سطح بالاتر دسترسی پیدا کرد یا خیر.privileged
: اگرtrue
باشد، به Container سطح دسترسیهای بیشتری داده میشود که معمولا برای Containerهای خاص نیاز است (مثل دسترسی به دستگاههای خاص).
2. تنظیمات کلیدی در Security Context
برای پیکربندی دقیقتر Security Context در سطح Pod، میتوانید از تنظیمات مختلف زیر استفاده کنید:
1. runAsUser
و runAsGroup
این تنظیمات تعیین میکنند که کاربران و گروههای مختلف چه دسترسیهایی در Pod خواهند داشت.
runAsUser
: این گزینه برای تعیین User ID (UID) است که Containerها اجرا میشوند. این کار میتواند امنیت سیستم را از طریق جلوگیری از دسترسیهای غیرمجاز به منابع حساس بهبود بخشد.runAsGroup
: این گزینه برای تعیین Group ID (GID) است که به همراهrunAsUser
برای Containers استفاده میشود.
securityContext:
runAsUser: 1000
runAsGroup: 3000
2. fsGroup
این گزینه Group ID (GID) را تعیین میکند که برای تمام فایلها و دایرکتوریهای موجود در Pod بهعنوان گروه مالک تعیین میشود. این تنظیم میتواند برای کنترل دسترسی به سیستمفایلها استفاده شود.
securityContext:
fsGroup: 2000
3. allowPrivilegeEscalation
این گزینه نشاندهنده این است که آیا Containers داخل Pod اجازه دارند از سطح دسترسیهای پایین به سطح بالاتر دسترسی پیدا کنند یا خیر. بهطور معمول، این گزینه باید روی false
تنظیم شود تا از افزایش سطح دسترسیهای غیرمجاز جلوگیری شود.
securityContext:
allowPrivilegeEscalation: false
4. privileged
اگر این گزینه فعال باشد (true
)، Container به سطح دسترسی بیشتری دست خواهد یافت، که میتواند برای کارهایی مانند کار با دستگاههای خاص یا استفاده از امکانات سیستمی خاص مورد نیاز باشد. بهطور معمول، این گزینه باید غیرفعال باشد مگر اینکه کاملاً ضروری باشد.
securityContext:
privileged: false
5. readOnlyRootFilesystem
با فعال کردن این گزینه، سیستمفایل ریشه (root filesystem) Container بهصورت فقطخواندنی (read-only) میشود، که این امر میتواند امنیت را در برابر دسترسیهای غیرمجاز افزایش دهد.
securityContext:
readOnlyRootFilesystem: true
6. seLinuxOptions
این گزینه برای پیکربندی ویژگیهای SELinux (Security-Enhanced Linux) برای Pod استفاده میشود. این تنظیمات میتوانند بر اساس سطح امنیتی خاصی که برای Pod مورد نیاز است، پیکربندی شوند.
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
3. استفاده از Security Context در سطح Container
در داخل یک Pod، میتوانید علاوه بر تنظیمات سطح Pod، Security Context را بهصورت جداگانه برای هر Container تنظیم کنید. برای این کار، باید تنظیمات securityContext
را در بخش مربوط به هر Container در فایل YAML قرار دهید:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: example-image
securityContext:
runAsUser: 1001
allowPrivilegeEscalation: false
در این مثال، تنظیمات Security Context برای Container خاصی اعمال شده است که ممکن است با تنظیمات کل Pod متفاوت باشد.
4. تعیین Security Context بهصورت دینامیک
برای تنظیم Security Context بهصورت دینامیک در هنگام اجرای Pod، میتوانید از دستورات kubectl
بهصورت مستقیم استفاده کنید:
kubectl run example-pod --image=nginx --restart=Never \
--overrides='
{
"apiVersion": "v1",
"spec": {
"securityContext": {
"runAsUser": 1000,
"runAsGroup": 3000
},
"containers": [
{
"name": "nginx",
"image": "nginx",
"securityContext": {
"allowPrivilegeEscalation": false
}
}
]
}
}'
در این دستور، Pod با تنظیمات Security Context خاص ایجاد میشود.
جمع بندی
Security Context در Kubernetes ابزاری قدرتمند برای مدیریت و تنظیم امنیت Podها و Containers است. با استفاده از این تنظیمات، میتوانید کنترل دقیقی بر روی دسترسیها، سطح مجوزها، و ویژگیهای اجرایی در سطح سیستمعامل داشته باشید. این ویژگیها به شما کمک میکنند تا امنیت Pods و Containers را بهبود بخشید و از هرگونه تهدید احتمالی جلوگیری کنید. تنظیمات مختلف مانند runAsUser، allowPrivilegeEscalation و privileged میتوانند مطابق با نیازهای امنیتی شما سفارشیسازی شوند و رفتار Pods را به گونهای تغییر دهند که به بهترین شکل از سیستم و دادهها محافظت شود.
محدود سازی دسترسیهای سیستم فایل (ReadOnlyRootFilesystem) سخنرانی
توضیحات کامل
1. مفهوم ReadOnlyRootFilesystem
ReadOnlyRootFilesystem یک تنظیم در SecurityContext است که به شما این امکان را میدهد که سیستمفایل ریشه در داخل Container فقط بهصورت خواندنی (read-only) در دسترس باشد. زمانی که این تنظیم فعال باشد، هیچگونه تغییراتی نمیتواند در سیستمفایل ریشه انجام شود. این ویژگی در مواقعی که به دنبال کاهش ریسک آسیبپذیریهای امنیتی و جلوگیری از تغییرات غیرمجاز در سیستمفایل هستید، بسیار مفید است.
2. فعالسازی ReadOnlyRootFilesystem
برای فعالسازی ReadOnlyRootFilesystem در سطح Pod یا Container، میتوانید از بخش securityContext در فایل YAML استفاده کنید. اگر بخواهید این تنظیمات را برای کل Pod یا فقط برای یک Container خاص اعمال کنید، میتوانید آن را بهطور جداگانه تنظیم کنید.
1. تنظیم برای کل Pod
در صورتی که بخواهید این تنظیم برای تمام Containers داخل Pod اعمال شود، باید آن را در بخش spec.securityContext در فایل YAML تعریف کنید.
apiVersion: v1
kind: Pod
metadata:
name: readonly-pod
spec:
securityContext:
readOnlyRootFilesystem: true
containers:
- name: example-container
image: example-image
در اینجا:
readOnlyRootFilesystem: true
در بخش securityContext Pod قرار داده شده است. این بدان معنی است که تمامی Containers داخل این Pod نمیتوانند تغییراتی در سیستمفایل ریشه ایجاد کنند.
2. تنظیم برای یک Container خاص
اگر بخواهید این تنظیمات فقط برای یک Container خاص اعمال شود، میتوانید آن را در بخش securityContext هر Container در فایل YAML قرار دهید.
apiVersion: v1
kind: Pod
metadata:
name: readonly-container-pod
spec:
containers:
- name: example-container
image: example-image
securityContext:
readOnlyRootFilesystem: true
در اینجا:
readOnlyRootFilesystem: true
فقط برای Container خاص example-container اعمال میشود. به این ترتیب، فقط این Container در داخل Pod سیستمفایل ریشه خود را بهصورت خواندنی میکند.
3. مزایای استفاده از ReadOnlyRootFilesystem
استفاده از ReadOnlyRootFilesystem در Kubernetes میتواند مزایای زیادی داشته باشد:
- کاهش خطر تغییرات ناخواسته: وقتی که سیستمفایل ریشه بهصورت فقطخواندنی تنظیم میشود، هیچگونه تغییراتی نمیتواند در آن اعمال شود. این به جلوگیری از تغییرات غیرمجاز یا بدافزارهای احتمالی کمک میکند.
- افزایش امنیت: این تنظیم میتواند به کاهش آسیبپذیریها و محافظت از فایلهای حیاتی سیستم کمک کند. حتی اگر یک مهاجم به Container نفوذ کند، به دلیل محدودیتهای سیستمفایلی نمیتواند به راحتی سیستمفایل ریشه را تغییر دهد.
- مؤثر در جلوگیری از حملات Rootkit: یکی از انواع حملات، Rootkitها هستند که به مهاجم اجازه میدهند سیستم را کنترل کنند. با استفاده از این ویژگی، امکان تغییر سیستمفایلها برای نصب Rootkitها غیرممکن میشود.
4. محدودیتها و چالشها
هرچند استفاده از ReadOnlyRootFilesystem یک ابزار امنیتی مفید است، اما باید در نظر داشت که این ویژگی ممکن است محدودیتهایی را نیز برای برخی از برنامهها و Containers ایجاد کند. برخی از برنامهها ممکن است نیاز به نوشتن دادهها در سیستمفایل ریشه داشته باشند، که در این صورت استفاده از این تنظیم ممکن است باعث ایجاد مشکلاتی شود.
بهعنوان مثال:
- حجمهای (Volumes): اگر یک Container به فایلهایی نیاز دارد که باید در سیستمفایل ریشه ذخیره شود، باید مطمئن شوید که این فایلها در Volumeهایی ذخیره شوند که بهصورت جداگانه و با تنظیمات نوشتنی (read-write) پیکربندی شدهاند.
- ایجاد دادههای موقتی: برخی برنامهها برای ذخیره دادههای موقتی نیاز به نوشتن در سیستمفایل دارند، بنابراین باید از Volumes یا مسیرهایی استفاده کرد که در خارج از سیستمفایل ریشه قرار دارند.
5. استفاده از Volumeهای جداگانه برای ذخیره دادهها
در صورت استفاده از ReadOnlyRootFilesystem، معمولاً از Volumes برای ذخیره دادههای قابل نوشتن استفاده میشود. برای این کار، میتوانید از نوع Volumeهایی مثل emptyDir، hostPath، یا persistentVolumeClaim استفاده کنید.
مثال زیر نشان میدهد که چگونه میتوان یک Volume قابل نوشتن را برای ذخیره دادهها در کنار ReadOnlyRootFilesystem تنظیم کرد:
apiVersion: v1
kind: Pod
metadata:
name: readonly-container-with-volume
spec:
securityContext:
readOnlyRootFilesystem: true
volumes:
- name: data-volume
emptyDir: {}
containers:
- name: example-container
image: example-image
volumeMounts:
- name: data-volume
mountPath: /data
در این مثال:
readOnlyRootFilesystem: true
تنظیم شده است تا سیستمفایل ریشه فقط خواندنی باشد.emptyDir
برای Volume استفاده میشود که دادهها در آن ذخیره میشود و امکان نوشتن در آن وجود دارد.mountPath: /data
به Container اعلام میکند که این Volume باید در مسیر/data
سیستمفایل داخل Container قرار گیرد.
6. بررسی وضعیت تنظیمات
برای بررسی وضعیت ReadOnlyRootFilesystem یک Pod یا Container، میتوانید از دستور kubectl
استفاده کنید. این دستور به شما کمک میکند که مشخص کنید آیا تنظیمات امنیتی به درستی اعمال شدهاند یا خیر.
برای مشاهده تنظیمات Podها و Containers:
kubectl get pod readonly-pod -o yaml
این دستور اطلاعات مربوط به Pod مورد نظر را بهصورت YAML نمایش میدهد و میتوانید بررسی کنید که تنظیمات readOnlyRootFilesystem به درستی اعمال شده است یا خیر.
جمع بندی
استفاده از ReadOnlyRootFilesystem در Kubernetes یک روش مؤثر برای افزایش امنیت Containers است. با این تنظیم، سیستمفایل ریشه بهصورت خواندنی میشود و از تغییرات غیرمجاز جلوگیری میشود. با این حال، باید توجه داشته باشید که برخی از Containers ممکن است به دسترسی نوشتن به سیستمفایل نیاز داشته باشند. در این موارد، میتوان از Volumes جداگانه برای ذخیره دادههای قابل نوشتن استفاده کرد. این تنظیم نه تنها از حملات و تغییرات ناخواسته جلوگیری میکند بلکه به بهبود امنیت سیستم و دادهها نیز کمک میکند.
اجرای کانتینرها با کاربرهای غیر ریشه (Non-Root Users) سخنرانی
توضیحات کامل
1. مفهوم اجرای کانتینرها با کاربرهای غیر ریشه
اجرای کانتینرها با کاربرهای غیر ریشه به این معناست که کانتینرهای شما بدون استفاده از دسترسیهای ریشه اجرا میشوند و معمولاً با یک کاربر خاص با دسترسی محدود به سیستمفایلهای کانتینر اجرا خواهند شد. این رویکرد از دسترسیهای غیرمجاز به منابع حساس و حملات احتمالی جلوگیری میکند و به شما این اطمینان را میدهد که اگر مهاجمی بهطور موفقیتآمیز وارد کانتینر شود، دسترسیهای محدودی خواهد داشت.
2. تنظیمات برای اجرای کانتینرها با کاربر غیر ریشه
برای اطمینان از اجرای کانتینرها با کاربرهای غیر ریشه، باید تنظیمات securityContext را در فایل YAML کانتینر یا Pod خود پیکربندی کنید. در این تنظیمات، شما میتوانید کاربر و گروه خاصی را برای کانتینر تعریف کنید.
1. استفاده از تنظیمات runAsUser
و runAsGroup
با استفاده از runAsUser میتوانیم کاربر خاصی را برای اجرای کانتینر مشخص کنیم. همچنین، از runAsGroup برای تنظیم گروه خاص برای کانتینر استفاده میشود.
در مثال زیر، کانتینر با شناسه کاربری 1001 و گروه 1001 اجرا میشود:
apiVersion: v1
kind: Pod
metadata:
name: non-root-pod
spec:
containers:
- name: non-root-container
image: example-image
securityContext:
runAsUser: 1001
runAsGroup: 1001
allowPrivilegeEscalation: false
در اینجا:
runAsUser: 1001
مشخص میکند که کانتینر باید با کاربر ID (UID) 1001 اجرا شود.runAsGroup: 1001
به کانتینر اعلام میکند که گروه ID (GID) 1001 باید برای این کانتینر استفاده شود.allowPrivilegeEscalation: false
مشخص میکند که کانتینر اجازه ارتقاء امتیازات (privilege escalation) را ندارد.
2. استفاده از تنظیمات runAsNonRoot
برای اطمینان از اینکه کانتینر حتماً با کاربر غیر ریشه اجرا میشود، میتوانیم از تنظیم runAsNonRoot استفاده کنیم. این تنظیم اطمینان میدهد که کانتینر نمیتواند بهعنوان کاربر ریشه اجرا شود.
apiVersion: v1
kind: Pod
metadata:
name: non-root-pod
spec:
containers:
- name: non-root-container
image: example-image
securityContext:
runAsNonRoot: true
runAsUser: 1001
runAsGroup: 1001
در اینجا:
runAsNonRoot: true
این اطمینان را میدهد که کانتینر تنها با یک کاربر غیر ریشه اجرا میشود. اگر runAsUser بهطور پیشفرض به کاربر ریشه (UID 0) تنظیم شده باشد، Kubernetes کانتینر را نمیسازد.
3. مزایای اجرای کانتینرها با کاربرهای غیر ریشه
اجرای کانتینرها با کاربرهای غیر ریشه مزایای قابل توجهی دارد:
- کاهش آسیبپذیریها: اگر یک مهاجم موفق به نفوذ به یک کانتینر شود، دسترسیهای او محدود به کاربر غیر ریشه خواهد بود. این بدان معناست که او نمیتواند تغییرات عمدهای در سیستم ایجاد کند یا به منابع حساس دسترسی داشته باشد.
- محافظت در برابر حملات Rootkit: اجرای کانتینرها بهعنوان کاربر غیر ریشه به کاهش احتمال نصب بدافزارهای سطح ریشه (Rootkit) کمک میکند. حتی اگر مهاجم به کانتینر دسترسی پیدا کند، نمیتواند به سطح ریشه دست یابد.
- مطابقت با بهترین شیوههای امنیتی: اجرای کانتینرها با کاربرهای غیر ریشه بخشی از بهترین شیوههای امنیتی است که توسط استانداردهای مختلف مانند CIS Benchmarks توصیه شده است.
4. چالشها و محدودیتها
اگرچه اجرای کانتینرها با کاربرهای غیر ریشه میتواند امنیت را افزایش دهد، اما در برخی مواقع ممکن است باعث بروز مشکلاتی در اجرای برنامهها و سرویسها شود:
- نیاز به دسترسی نوشتن در سیستمفایل: برخی از برنامهها بهطور پیشفرض به دسترسیهای نوشتنی در دایرکتوریهای خاص سیستمفایل نیاز دارند. در این صورت، باید مطمئن شوید که این دسترسیها بهطور صحیح تنظیم شدهاند.
- توافق با برخی ابزارها یا اپلیکیشنها: بعضی از ابزارها و اپلیکیشنها ممکن است انتظار داشته باشند که کانتینرها با کاربر ریشه اجرا شوند. در چنین مواردی، باید از راهحلهای خاص مانند تنظیمات Volumes استفاده کنید.
5. بررسی وضعیت اجرای کانتینر با کاربر غیر ریشه
برای بررسی وضعیت کانتینر و تایید اینکه آیا کانتینر با کاربر غیر ریشه اجرا میشود، میتوانید از دستور زیر استفاده کنید:
kubectl get pod non-root-pod -o yaml
این دستور اطلاعات مربوط به Pod را نمایش میدهد. در بخش securityContext باید اطمینان حاصل کنید که تنظیمات runAsUser و runAsNonRoot بهدرستی اعمال شده است.
جمع بندی
اجرای کانتینرها با کاربرهای غیر ریشه یکی از اقدامات امنیتی حیاتی در Kubernetes است. این کار به شما این اطمینان را میدهد که حتی در صورت نفوذ یک مهاجم به کانتینر، او نمیتواند دسترسیهای ریشه را بهدست آورد و تغییرات غیرمجاز در سیستم اعمال کند. با استفاده از تنظیمات securityContext مانند runAsUser، runAsGroup و runAsNonRoot میتوانید کانتینرهای خود را با کاربران غیر ریشه اجرا کرده و امنیت سیستمهای خود را بهطور قابلتوجهی افزایش دهید.
تنظیم قابلیتهای Linux (Linux Capabilities) برای محدود سازی دسترسی سخنرانی
توضیحات کامل
این تنظیمات میتواند بهطور قابلتوجهی به امنیت سیستم کمک کند، زیرا از اعطای دسترسیهای غیرضروری به کانتینرها و فرایندهای در حال اجرا جلوگیری میشود و حتی در صورت نفوذ به کانتینر، دسترسیهای غیرمجاز به منابع سیستم محدود میگردد.
1. مفهوم Linux Capabilities
در لینوکس، بهطور پیشفرض، فرایندها برای انجام اکثر عملیاتها نیاز به دسترسی ریشه دارند. اما Linux Capabilities این امکان را فراهم میکنند که این دسترسیها به قسمتهای خاص سیستمعامل برای فرایندهای مختلف تقسیم شوند. به این ترتیب، به جای اعطای دسترسی ریشه (UID 0)، میتوانیم به فرایندها فقط قابلیتهایی را بدهیم که برای عملکرد آنها ضروری است.
این قابلیتها به فرایندها این امکان را میدهند که تنها برخی عملیاتهای خاص را انجام دهند، مانند دسترسی به شبکه یا تنظیم قوانین فایروال، بدون اینکه به دسترسی ریشه نیاز باشد.
2. تنظیم Linux Capabilities در Kubernetes
در Kubernetes، میتوانیم از securityContext در پیکربندی Pod یا Container استفاده کنیم تا قابلیتهای خاص لینوکس را برای کانتینرها تنظیم کنیم. این تنظیمات از طریق مشخص کردن capabilities انجام میشود.
برای تنظیم قابلیتها در Kubernetes، باید از دو ویژگی اصلی استفاده کنیم:
- add: برای افزودن قابلیتهای جدید به کانتینر.
- drop: برای حذف قابلیتهای غیرضروری از کانتینر.
مثال 1: اضافه کردن قابلیتهای خاص به یک کانتینر
در مثال زیر، قابلیت NET_ADMIN که به فرایندها اجازه تغییر تنظیمات شبکه را میدهد، به کانتینر اضافه میشود.
apiVersion: v1
kind: Pod
metadata:
name: pod-with-capabilities
spec:
containers:
- name: container-with-capabilities
image: example-image
securityContext:
capabilities:
add:
- NET_ADMIN
در اینجا:
- add به کانتینر این امکان را میدهد که قابلیت NET_ADMIN را به دست آورد و بهطور خاص تنظیمات شبکه را تغییر دهد.
مثال 2: حذف قابلیتهای خاص از یک کانتینر
در این مثال، قابلیت CHOWN که به فرایندها اجازه تغییر مالکیت فایلها را میدهد، از کانتینر حذف میشود.
apiVersion: v1
kind: Pod
metadata:
name: pod-without-capabilities
spec:
containers:
- name: container-without-capabilities
image: example-image
securityContext:
capabilities:
drop:
- CHOWN
در اینجا:
- drop برای حذف قابلیت CHOWN استفاده میشود، که به این معنی است که کانتینر قادر به تغییر مالکیت فایلها نخواهد بود.
3. استفاده از Linux Capabilities برای محدودسازی دسترسی
با استفاده از Linux Capabilities، میتوانیم بهطور دقیقتر و جزئیتر دسترسیهای مختلف به منابع سیستم را محدود کنیم. بهطور مثال، بهجای این که اجازه بدهیم کانتینر بهطور کامل به تنظیمات شبکه، دسترسی ریشه، یا فرایندهای حساس دسترسی داشته باشد، میتوانیم فقط قابلیتهای ضروری را اضافه کنیم.
برخی از قابلیتهای معمولی لینوکس که میتوان در Kubernetes استفاده کرد عبارتند از:
- NET_ADMIN: به کانتینر این اجازه را میدهد که تنظیمات شبکه را تغییر دهد.
- SYS_TIME: به کانتینر این امکان را میدهد که زمان سیستم را تغییر دهد.
- CHOWN: به کانتینر این اجازه را میدهد که مالکیت فایلها را تغییر دهد.
- DAC_OVERRIDE: به کانتینر این امکان را میدهد که از دسترسیهای کنترل شده سیستمفایل عبور کند.
- SETUID: به کانتینر این اجازه را میدهد که شناسه کاربری (UID) خود را تغییر دهد.
با افزودن یا حذف این قابلیتها، میتوانیم دسترسیهای کانتینر را دقیقا طبق نیاز برنامه تنظیم کنیم.
4. بررسی وضعیت قابلیتها
برای بررسی اینکه چه قابلیتهایی به یک کانتینر اختصاص داده شدهاند، میتوانید از دستور kubectl describe
استفاده کنید:
kubectl describe pod <pod-name>
این دستور اطلاعاتی در مورد Pod و کانتینرها شامل securityContext و قابلیتهای تنظیمشده نمایش میدهد.
5. مزایای استفاده از Linux Capabilities
استفاده از Linux Capabilities برای محدودسازی دسترسیها مزایای زیادی دارد:
- کاهش سطح حمله: با حذف قابلیتهای غیرضروری از کانتینرها، حملات بهطور قابلتوجهی کاهش مییابند.
- کاهش نیاز به دسترسی ریشه: بهجای اعطای دسترسی ریشه به کانتینرها، میتوان فقط قابلیتهای خاص و ضروری را تنظیم کرد که این باعث امنیت بیشتر میشود.
- استفاده بهینه از منابع: با استفاده از Linux Capabilities میتوانیم دقیقاً مشخص کنیم که هر کانتینر چه قابلیتهایی نیاز دارد و از تخصیص منابع بهطور غیرضروری جلوگیری کنیم.
جمع بندی
تنظیم قابلیتهای لینوکس (Linux Capabilities) در Kubernetes ابزار مهمی برای افزایش امنیت کانتینرها و محدودسازی دسترسیها است. با استفاده از تنظیمات securityContext در Kubernetes، میتوانیم بهطور دقیق مشخص کنیم که کدام قابلیتهای سیستمی برای هر کانتینر ضروری هستند و از اعطای دسترسیهای اضافی جلوگیری کنیم. این رویکرد به کاهش خطرات امنیتی و محافظت از سیستم در برابر تهدیدات مختلف کمک میکند.
Pod Security Standards (PSS):
معرفی استانداردهای امنیتی Pod سخنرانی
توضیحات کامل
در این بخش، به معرفی استانداردهای امنیتی مهم برای Pods خواهیم پرداخت که باید برای ایمنسازی محیط Kubernetes رعایت شوند. رعایت این استانداردها میتواند به بهبود امنیت محیط و کاهش ریسکهای موجود در سیستم کمک کند.
1. اجرای کانتینرها با کاربران غیر ریشه
یکی از مهمترین استانداردهای امنیتی، اجرای کانتینرها با کاربر غیر ریشه است. همانطور که قبلاً ذکر شد، استفاده از کاربر ریشه (root) در کانتینرها میتواند خطرات امنیتی به همراه داشته باشد. بهطور کلی، استفاده از کاربران غیر ریشه (Non-Root) در کانتینرها برای به حداقل رساندن ریسکهای امنیتی ضروری است.
برای اطمینان از اجرای کانتینرها با کاربر غیر ریشه، میتوان از تنظیمات runAsUser
و runAsNonRoot
در securityContext
استفاده کرد.
apiVersion: v1
kind: Pod
metadata:
name: non-root-pod
spec:
containers:
- name: non-root-container
image: example-image
securityContext:
runAsUser: 1000
runAsNonRoot: true
این پیکربندی تضمین میکند که کانتینر تحت کاربر غیر ریشه اجرا شود و در صورتی که شناسه کاربری ریشه (UID 0) باشد، کانتینر اجرا نخواهد شد.
2. محدود کردن دسترسی به سیستمفایلها (Read-Only Root FileSystem)
یکی دیگر از استانداردهای امنیتی مهم، استفاده از سیستمفایل فقط خواندنی (Read-Only Root FileSystem) برای کانتینرها است. با این کار، حتی اگر یک حمله موفق به کانتینر وارد شود، مهاجم نمیتواند به سیستمفایلهای کانتینر تغییرات وارد کند.
برای تنظیم این ویژگی، میتوان از گزینه readOnlyRootFilesystem
در securityContext
استفاده کرد.
apiVersion: v1
kind: Pod
metadata:
name: readonly-pod
spec:
containers:
- name: readonly-container
image: example-image
securityContext:
readOnlyRootFilesystem: true
این پیکربندی باعث میشود که سیستمفایل ریشه کانتینر فقط بهصورت خواندنی قابلدسترس باشد.
3. استفاده از Network Policies
Network Policies یکی دیگر از استانداردهای امنیتی Pods است که به شما این امکان را میدهد که دسترسی شبکه بین Pods مختلف را کنترل کنید. با استفاده از Network Policies، میتوان ترافیک ورودی و خروجی Pods را محدود کرده و اجازه بدهیم فقط Pods معین قادر به برقراری ارتباط با یکدیگر باشند.
برای ایجاد یک Network Policy، میتوان از ساختار YAML مشابه زیر استفاده کرد:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
در این مثال:
- ترافیک ورودی (ingress) فقط از Pods با برچسب
app: frontend
به Pods با برچسبapp: backend
اجازه داده میشود. - سایر ترافیکهای ورودی به Pods با برچسب
app: backend
مسدود میشوند.
4. استفاده از Pod Security Policies (PSP)
Pod Security Policies (PSP) یکی دیگر از ابزارهای امنیتی Kubernetes است که به شما این امکان را میدهد که قوانین امنیتی برای Pods تعریف کنید. PSP امکان کنترل تنظیمات امنیتی مانند استفاده از کاربران غیر ریشه، قابلیتهای لینوکس، محدودیتهای سیستمفایل و موارد دیگر را فراهم میآورد.
در اینجا یک مثال ساده از تعریف یک PSP برای اجازه دادن به اجرای کانتینرها با کاربر غیر ریشه آورده شده است:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-psp
spec:
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- 'emptyDir'
- 'configMap'
در این مثال:
- تنظیم
runAsUser: MustRunAsNonRoot
بهوضوح میگوید که فقط کاربران غیر ریشه میتوانند کانتینرها را اجرا کنند. - محدودیتهایی برای انواع مختلف Volumeها مانند
emptyDir
وconfigMap
نیز تعیین شده است.
5. محدودسازی قابلیتهای لینوکس (Linux Capabilities)
یکی از استانداردهای امنیتی مهم، محدودسازی قابلیتهای لینوکس برای هر کانتینر است. لینوکس برای هر فرایند مجموعهای از قابلیتها (Capabilities) را تعریف کرده است که به آن اجازه میدهد تا دسترسی خاصی به سیستمعامل پیدا کند. برای مثال، یک فرایند میتواند دسترسی به تغییر زمان سیستم یا تغییرات در تنظیمات شبکه داشته باشد.
در Kubernetes، میتوانیم با استفاده از securityContext
، قابلیتهای لینوکس را برای هر کانتینر محدود کنیم.
apiVersion: v1
kind: Pod
metadata:
name: pod-with-limited-capabilities
spec:
containers:
- name: container-with-limited-caps
image: example-image
securityContext:
capabilities:
drop:
- ALL
در اینجا، با استفاده از گزینه drop: ALL
تمام قابلیتهای لینوکس برای کانتینر غیرفعال میشوند، بهجز آنهایی که بهطور خاص اجازه داده شدهاند.
6. محدود کردن منابع و استفاده از Resource Requests & Limits
یکی از شیوههای امنیتی در Kubernetes، محدود کردن منابع مورد استفاده کانتینرها است. تنظیمات requests
و limits
به Kubernetes این امکان را میدهند که منابع مورد نیاز برای کانتینرها را مشخص کرده و محدود کند.
apiVersion: v1
kind: Pod
metadata:
name: pod-with-resource-limits
spec:
containers:
- name: container-with-limits
image: example-image
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
در اینجا:
- requests: میزان حداقل منابع مورد نیاز کانتینر را مشخص میکند.
- limits: بیشترین میزان منابعی که کانتینر میتواند استفاده کند را محدود میکند.
این محدودسازی به جلوگیری از استفاده بیرویه منابع توسط کانتینرها کمک میکند و از بروز مشکلات بهویژه در شرایطی که منابع محدود هستند، جلوگیری میکند.
جمع بندی
رعایت استانداردهای امنیتی برای Pods در Kubernetes یکی از گامهای حیاتی در ایمنسازی زیرساختهای کانتینری است. اجرای کانتینرها با کاربران غیر ریشه، محدودسازی دسترسی به سیستمفایلها، استفاده از Network Policies، اعمال Pod Security Policies، محدودسازی قابلیتهای لینوکس و تنظیمات منابع، همگی از استانداردهای کلیدی امنیتی هستند که میتوانند بهطور قابلتوجهی امنیت محیط Kubernetes را افزایش دهند. این استانداردها باعث کاهش ریسکهای امنیتی، ارتقاء ایمنی سیستمها و جلوگیری از حملات و نفوذهای احتمالی خواهند شد.
استفاده از PodSecurityPolicy (Deprecated) و جایگزینهای آن سخنرانی
توضیحات کامل
ویژگیهای PodSecurityPolicy (PSP)
PodSecurityPolicy مجموعهای از سیاستهای امنیتی را برای کنترل رفتار Pods در Kubernetes تعیین میکند. این سیاستها به طور خاص برای افزایش امنیت در سطح Pod و جلوگیری از دسترسیهای غیرمجاز به منابع سیستم طراحی شدهاند. برخی از قابلیتهای PSP عبارتاند از:
- اجازه استفاده از کاربر ریشه (Root User): شما میتوانید مشخص کنید که Pods میتوانند بهطور غیرمستقیم یا مستقیم از کاربر ریشه استفاده کنند یا خیر.
- محدودیتهای Mount کردن فایل سیستم: با استفاده از PSP میتوانید دسترسی به برخی از پوشههای سیستمی مثل
/proc
یا/dev
را محدود کنید. - محدود کردن Capabilities: PodSecurityPolicy به شما این امکان را میدهد که قابلیتهای خاص سیستم عامل را برای Pods محدود کنید.
- اجازه دادن به privilege escalation: شما میتوانید مانع از privilege escalation در Pods شوید و یا تنظیم کنید که این قابلیت بهطور محدود فعال باشد.
مشکلات و محدودیتهای PodSecurityPolicy
با وجود اینکه PodSecurityPolicy ابزار مفیدی برای مدیریت امنیت در Kubernetes بود، مشکلاتی نیز داشت که باعث شده استفاده از آن به طور گستردهتری در نظر گرفته نشود:
- پیچیدگی و انعطافپذیری محدود: تنظیمات PSP نسبتاً پیچیده بودند و در برخی موارد نمیتوانستند نیازهای پیچیده امنیتی را بهطور کامل پوشش دهند.
- مدیریت Policyها: تنظیم و مدیریت Policyهای پیچیده برای Pods در بسیاری از موارد دشوار و زمانبر بود.
- عدم توانایی در مدیریت سطوح مختلف امنیتی: برخی از سیاستهای امنیتی که کاربران درخواست میکردند، بهطور پیشفرض در PSP وجود نداشتند و باید آنها را به صورت دستی و پیچیده پیادهسازی میکردند.
جایگزینهای PodSecurityPolicy
با توجه به اینکه PodSecurityPolicy بهطور رسمی در نسخه 1.21 Kubernetes deprecated شده و از نسخههای بعدی حذف خواهد شد، Kubernetes تیمهایی را برای توسعه جایگزینهای جدید معرفی کرده است که بهطور بهتری میتوانند امنیت Pods را مدیریت کنند.
1. PodSecurity Admission (PSA)
یک جایگزین اصلی برای PodSecurityPolicy، PodSecurity Admission است که از نسخه 1.22 Kubernetes به عنوان یک feature آزمایشی ارائه شد. PodSecurity Admission بهطور خاص برای جایگزینی PSP طراحی شده است و به شما امکان میدهد تا سیاستهای امنیتی را برای Pods بهراحتی پیادهسازی کنید.
ویژگیهای PodSecurity Admission:
- پیکربندی بر اساس سطح امنیتی: شما میتوانید Pods را بر اساس سطح امنیتی به سه سطح مختلف تقسیم کنید:
privileged
: دسترسی به تمام قابلیتها و منابع.baseline
: حداقل نیازمندیهای امنیتی.restricted
: محدودیتهای شدید امنیتی.
- پیکربندی بهصورت Namespace: PodSecurity Admission به شما این امکان را میدهد که سیاستهای امنیتی را بهطور خاص برای هر Namespace تنظیم کنید.
یک مثال از پیکربندی PodSecurity Admission برای یک Namespace به شکل زیر است:
apiVersion: policy/v1
kind: PodSecurity
metadata:
name: pod-security-policy
namespace: default
spec:
enforce: baseline
enforceVersion: v1.22.0
audit: restricted
auditVersion: v1.22.0
warn: privileged
warnVersion: v1.22.0
این پیکربندی نشان میدهد که در این Namespace از سیاست baseline برای اعمال محدودیتها استفاده میشود، در حالی که برای گزارش وضعیت Pods از سطح restricted استفاده میکند.
2. OPA Gatekeeper
یکی دیگر از جایگزینهای محبوب برای PodSecurityPolicy، استفاده از OPA Gatekeeper است. OPA (Open Policy Agent) Gatekeeper یک پروژه متنباز است که به شما این امکان را میدهد که سیاستهای Kubernetes را با استفاده از زبان Rego تعریف کنید.
ویژگیهای OPA Gatekeeper:
- پشتیبانی از سیاستهای پیچیدهتر: OPA Gatekeeper به شما امکان میدهد تا سیاستهای امنیتی پیچیدهتری را ایجاد و مدیریت کنید که دقیقاً متناسب با نیازهای خاص شما باشند.
- چک کردن وضعیت: این ابزار میتواند به طور مداوم وضعیت Pods و منابع دیگر را بررسی کرده و مطمئن شود که آنها با سیاستهای تعیینشده مطابقت دارند.
- قابلیت استفاده از Auditing: OPA Gatekeeper قابلیت auditing را فراهم میکند تا بتوانید بررسی کنید که آیا سیاستها بهطور صحیح اعمال میشوند یا خیر.
یک مثال از پیکربندی OPA Gatekeeper برای محدود کردن Pods از کاربر ریشه (Root User) به شکل زیر است:
apiVersion: admission.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: opa-gatekeeper
webhooks:
- name: policy.example.com
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
clientConfig:
service:
name: opa-gatekeeper
namespace: default
path: "/v1/admit"
caBundle: <CA_BUNDLE>
3. Kubernetes PodSecurity Policies (PSP) through Third-Party Solutions
در برخی موارد، ممکن است شما بخواهید از راهحلهای شخص ثالث برای مدیریت PodSecurity استفاده کنید. ابزارهایی مانند Calico یا Cilium میتوانند به شما کمک کنند تا سیاستهای امنیتی مورد نیاز خود را پیادهسازی کنید.
جمع بندی
PodSecurityPolicy به عنوان یک ابزار امنیتی مهم در Kubernetes برای مدیریت امنیت Pods، بهطور رسمی به حالت deprecated درآمده و در آینده حذف خواهد شد. از آنجا که Kubernetes به سمت استانداردهای جدیدتری حرکت کرده است، PodSecurity Admission و OPA Gatekeeper بهعنوان جایگزینهای اصلی PSP مطرح شدهاند. استفاده از این ابزارها امکان مدیریت دقیقتر و بهینهتر سیاستهای امنیتی برای Pods را فراهم میکند. از آنجا که این ابزارها انعطافپذیری بیشتری دارند، بهراحتی میتوانید سیاستهای امنیتی خود را به طور دقیقتری پیادهسازی و مدیریت کنید.
فصل 3. پیکربندی و استفاده از Network Policies
تعریف Network Policies برای محدود کردن ترافیک ورودی و خروجی سخنرانی
توضیحات کامل
اصول اولیه Network Policies در Kubernetes
Network Policies بهطور پیشفرض در Kubernetes غیرفعال هستند و برای استفاده از آنها باید CNI Plugin (مانند Calico یا Cilium) نصب و پیکربندی شود که از Network Policies پشتیبانی میکند.
یک Network Policy معمولاً شامل سه بخش اصلی است:
- تعریف قوانین ترافیک ورودی (Ingress)
- تعریف قوانین ترافیک خروجی (Egress)
- پیکربندی Selectorها برای تعیین Pods هدف
بخشهای مختلف یک Network Policy
یک Network Policy معمولاً شامل بخشهای زیر است:
- metadata:
name
: نامی که برای سیاست تعریف میشود.namespace
: namespaceای که سیاست برای آن اعمال میشود.
- spec:
podSelector
: Pods که این سیاست روی آنها اعمال میشود. میتوانید از label selectors برای انتخاب Pods استفاده کنید.ingress
: تنظیمات ترافیک ورودی برای Pods.egress
: تنظیمات ترافیک خروجی برای Pods.
نحوه تعریف Network Policy
در اینجا یک نمونه ساده از Network Policy برای محدود کردن ترافیک ورودی و خروجی آورده شده است.
1. محدود کردن ترافیک ورودی (Ingress) به یک Pod خاص
فرض کنید میخواهید فقط Pods با لیبل خاصی اجازه دسترسی به یک Pod خاص داشته باشند.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx-ingress
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
در این مثال:
- این Network Policy ترافیک ورودی به Pods با لیبل
app: nginx
را محدود میکند. - فقط Pods با لیبل
app: frontend
قادر خواهند بود به Pods با لیبلapp: nginx
دسترسی پیدا کنند.
2. محدود کردن ترافیک خروجی (Egress) از یک Pod خاص
حال فرض کنید میخواهید ترافیک خروجی از یک Pod خاص را محدود کنید.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-nginx-egress
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
egress:
- to:
- podSelector:
matchLabels:
app: backend
در این مثال:
- این Network Policy ترافیک خروجی از Pods با لیبل
app: nginx
را محدود میکند. - تنها Pods با لیبل
app: backend
میتوانند مقصد ترافیک خروجی Podsnginx
باشند.
3. استفاده از کدهای IP برای محدود کردن ترافیک
ممکن است بخواهید به جای استفاده از لیبلهای Pods، از آدرسهای IP برای محدود کردن ترافیک استفاده کنید. در اینجا نمونهای برای اعمال محدودیتهای ترافیکی مبتنی بر IP آورده شده است.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-ip
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
در این مثال:
- ترافیک ورودی به Pods با لیبل
app: nginx
فقط از IPهای موجود در شبکه192.168.1.0/24
مجاز است.
4. مسدود کردن تمامی ترافیکها به جز موارد خاص
اگر بخواهید دسترسی به Pods خاصی را کاملاً محدود کنید به طوری که هیچ ترافیکی به جز موارد مشخصشده پذیرفته نشود، میتوانید سیاست زیر را اعمال کنید:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
ingress: []
egress: []
در این مثال:
- هیچ ترافیک ورودی یا خروجی برای Pods در این سیاست مجاز نیست مگر اینکه سیاستهای دیگری برای ترافیک مشخص شده باشند.
ایجاد و اعمال Network Policies
برای ایجاد یک Network Policy، شما ابتدا باید فایل YAML مربوط به سیاست را بنویسید و سپس با استفاده از دستور kubectl apply
آن را به Kubernetes اعمال کنید. برای مثال:
kubectl apply -f network-policy.yaml
برای مشاهده وضعیت اعمال شدهتان نیز میتوانید از دستور زیر استفاده کنید:
kubectl get networkpolicy
نکات مهم در استفاده از Network Policies
- پشتیبانی CNI Plugin: برای استفاده از Network Policies، باید از یک CNI plugin پشتیبانیکننده مثل Calico یا Cilium استفاده کنید.
- پیشفرضها: به طور پیشفرض، هیچ Network Policy در Kubernetes اعمال نمیشود و همه Pods بهطور آزادانه میتوانند با یکدیگر ارتباط برقرار کنند. باید خودتان سیاستهای امنیتی مورد نظر را تنظیم کنید.
- محدود کردن ترافیک با PodSelector: با استفاده از
podSelector
میتوانید سیاست را برای Pods خاصی تنظیم کنید و فقط ترافیک به آن Pods را محدود کنید. - یادآوری قانون “Stateful”: Network Policies در Kubernetes به صورت “Stateless” عمل میکنند. یعنی پس از اعمال سیاستها، تمام ترافیکهای ورودی و خروجی کنترل خواهند شد و شما هیچگونه امکان ذخیرهسازی وضعیت ترافیک ندارید.
جمع بندی
Network Policies ابزار قدرتمندی برای کنترل ترافیک ورودی و خروجی در Kubernetes هستند. با استفاده از این ابزار میتوان محدودیتهایی دقیق بر اساس آدرس IP، لیبلهای Pods و قوانین پیچیدهتر برای ایمنسازی ارتباطات میان Pods در شبکه Kubernetes اعمال کرد. این ابزار به مدیران Kubernetes این امکان را میدهد که شبکهای امنتر و پایدارتر ایجاد کنند و دسترسیهای غیرمجاز را محدود کنند.
پیکربندی قوانین ترافیک بین Pods سخنرانی
توضیحات کامل
مفهوم Network Policies
Network Policies در Kubernetes برای تعریف قوانین دسترسی به شبکه در سطح Pods استفاده میشوند. این قوانین میتوانند ترافیک ورودی (Ingress) یا خروجی (Egress) را کنترل کرده و به شما این امکان را میدهند که از امنیت بیشتری برخوردار شوید. قوانین Network Policy بهطور پیشفرض در Kubernetes غیر فعال هستند و برای فعالسازی آنها نیاز به یک CNI (Container Network Interface) مانند Calico یا Cilium دارید که از Network Policies پشتیبانی کند.
اجزای یک Network Policy
یک Network Policy از چند بخش اصلی تشکیل میشود که به شما امکان میدهد قوانین مختلف را برای کنترل ترافیک بین Pods تعریف کنید:
- Pod Selector:
- به کمک این بخش، مشخص میکنید که کدام Pods باید تحت تاثیر این سیاست قرار بگیرند. میتوانید از selectorهای مختلف استفاده کنید تا Pods خاصی را هدف قرار دهید.
- Ingress:
- این بخش ترافیک ورودی به Pod را مدیریت میکند. شما میتوانید منابع خاصی را تعیین کنید که مجاز به ارسال درخواست به Pod هستند.
- Egress:
- این بخش برای کنترل ترافیک خروجی از Pod به کار میرود. میتوانید مشخص کنید که Pods به کدام منابع اجازه ارسال ترافیک را دارند.
- Ports:
- این بخش برای تعیین پورتهای مجاز استفاده میشود. به کمک آن میتوانید مشخص کنید که چه پورتهایی برای دریافت یا ارسال ترافیک در دسترس هستند.
- Policy Types:
- این بخش مشخص میکند که آیا سیاست بهطور خاص برای Ingress یا Egress اعمال خواهد شد یا برای هر دو.
نمونهای از پیکربندی Network Policy
در این مثال، یک Network Policy تعریف میشود که ترافیک ورودی به Pods را محدود به یک Namespace خاص میکند و فقط ترافیک از Pods با برچسب مشخص را مجاز میسازد.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-specific-label
spec:
podSelector:
matchLabels:
app: my-app
ingress:
- from:
- podSelector:
matchLabels:
app: trusted-app
ports:
- protocol: TCP
port: 80
policyTypes:
- Ingress
توضیحات:
- این Network Policy برای Pods با برچسب
app: my-app
اعمال میشود. - Ingress فقط از Pods با برچسب
app: trusted-app
و از پورت 80 مجاز است. - نوع سیاست Ingress است، بنابراین فقط ترافیک ورودی کنترل میشود.
مدیریت ترافیک خروجی (Egress)
اگر بخواهید ترافیک خروجی از Pods را نیز محدود کنید، میتوانید بخش egress
را به Network Policy اضافه کنید. در اینجا یک مثال از محدود کردن ترافیک خروجی به یک آدرس IP خاص آورده شده است.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-external
spec:
podSelector:
matchLabels:
app: my-app
egress:
- to:
- ipBlock:
cidr: 203.0.113.0/24
ports:
- protocol: TCP
port: 443
policyTypes:
- Egress
توضیحات:
- این سیاست به Pods با برچسب
app: my-app
اعمال میشود. - Egress فقط به آدرس IPهای درون رنج
203.0.113.0/24
و پورت 443 اجازه ارسال ترافیک میدهد. - نوع سیاست Egress است و فقط ترافیک خروجی از Pod را محدود میکند.
استفاده از Network Policy برای محدود کردن ترافیک بین Namespaces
در بسیاری از مواقع، ممکن است بخواهید ترافیک بین Namespaces مختلف را محدود کنید. بهعنوان مثال، ممکن است بخواهید اجازه دهید که Pods در Namespace A
فقط به Pods در Namespace B
دسترسی داشته باشند. در اینجا یک مثال از پیکربندی Network Policy برای محدود کردن ترافیک بین Namespaces آورده شده است.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-namespace-b-traffic
namespace: namespace-a
spec:
podSelector:
matchLabels:
app: my-app
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace-b
ports:
- protocol: TCP
port: 8080
policyTypes:
- Ingress
توضیحات:
- این Network Policy برای Pods در Namespace
namespace-a
اعمال میشود. - Ingress فقط از Pods در Namespace
namespace-b
مجاز است. - پورت 8080 مجاز است.
Policy Types
Network Policy میتواند به یکی از دو نوع زیر باشد:
- Ingress: این نوع سیاستها برای کنترل ترافیک ورودی استفاده میشود.
- Egress: این نوع سیاستها برای کنترل ترافیک خروجی استفاده میشود.
در نهایت، Policy Types میتوانند ترکیبی از هر دو باشند (یعنی هم Ingress و هم Egress).
جمع بندی
با استفاده از Network Policies در Kubernetes، میتوانید کنترل دقیقتری بر ترافیک بین Pods و منابع دیگر داشته باشید. این ابزار به شما اجازه میدهد که قوانین پیچیدهای برای مدیریت ترافیک ورودی و خروجی ایجاد کنید و به این ترتیب، سطح امنیت و کنترل در شبکه Kubernetes خود را افزایش دهید. برای استفاده مؤثر از Network Policies باید یک CNI (Container Network Interface) که از آنها پشتیبانی کند مانند Calico یا Cilium را پیادهسازی کنید.
استفاده از Labels برای مدیریت ترافیک شبکه سخنرانی
توضیحات کامل
تعریف Labels
Labels کلید-مقدار (key-value) هستند که به هر شیء Kubernetes (مثل Podها، Serviceها، ReplicaSetها، و غیره) نسبت داده میشوند. این Labels در اصل بهعنوان ابزاری برای دستهبندی و جستجو در منابع مختلف Kubernetes استفاده میشوند.
برای مثال، میتوان به هر Pod یک Label با نام app
و مقدار frontend
داد تا Pods مربوط به بخشهای مختلف برنامه بهراحتی از هم تمایز پیدا کنند.
استفاده از Labels در پیکربندی Network Policies
در Kubernetes، شما میتوانید از Labels برای ایجاد Network Policies استفاده کنید تا ترافیک ورودی و خروجی بین Pods بر اساس ویژگیهای مشترک آنها محدود شود. بهعنوان مثال، اگر بخواهید ترافیک شبکه را فقط برای Pods با Label خاصی (مثل role=backend
) محدود کنید، میتوانید از این ویژگی استفاده کنید.
مثال عملی از استفاده از Labels در Network Policies
در اینجا یک نمونه Network Policy برای محدود کردن ترافیک ورودی به Pods با Label role=frontend
آورده شده است که فقط اجازه میدهد ترافیک از Pods با Label role=backend
به آنها برسد:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-frontend
spec:
podSelector:
matchLabels:
role: frontend
ingress:
- from:
- podSelector:
matchLabels:
role: backend
policyTypes:
- Ingress
در این مثال:
podSelector
در بخشmatchLabels
Pods با Labelrole=frontend
را انتخاب میکند.- بخش
ingress
مشخص میکند که فقط Pods با Labelrole=backend
میتوانند ترافیک ورودی به Pods با Labelrole=frontend
ارسال کنند. - در نهایت،
policyTypes: Ingress
نشان میدهد که این سیاست فقط برای ترافیک ورودی اعمال میشود.
مشاهده و بررسی Labels
برای مشاهده Labels موجود در Pods میتوانید از دستور زیر استفاده کنید:
kubectl get pods --show-labels
این دستور لیستی از Pods را نمایش میدهد همراه با Labels مربوط به هرکدام.
افزودن یا تغییر Labels به Pods
برای افزودن یا تغییر Labels به یک Pod خاص، میتوانید از دستور زیر استفاده کنید:
kubectl label pods <pod-name> role=frontend
این دستور Label جدید role=frontend
را به Pod مورد نظر اضافه میکند.
جمع بندی
استفاده از Labels در Kubernetes به شما این امکان را میدهد که ترافیک شبکه را بهطور دقیقتری کنترل کنید. با ترکیب Labels و Network Policies میتوانید تعیین کنید که کدام Pods مجاز به ارسال ترافیک به دیگر Pods باشند. این امکان، بهویژه در محیطهای پیچیده و مقیاسپذیر Kubernetes، برای مدیریت امنیت شبکه و بهینهسازی ترافیک بسیار کاربردی است.
نمونهسازی یک Network Policy برای مسدود کردن ترافیک غیرمجاز سخنرانی
توضیحات کامل
شرایط مثال
فرض کنید در یک محیط Kubernetes، دو نوع Pod داریم:
- Pods که Label
role=frontend
دارند. - Pods که Label
role=backend
دارند.
ما میخواهیم ترافیک ورودی به Pods با Label role=frontend
را فقط از Pods با Label role=backend
مجاز کنیم. سایر ترافیکها باید مسدود شوند.
مثال عملی از ایجاد Network Policy
برای ایجاد این سیاست، یک Network Policy تعریف میکنیم که ترافیک ورودی به Pods با Label role=frontend
را محدود به Pods با Label role=backend
میکند و ترافیک غیرمجاز از منابع دیگر را مسدود میکند.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-frontend
spec:
podSelector:
matchLabels:
role: frontend # انتخاب Pods با Label role=frontend
ingress:
- from:
- podSelector:
matchLabels:
role: backend # فقط Pods با Label role=backend میتوانند ترافیک ورودی ارسال کنند
policyTypes:
- Ingress # فقط ترافیک ورودی را محدود میکنیم
در این مثال:
podSelector
در بخشmatchLabels
Pods با Labelrole=frontend
را انتخاب میکند. این بدین معنی است که این Network Policy فقط برای Pods با Labelrole=frontend
اعمال خواهد شد.- بخش
ingress
مشخص میکند که فقط ترافیک ورودی از Pods با Labelrole=backend
به Pods با Labelrole=frontend
مجاز است. policyTypes: Ingress
نشان میدهد که این سیاست فقط برای ترافیک ورودی اعمال میشود و ترافیک خروجی تحت تأثیر قرار نخواهد گرفت.
نحوه اعمال Network Policy
برای اعمال این Network Policy در کلاستر Kubernetes، میتوانید فایل YAML فوق را در کلاستر خود ایجاد کرده و آن را با استفاده از دستور kubectl
اعمال کنید:
- ابتدا فایل YAML را ذخیره کنید. بهعنوان مثال، فایل را به نام
allow-backend-to-frontend-policy.yaml
ذخیره کنید. - سپس، از دستور زیر برای ایجاد Network Policy استفاده کنید:
kubectl apply -f allow-backend-to-frontend-policy.yaml
بررسی و مشاهده وضعیت Network Policy
برای مشاهده Network Policy که اعمال کردهاید، میتوانید از دستور زیر استفاده کنید:
kubectl get networkpolicies
این دستور تمام Network Policies موجود در کلاستر شما را نمایش میدهد. همچنین میتوانید جزئیات بیشتری از یک Network Policy خاص را با دستور زیر مشاهده کنید:
kubectl describe networkpolicy allow-backend-to-frontend
جمع بندی
استفاده از Network Policy برای مسدود کردن ترافیک غیرمجاز یکی از بهترین روشها برای مدیریت امنیت در Kubernetes است. با استفاده از این ابزار میتوانید بهطور دقیقتری کنترل کنید که کدام منابع مجاز به ارسال یا دریافت ترافیک از Pods خاصی باشند و ترافیک غیرمجاز را بهراحتی مسدود کنید. این کار به شما این امکان را میدهد که سیاستهای امنیتی خود را بهطور مؤثر پیادهسازی کنید و امنیت کلاستر Kubernetes خود را بهبود بخشید.
فصل 4. ذخیرهسازی امن اطلاعات حساس با Secrets
Secrets در Kubernetes:
تعریف و انواع Secrets: Generic و Docker Registry سخنرانی
توضیحات کامل
Kubernetes از دو نوع Secrets پشتیبانی میکند که در این بخش به معرفی و بررسی آنها خواهیم پرداخت:
- Generic Secret
- Docker Registry Secret
1. Generic Secret
Generic Secrets رایجترین نوع Secrets در Kubernetes هستند. این نوع Secrets برای ذخیرهسازی انواع مختلف دادهها استفاده میشود، از جمله رمزهای عبور، کلیدهای API، گواهینامهها و سایر دادههای حساس. این اطلاعات میتوانند بهطور مستقیم در Kubernetes بهصورت Base64-encoded ذخیره شوند.
نحوه ایجاد Generic Secret
برای ایجاد یک Generic Secret در Kubernetes، میتوانید از دستور kubectl
استفاده کنید یا یک فایل YAML ایجاد کنید. در اینجا، بهصورت کماندی و YAML روش ایجاد یک Generic Secret را توضیح میدهیم.
- ایجاد Generic Secret با استفاده از دستور kubectl:
kubectl create secret generic my-secret \
--from-literal=username=myuser \
--from-literal=password=mypassword
در این دستور:
my-secret
نام Secret است.--from-literal
برای اضافه کردن مقادیر به Secret استفاده میشود.
- ایجاد Generic Secret با استفاده از فایل YAML:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: bXl1c2Vy # این مقدار Base64-encoded است
password: bXlwYXNzd29yZA== # این مقدار نیز Base64-encoded است
در اینجا:
data
شامل کلیدهای مخفی (مثلاًusername
وpassword
) بهصورت Base64-encoded است.type: Opaque
نشان میدهد که Secret از نوع عمومی است و هیچ نوع خاصی ندارد.
برای اعمال این Secret به کلاستر میتوانید از دستور زیر استفاده کنید:
kubectl apply -f my-secret.yaml
2. Docker Registry Secret
Docker Registry Secrets بهطور خاص برای ذخیرهسازی اطلاعات ورود به Docker Registry (مانند Docker Hub یا سایر ریجستریهای خصوصی) استفاده میشود. این نوع Secret معمولاً برای تأمین امنیت هنگام کشیدن تصاویر از Docker Registry بهکار میرود.
برای ایجاد یک Docker Registry Secret، باید از دستور kubectl create secret docker-registry
استفاده کنید و اطلاعات ورود خود به Docker Registry را وارد کنید.
نحوه ایجاد Docker Registry Secret
- ایجاد Docker Registry Secret با استفاده از دستور kubectl:
kubectl create secret docker-registry my-docker-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=myuser \
--docker-password=mypassword \
--docker-email=myemail@example.com
در این دستور:
my-docker-secret
نام Secret است.--docker-server
آدرس Docker Registry است.--docker-username
نام کاربری شما در Docker Registry.--docker-password
رمز عبور شما برای Docker Registry.--docker-email
ایمیل شما در Docker Registry.
- ایجاد Docker Registry Secret با استفاده از فایل YAML:
apiVersion: v1
kind: Secret
metadata:
name: my-docker-secret
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: <Base64-encoded Docker config file>
در اینجا:
type: kubernetes.io/dockerconfigjson
نوع Secret را مشخص میکند که برای Docker Registry است..dockerconfigjson
شامل اطلاعات رمزنگاریشده از فایل تنظیمات Docker Registry است که باید Base64-encoded شود.
برای اعمال این Docker Registry Secret به کلاستر، از دستور زیر استفاده کنید:
kubectl apply -f my-docker-secret.yaml
جمع بندی
Kubernetes از Secrets برای ذخیره اطلاعات حساس استفاده میکند که میتواند به Pods تحویل داده شود بدون اینکه این اطلاعات در معرض دید قرار بگیرد. دو نوع اصلی Secrets در Kubernetes وجود دارد:
- Generic Secret: برای ذخیره انواع مختلف دادههای حساس مانند رمز عبور و کلیدهای API.
- Docker Registry Secret: برای ذخیره اطلاعات ورود به Docker Registry بهمنظور استفاده از آن در هنگام کشیدن تصاویر Docker.
استفاده از Secrets به شما این امکان را میدهد که دادههای حساس خود را بهطور امن ذخیره کرده و به منابع مختلف در کلاستر Kubernetes تحویل دهید.
کوبرنتیز
ذخیرهسازی اطلاعات حساس مانند رمز عبور، توکن و گواهینامهها سخنرانی
توضیحات کامل
Kubernetes Secrets به شما این امکان را میدهند که دادههای حساس را در داخل کلاستر ذخیره و به Pods و دیگر منابع تحویل دهید، در حالی که از افشای این دادهها جلوگیری میشود.
1. ذخیرهسازی رمز عبور (Password)
یکی از متداولترین اطلاعات حساس که باید در Kubernetes ذخیره شود، رمز عبور است. رمز عبور ممکن است برای دسترسی به پایگاه دادهها، سیستمهای خارجی، یا حتی در APIها استفاده شود. Kubernetes به شما این امکان را میدهد که رمزهای عبور را در Secrets ذخیره کرده و از آنها در برنامههای خود استفاده کنید.
ذخیرهسازی رمز عبور با استفاده از Generic Secret
- ایجاد یک Secret برای رمز عبور با استفاده از kubectl:
kubectl create secret generic db-password --from-literal=password='yourpassword'
در این دستور:
db-password
نام Secret است.--from-literal
برای اضافه کردن مقادیر به Secret استفاده میشود. در اینجا، رمز عبورyourpassword
بهصورت مستقیم وارد میشود.
- ایجاد Secret با فایل YAML:
apiVersion: v1
kind: Secret
metadata:
name: db-password
type: Opaque
data:
password: eW91cnBhc3N3b3Jk # رمز عبور Base64-encoded است
در اینجا، password
باید بهصورت Base64-encoded وارد شود. برای دریافت مقدار Base64 از رمز عبور، میتوانید از ابزارهایی مانند echo
یا base64
در سیستم خود استفاده کنید.
echo -n 'yourpassword' | base64
2. ذخیرهسازی توکنها (Tokens)
توکنها معمولاً برای احراز هویت یا مجوز در سیستمهای مختلف مانند APIها، سرویسهای ثالث و حتی Kubernetes به کار میروند. برای ذخیرهسازی این توکنها، از Secrets مشابه رمز عبور استفاده میشود.
ذخیرهسازی توکن با استفاده از Generic Secret
- ایجاد Secret برای توکن API با استفاده از kubectl:
kubectl create secret generic api-token --from-literal=token='yourtoken'
در اینجا، api-token
نام Secret است و yourtoken
توکن شماست.
- ایجاد Secret برای توکن با استفاده از فایل YAML:
apiVersion: v1
kind: Secret
metadata:
name: api-token
type: Opaque
data:
token: eW91cnRva2Vu # توکن Base64-encoded است
مجدداً برای استفاده از توکن بهصورت Base64-encoded، میتوانید از دستور base64
استفاده کنید.
3. ذخیرهسازی گواهینامهها (Certificates)
گواهینامهها (Certificates) برای رمزنگاری اطلاعات و احراز هویت در بسیاری از پروتکلها و سرویسها مانند HTTPS یا TLS مورد استفاده قرار میگیرند. این اطلاعات نیز باید بهصورت امن ذخیره و در دسترس قرار گیرند.
ذخیرهسازی گواهینامهها با استفاده از Generic Secret
- ایجاد Secret برای گواهینامهها با استفاده از kubectl:
kubectl create secret generic tls-certificate --from-file=tls.crt=/path/to/tls.crt --from-file=tls.key=/path/to/tls.key
در اینجا:
tls.crt
گواهینامه عمومی (public certificate) است.tls.key
کلید خصوصی (private key) است.
- ایجاد Secret برای گواهینامهها با استفاده از فایل YAML:
apiVersion: v1
kind: Secret
metadata:
name: tls-certificate
type: kubernetes.io/tls
data:
tls.crt: <Base64-encoded certificate>
tls.key: <Base64-encoded private key>
برای تبدیل گواهینامهها و کلیدهای خصوصی به Base64، از ابزار base64
در سیستم خود استفاده کنید.
4. مدیریت و استفاده از Secrets در Pods
پس از ایجاد Secrets برای اطلاعات حساس مانند رمز عبور، توکنها و گواهینامهها، میتوانید آنها را بهراحتی در Pods خود استفاده کنید. برای این کار، از envFrom
یا volume
میتوان برای استخراج مقادیر از Secrets و قرار دادن آنها در محیط کانتینرها یا فایلها استفاده کرد.
استفاده از Secret بهعنوان متغیر محیطی در Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-example
spec:
containers:
- name: app-container
image: yourimage
envFrom:
- secretRef:
name: db-password
در اینجا، Secret db-password
بهعنوان متغیر محیطی به کانتینر وارد میشود و شما میتوانید از آن در برنامه خود استفاده کنید.
استفاده از Secret بهعنوان volume در Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-example
spec:
containers:
- name: app-container
image: yourimage
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret-volume"
volumes:
- name: secret-volume
secret:
secretName: db-password
در اینجا، Secret db-password
بهعنوان یک volume در /etc/secret-volume
در دسترس قرار میگیرد.
جمع بندی
در Kubernetes، برای ذخیرهسازی اطلاعات حساس مانند رمز عبور، توکنها و گواهینامهها از Secrets استفاده میشود. این ابزار به شما این امکان را میدهد که اطلاعات حساس را بهصورت امن ذخیره و به Pods یا سایر منابع Kubernetes تحویل دهید. همچنین، Kubernetes از انواع مختلفی از Secrets پشتیبانی میکند که از جمله آنها میتوان به Generic Secret و TLS Secret اشاره کرد. برای استفاده از این اطلاعات در Pods، میتوانید آنها را بهعنوان متغیر محیطی یا volume به کانتینرها تزریق کنید.
استفاده از Secrets در Pods و کانتینرها سخنرانی
توضیحات کامل
Secrets به شما این امکان را میدهند که این دادههای حساس را در محیط Kubernetes مدیریت کنید بدون آنکه آنها در فایلهای پیکربندی یا کدهای برنامهتان ظاهر شوند.
1. استفاده از Secrets بهعنوان متغیرهای محیطی در Pods
یکی از روشهای رایج برای استفاده از Secrets در Pods، تزریق آنها بهعنوان متغیرهای محیطی به کانتینرهای داخل Pod است. این کار باعث میشود که اطلاعات حساس در محیط کانتینر در دسترس باشد و برنامه بتواند از آنها استفاده کند.
ایجاد و استفاده از Secret بهعنوان متغیر محیطی
- ایجاد یک Secret جدید:
kubectl create secret generic my-secret --from-literal=username='admin' --from-literal=password='secretpassword'
در این مثال، یک Secret با نام my-secret
ایجاد میشود که شامل دو داده است: username
و password
.
- استفاده از Secret بهعنوان متغیر محیطی در Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-example
spec:
containers:
- name: app-container
image: nginx
envFrom:
- secretRef:
name: my-secret
در این پیکربندی، از envFrom برای بارگذاری تمام مقادیر موجود در Secret بهعنوان متغیرهای محیطی در کانتینر استفاده میشود. کانتینر میتواند به این متغیرها دسترسی پیدا کند. در اینجا، متغیرهای محیطی username
و password
در داخل کانتینر بهطور خودکار ایجاد میشوند.
2. استفاده از Secrets بهعنوان Volume در Pods
روش دیگر برای استفاده از Secrets در Pods، نصب آنها بهعنوان یک volume است. در این روش، مقادیر Secrets بهعنوان فایلهایی در دسترس کانتینرها قرار میگیرند و شما میتوانید به این فایلها دسترسی پیدا کنید.
ایجاد Secret و استفاده از آن بهعنوان Volume
- ایجاد یک Secret برای گواهینامهها:
kubectl create secret generic my-tls-secret --from-file=tls.crt=/path/to/tls.crt --from-file=tls.key=/path/to/tls.key
در این مثال، یک Secret با نام my-tls-secret
ایجاد میشود که شامل دو فایل tls.crt
و tls.key
است.
- استفاده از Secret بهعنوان Volume در Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-example
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- name: tls-secret-volume
mountPath: /etc/tls
volumes:
- name: tls-secret-volume
secret:
secretName: my-tls-secret
در این پیکربندی:
- Secret
my-tls-secret
بهعنوان یک volume در Pod تعریف شده است. - محتویات این Secret در داخل کانتینر و در مسیر
/etc/tls
بهصورت فایلهای قابل دسترسی قرار میگیرد. - فایلهای گواهینامه و کلید خصوصی در داخل این مسیر بهعنوان فایلهایی با نام
tls.crt
وtls.key
در دسترس خواهند بود.
3. استفاده از Secrets بهعنوان متغیرهای محیطی با رمزگذاری Base64
گاهی اوقات ممکن است بخواهید مقادیر حساس خود را بهطور مستقیم بهصورت Base64 رمزگذاری کنید و آنها را بهعنوان Secret ذخیره کنید.
مثال رمزگذاری Base64:
- رمزگذاری Base64 دادهها:
echo -n 'secretpassword' | base64
نتیجه رمزگذاری شده بهصورت Base64 برای استفاده در Secret خواهد بود.
- ایجاد Secret با دادههای رمزگذاری شده:
apiVersion: v1
kind: Secret
metadata:
name: encoded-secret
type: Opaque
data:
username: YWRtaW4= # 'admin' بهصورت Base64 رمزگذاری شده است
password: c2VjcmV0cGFzc3dvcmQ= # 'secretpassword' بهصورت Base64 رمزگذاری شده است
در اینجا، دادهها بهصورت Base64 رمزگذاری شدهاند و در داخل Secret ذخیره شدهاند.
- استفاده از Secret رمزگذاری شده در Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-encoded-example
spec:
containers:
- name: app-container
image: nginx
envFrom:
- secretRef:
name: encoded-secret
در این پیکربندی، دادههای رمزگذاری شده از Secret بهعنوان متغیرهای محیطی به کانتینر تزریق میشوند.
جمع بندی
در Kubernetes، Secrets ابزاری است که به شما این امکان را میدهد که اطلاعات حساس مانند رمز عبور، توکنها، گواهینامهها و سایر دادههای مشابه را بهصورت امن ذخیره و مدیریت کنید. شما میتوانید این اطلاعات حساس را به دو روش عمده در Pods استفاده کنید:
- بهعنوان متغیرهای محیطی با استفاده از
envFrom
. - بهعنوان فایلهای سیستم با استفاده از Volumes.
این روشها باعث میشوند که دادههای حساس در داخل کانتینرها در دسترس باشند، در حالی که در داخل فایلهای پیکربندی یا کدهای برنامهتان افشا نشوند.
دسترسی به Secrets از طریق Volume و محیط متغیر (Environment Variables) سخنرانی
توضیحات کامل
1. دسترسی به Secrets از طریق Volume
یکی از راههای استفاده از Secrets در Kubernetes، قرار دادن آنها بهعنوان فایلهای Volumes است. این روش بهویژه زمانی مفید است که شما نیاز به ذخیرهسازی دادههایی مانند کلیدهای خصوصی، گواهینامهها یا فایلهای پیکربندی دارید که باید بهصورت فایل در کانتینر قابل دسترسی باشند.
نحوه استفاده از Secrets بهعنوان Volume
- ایجاد Secret:
ابتدا باید Secret خود را ایجاد کنید. این Secret میتواند شامل دادههایی مانند گواهینامهها، کلیدهای خصوصی یا سایر اطلاعات حساس باشد.
kubectl create secret generic my-app-secret --from-literal=db-password='supersecret'
در این مثال، Secretای به نام my-app-secret
ایجاد میشود که شامل یک داده db-password
است.
- تعریف Volume برای Secret در Pod:
برای استفاده از Secret بهعنوان Volume، میتوانید آن را در مشخصات Pod بهصورت زیر تعریف کنید:
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-example
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
volumes:
- name: secret-volume
secret:
secretName: my-app-secret
در این پیکربندی:
- یک volume به نام
secret-volume
به Pod اضافه شده است. - این volume به Secret با نام
my-app-secret
متصل شده است. - Secret در مسیر
/etc/secrets
در کانتینر نصب میشود و دادههای موجود در Secret بهصورت فایلهایی در این مسیر قابل دسترسی خواهند بود.
برای مثال، اگر Secret شما حاوی یک کلید db-password
باشد، این کلید بهصورت یک فایل متنی در مسیر /etc/secrets/db-password
در کانتینر ذخیره خواهد شد.
2. دسترسی به Secrets از طریق Environment Variables
دومین روش استفاده از Secrets در Kubernetes، استفاده از آنها بهعنوان متغیرهای محیطی است. در این روش، مقادیر موجود در Secret بهعنوان متغیرهای محیطی در داخل کانتینر قابل دسترسی خواهند بود.
نحوه استفاده از Secrets بهعنوان متغیر محیطی
- ایجاد Secret:
اولین قدم ایجاد Secret است. بهعنوان مثال:
kubectl create secret generic my-app-secret --from-literal=db-password='supersecret'
- استفاده از Secret بهعنوان متغیر محیطی در Pod:
برای تزریق دادههای Secret بهعنوان متغیر محیطی، از تنظیمات زیر استفاده میکنیم:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-example
spec:
containers:
- name: app-container
image: nginx
envFrom:
- secretRef:
name: my-app-secret
در این پیکربندی:
- از
envFrom
برای بارگذاری تمام دادههای موجود در Secret بهعنوان متغیرهای محیطی استفاده شده است. - در کانتینر، متغیرهای محیطی به نامهای
db-password
و غیره بهطور خودکار بارگذاری میشوند و شما میتوانید از آنها در برنامهتان استفاده کنید.
بهعنوان مثال، اگر در Secret شما یک داده با نام db-password
وجود داشته باشد، این داده بهعنوان متغیر محیطی db-password
در داخل کانتینر در دسترس خواهد بود.
مقایسه بین استفاده از Secrets بهعنوان Volume و Environment Variables
ویژگی | استفاده از Volume | استفاده از Environment Variables |
---|---|---|
نحوه دسترسی | بهعنوان فایل در سیستم فایل کانتینر | بهعنوان متغیر محیطی در کانتینر |
امنیت | اطلاعات حساس بهصورت فایل ذخیره میشود | اطلاعات حساس بهصورت متغیر محیطی ذخیره میشود |
کاربرد مناسب | برای ذخیرهسازی فایلها و گواهینامهها | برای ذخیرهسازی اطلاعات غیر ساختاری مانند توکنها و رمزها |
امنیت فایل | فایلها میتوانند با دسترسی خاص بهطور جداگانه محافظت شوند | متغیرهای محیطی ممکن است در فایلهای log نمایش داده شوند |
استفاده در برنامه | میتوان بهصورت مستقیم به فایلها دسترسی داشت | میتوان بهصورت مستقیم به متغیرهای محیطی دسترسی داشت |
جمع بندی
در Kubernetes، شما میتوانید Secrets را بهطور مؤثر و امن بهصورت Volumes یا Environment Variables در Pods و کانتینرها استفاده کنید. استفاده از Volumes بهویژه زمانی مفید است که نیاز به ذخیرهسازی دادههای حساس بهصورت فایل دارید، مانند گواهینامهها یا کلیدهای خصوصی. از طرف دیگر، استفاده از Environment Variables بیشتر برای دادههای حساس مانند رمزهای عبور یا توکنها مناسب است.
هرکدام از این روشها مزایای خاص خود را دارند، اما انتخاب بین آنها بستگی به نوع اطلاعات حساس و نیاز شما دارد.
امنیت Secrets:
استفاده از رمزنگاری در سطح ذخیرهسازی (Encryption at Rest) سخنرانی
توضیحات کامل
1. اهمیت رمزنگاری در سطح ذخیرهسازی
دادههایی که در حین ذخیرهسازی رمزنگاری نمیشوند، ممکن است در صورت دسترسی غیرمجاز به دیسک یا سایر رسانههای ذخیرهسازی، در معرض سرقت یا دستکاری قرار گیرند. برای جلوگیری از چنین حملاتی، رمزنگاری در سطح ذخیرهسازی به شما این امکان را میدهد که حتی اگر مهاجمی دسترسی به فضای ذخیرهسازی پیدا کند، نتواند به محتوای واقعی دادهها دست یابد.
در Kubernetes، اطلاعاتی مانند Secrets، Persistent Volumes (PV)، و سایر دادههای حساس باید در هنگام ذخیرهسازی رمزنگاری شوند تا اطمینان حاصل شود که فقط افراد یا سرویسهای معتبر قادر به خواندن و استفاده از آنها هستند.
2. پیکربندی رمزنگاری در سطح ذخیرهسازی در Kubernetes
Kubernetes امکاناتی برای پیکربندی Encryption at Rest فراهم کرده است. این امکانات از طریق تنظیمات مختلف در سطح API Server و etcd امکانپذیر است. Kubernetes از etcd برای ذخیرهسازی دادههای پیکربندی و وضعیت استفاده میکند که حاوی دادههای بسیار حساسی مانند Secrets است. بنابراین، رمزنگاری این دادهها برای جلوگیری از دسترسی غیرمجاز ضروری است.
3. تنظیم رمزنگاری در Kubernetes
برای استفاده از رمزنگاری در سطح ذخیرهسازی در Kubernetes، باید تنظیمات خاصی را در API Server و etcd انجام دهید. مراحل اصلی عبارتاند از:
3.1. تنظیمات رمزنگاری در etcd
از آنجایی که دادههای حساسی مانند Secrets و configMaps در etcd ذخیره میشوند، رمزنگاری آنها از طریق تنظیمات Kubernetes ضروری است. برای این منظور، باید فایل پیکربندی kube-apiserver را تغییر داده و رمزنگاری دادهها را فعال کنید.
- فایل پیکربندی kube-apiserver را باز کنید. این فایل معمولاً در مسیر
/etc/kubernetes/manifests/kube-apiserver.yaml
قرار دارد. - بخش مربوط به رمزنگاری را به این صورت اضافه یا اصلاح کنید:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-apiserver
namespace: kube-system
spec:
template:
spec:
containers:
- name: kube-apiserver
command:
- kube-apiserver
- --encryption-provider-config=/etc/kubernetes/encryption/encryption-config.yaml
- در این پیکربندی، مسیر
--encryption-provider-config
به فایل پیکربندی رمزنگاری اشاره دارد که باید تنظیمات رمزنگاری در آن قرار داده شود.
3.2. تنظیمات فایل پیکربندی رمزنگاری
برای پیکربندی رمزنگاری، یک فایل پیکربندی با نام encryption-config.yaml
ایجاد کنید. این فایل میتواند به شکل زیر باشد:
apiVersion: v1
kind: Secret
metadata:
name: encryption-config
namespace: kube-system
data:
encryption-config.yaml: |
kind: EncryptionConfig
apiVersion: encryption.k8s.io/v1
resources:
- resources:
- secrets
providers:
- identity: {}
- aesgcm:
keys:
- name: key1
secret: <base64-encoded-secret-key>
در این فایل:
- برای رمزنگاری Secrets از AES-GCM استفاده شده است.
- مقدار
<base64-encoded-secret-key>
باید بهصورت base64 رمزنگاری شده و یک کلید تصادفی باشد.
پس از ایجاد این فایل، باید آن را در مسیر /etc/kubernetes/encryption/
قرار دهید و Kubernetes را مجدداً راهاندازی کنید تا تغییرات اعمال شود.
3.3. بررسی وضعیت رمزنگاری
برای بررسی وضعیت رمزنگاری در Kubernetes، میتوانید از دستور زیر استفاده کنید:
kubectl get secrets --namespace=kube-system
در صورتی که رمزنگاری به درستی فعال شده باشد، محتوای Secrets دیگر بهصورت متن ساده در دسترس نخواهد بود و در هنگام دسترسی، بهطور خودکار رمزگشایی میشود.
4. مزایای رمزنگاری در سطح ذخیرهسازی
- حفاظت از دادههای حساس: دادههایی مانند Secrets، API Tokens، و گواهینامهها با استفاده از رمزنگاری در سطح ذخیرهسازی از دسترسیهای غیرمجاز محافظت میشوند.
- امنیت اطلاعات در صورت دسترسی فیزیکی: حتی اگر یک مهاجم به سیستمهای ذخیرهسازی یا فضای دیسک دسترسی پیدا کند، بدون داشتن کلید رمزگشایی قادر به خواندن دادهها نخواهد بود.
- سهولت مدیریت: تنظیمات رمزنگاری در Kubernetes میتواند بهصورت مرکزی انجام شده و بهطور خودکار برای تمام دادههای ذخیرهشده در etcd اعمال شود.
جمع بندی
رمزنگاری در سطح ذخیرهسازی (Encryption at Rest) در Kubernetes ابزاری بسیار مهم برای حفاظت از دادههای حساس مانند Secrets و اطلاعات پیکربندی است. با پیکربندی مناسب رمزنگاری در etcd، میتوان اطمینان حاصل کرد که حتی در صورت دسترسی غیرمجاز به فضای ذخیرهسازی، دادهها در معرض سرقت قرار نخواهند گرفت. استفاده از این روش یکی از بهترین شیوهها برای افزایش امنیت و محافظت از دادههای حساس در کلاستر Kubernetes است.
محدودسازی دسترسی به Secrets با RBAC سخنرانی
توضیحات کامل
در این بخش به نحوه محدودسازی دسترسی به Secrets با استفاده از RBAC خواهیم پرداخت.
1. مفاهیم کلیدی در RBAC برای محدودسازی دسترسی به Secrets
قبل از بررسی چگونگی پیکربندی RBAC برای محدود کردن دسترسی به Secrets، نیاز است که با مفاهیم اصلی RBAC در Kubernetes آشنا شویم:
- Role: یک Role مجموعهای از مجوزهای دسترسی به منابع مختلف (مانند Pods، Secrets، یا ConfigMaps) در یک Namespace خاص است. این منابع میتوانند دسترسی به منابع مختلف در کلاستر Kubernetes را تنظیم کنند.
- ClusterRole: مشابه Role است، با این تفاوت که دسترسیها را در سطح کل کلاستر (نه فقط در یک Namespace خاص) تنظیم میکند.
- RoleBinding: این شیء ارتباط بین یک Role و یک کاربر یا گروه مشخص را برقرار میکند. یعنی تعیین میکند که یک کاربر یا سرویس خاص چه مجوزهایی بر روی منابع یک Namespace خاص دارد.
- ClusterRoleBinding: مشابه RoleBinding است، اما دسترسیهای آن در سطح کلاستر اعمال میشود.
2. محدودسازی دسترسی به Secrets با استفاده از Role و RoleBinding
برای محدود کردن دسترسی به Secrets، میتوانیم یک Role ایجاد کرده و به آن دسترسی به منابع Secrets بدهیم. سپس این Role را از طریق RoleBinding به کاربران، سرویسها یا گروههای خاص اختصاص میدهیم.
2.1. ایجاد Role برای محدود کردن دسترسی به Secrets
برای شروع، باید یک Role تعریف کنیم که فقط اجازه دسترسی به Secrets را بدهد. این Role میتواند فقط در یک Namespace خاص فعال باشد.
مثال: ایجاد یک Role که فقط به Secrets در Namespace default
دسترسی دارد:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
# تعیین نام و Namespace برای Role
namespace: default
name: secret-access-role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"] # تنها دسترسی به خواندن دادههای Secrets
در این پیکربندی:
- apiGroups: به منابع استاندارد اشاره دارد که در اینجا Secrets جزء آن است.
- resources: مشخص میکند که منابع چه چیزی هستند، در اینجا فقط Secrets است.
- verbs: عملیات مجاز بر روی منابع را مشخص میکند، مانند
get
(برای خواندن) وlist
(برای لیست کردن).
2.2. ایجاد RoleBinding برای اختصاص دسترسی به Role
پس از ایجاد Role، باید آن را از طریق یک RoleBinding به کاربر، سرویس، یا گروه خاص اختصاص دهید. به عنوان مثال، اگر بخواهید به سرویس my-app
در Namespace default
دسترسی به Secrets بدهید، میتوانید از دستور زیر استفاده کنید:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: secret-access-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-app
namespace: default
roleRef:
kind: Role
name: secret-access-role
apiGroup: rbac.authorization.k8s.io
در این پیکربندی:
- subjects: مشخص میکند که چه کاربران یا سرویسها میتوانند به این Role دسترسی داشته باشند.
- roleRef: مشخص میکند که این RoleBinding به کدام Role اشاره دارد و آن را به کاربر یا سرویس مشخص شده اعمال میکند.
2.3. بررسی دسترسی به Secrets
برای بررسی اینکه آیا یک سرویس خاص (مانند my-app
) به Secrets دسترسی دارد یا خیر، میتوانید از دستور زیر استفاده کنید:
kubectl auth can-i get secrets --as=system:serviceaccount:default:my-app
این دستور بررسی میکند که آیا سرویس my-app
قادر به خواندن Secrets در Namespace default
است یا خیر. اگر پاسخ “yes” بود، به این معناست که دسترسی برقرار شده است.
3. محدودسازی دسترسی به Secrets با ClusterRole و ClusterRoleBinding
اگر بخواهید دسترسی به Secrets را به کاربران یا سرویسها در سطح کلاستر محدود کنید، باید از ClusterRole و ClusterRoleBinding استفاده کنید.
3.1. ایجاد ClusterRole برای محدود کردن دسترسی به Secrets در سطح کلاستر
در اینجا یک ClusterRole تعریف میکنیم که به کاربران دسترسی به Secrets در تمامی Namespaceها بدهد:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-secret-access-role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
3.2. ایجاد ClusterRoleBinding برای اختصاص دسترسی به ClusterRole
حال، باید ClusterRole را به کاربران یا سرویسها در سطح کلاستر اختصاص دهیم. این کار را با استفاده از ClusterRoleBinding انجام میدهیم. مثلاً اگر بخواهید به سرویس my-app
در Namespace default
دسترسی بدهید، از دستور زیر استفاده میکنیم:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-secret-access-binding
subjects:
- kind: ServiceAccount
name: my-app
namespace: default
roleRef:
kind: ClusterRole
name: cluster-secret-access-role
apiGroup: rbac.authorization.k8s.io
جمع بندی
محدودسازی دسترسی به Secrets با استفاده از RBAC یکی از روشهای مؤثر برای محافظت از دادههای حساس در Kubernetes است. با استفاده از Role و RoleBinding، میتوانید دسترسی به Secrets را در سطح Namespace محدود کنید و با استفاده از ClusterRole و ClusterRoleBinding این محدودیتها را در سطح کلاستر اعمال کنید. همچنین، با استفاده از دستور kubectl auth can-i
میتوانید از صحت دسترسیهای تعریفشده اطمینان حاصل کنید. این روشها به شما کمک میکنند تا امنیت دادههای حساس را در کلاستر Kubernetes خود افزایش دهید.
چرخش (Rotation) و مدیریت دورهای Secrets سخنرانی
توضیحات کامل
در این بخش به روشها و بهترین شیوهها برای چرخش و مدیریت دورهای Secrets در Kubernetes میپردازیم.
1. اهمیت چرخش دورهای Secrets
چرخش دورهای Secrets بهویژه در محیطهای تولیدی و در زمانی که سطح امنیت بالا مورد نیاز است، اهمیت زیادی دارد. در صورتی که Secrets مانند رمزهای عبور و توکنها بهطور منظم بهروزرسانی نشوند، ممکن است در معرض تهدیدات مختلفی مانند افشای اطلاعات یا حملات سایبری قرار گیرند. با چرخش صحیح، حتی اگر یک Secret به خطر بیفتد، میتوان آن را به سرعت تغییر داد و از تاثیرات منفی جلوگیری کرد.
2. روشهای چرخش Secrets در Kubernetes
چرخش Secrets در Kubernetes میتواند به دو روش اصلی انجام شود:
- چرخش دستی (Manual Rotation): در این روش، مدیر سیستم یا تیم امنیتی باید بهطور دستی Secrets را بهروزرسانی کند و سپس کانتینرها یا Pods را که از این Secrets استفاده میکنند، مجدداً راهاندازی کند.
- چرخش خودکار (Automated Rotation): در این روش، ابزارها و سرویسهای خاص میتوانند بهطور خودکار Secrets را بهروزرسانی کنند. بهعنوان مثال، استفاده از سیستمهای مدیریت Secrets مانند HashiCorp Vault، AWS Secrets Manager یا Google Cloud Secret Manager میتواند بهطور خودکار Secrets را مدیریت و بهروزرسانی کند.
3. چرخش دستی Secrets
در این روش، برای چرخش دستی Secrets، شما باید مراحل زیر را دنبال کنید:
3.1. بهروزرسانی Secret
ابتدا باید Secret جدید را ایجاد کنید. برای این کار میتوانید از دستور kubectl create secret
استفاده کنید.
مثال: ایجاد یک Secret جدید برای یک پایگاه داده با رمز عبور جدید:
kubectl create secret generic db-password --from-literal=password=newpassword123 --dry-run=client -o yaml | kubectl apply -f -
در این دستور:
--from-literal
: برای وارد کردن دادهها به صورت مستقیم به داخل Secret استفاده میشود.--dry-run=client
: این گزینه اجازه میدهد که فقط خروجی YAML برای Secret جدید نمایش داده شود بدون اینکه مستقیماً در کلاستر ذخیره شود.-o yaml
: خروجی به فرمت YAML خواهد بود.| kubectl apply -f -
: برای اعمال تغییرات به کلاستر استفاده میشود.
3.2. بهروزرسانی منابع وابسته به Secret
پس از بهروزرسانی Secret، باید منابعی که از آن استفاده میکنند (مانند Pods یا Deployments) را بهروزرسانی کنید تا از Secret جدید استفاده کنند.
برای این کار، میتوانید Pods را دوباره راهاندازی کنید:
kubectl rollout restart deployment <deployment-name>
این دستور باعث میشود که Deployment شما مجدداً راهاندازی شود و از Secret جدید استفاده کند.
4. چرخش خودکار Secrets با استفاده از ابزارهای مدیریت Secrets
چرخش خودکار Secrets یکی از بهترین شیوهها برای مدیریت امنیت در Kubernetes است. ابزارهایی مانند HashiCorp Vault، AWS Secrets Manager و Google Cloud Secret Manager بهطور خودکار امکان چرخش Secrets را فراهم میکنند.
4.1. استفاده از HashiCorp Vault
HashiCorp Vault یکی از ابزارهای قدرتمند برای مدیریت Secrets است که امکان چرخش خودکار آنها را نیز دارد. برای استفاده از Vault، میتوانید مراحل زیر را دنبال کنید:
- نصب و پیکربندی Vault در Kubernetes.
- پیکربندی Vault برای تولید و چرخش Secrets.
- استفاده از Vault Agent در Pods برای دسترسی به Secrets بهصورت خودکار.
4.2. استفاده از AWS Secrets Manager
AWS Secrets Manager یک سرویس امن برای ذخیره و مدیریت Secrets است که از چرخش خودکار پشتیبانی میکند. برای استفاده از این سرویس در Kubernetes، میتوانید از ابزار Kubernetes External Secrets استفاده کنید تا بهطور خودکار Secrets را از AWS Secrets Manager به Kubernetes وارد کنید.
5. نظارت بر چرخش و مدیریت Secrets
برای اطمینان از عملکرد صحیح چرخش Secrets، باید نظارت دقیقی بر فرآیندهای مربوط به آنها داشته باشید. این کار شامل نظارت بر لاگها، بررسی بهروزرسانیهای Secrets و همچنین انجام تستهای امنیتی برای اطمینان از اینکه هیچگونه افشا یا نقض امنیتی اتفاق نمیافتد، است.
برای مثال، میتوانید از ابزارهایی مانند Prometheus و Grafana برای نظارت بر تغییرات و چرخش Secrets استفاده کنید.
جمع بندی
چرخش و مدیریت دورهای Secrets بخش حیاتی امنیت در Kubernetes است. با استفاده از روشهای چرخش دستی یا خودکار، میتوان از افشای اطلاعات حساس جلوگیری کرد و از تهدیدات امنیتی کاست. با بهکارگیری ابزارهای مدیریت Secrets مانند HashiCorp Vault، AWS Secrets Manager و Google Cloud Secret Manager، این فرآیند را خودکار و امنتر میسازید. بهروزرسانی منظم Secrets و نظارت دقیق بر آنها برای حفظ امنیت سیستمهای شما ضروری است.
فصل 5. حفاظت از Cluster و منابع
Admission Controllers:
آشنایی با Admission Controllers مانند PodSecurityAdmission و ImagePolicyWebhook سخنرانی
توضیحات کامل
1. معرفی Admission Controllers
Admission Controllers درخواستهای API را پس از مرحله اعتبارسنجی ولی قبل از ذخیرهشدن دادهها در etcd بررسی و پردازش میکنند. اینها میتوانند بهطور خودکار درخواستها را قبول یا رد کنند یا تغییراتی روی آنها اعمال کنند.
مهمترین عملکردهای Admission Controllers عبارتاند از:
- بررسی امنیت: جلوگیری از اجرا شدن منابعی که ممکن است تهدیدات امنیتی ایجاد کنند.
- پیکربندی منابع: تنظیم پیشفرضها و ویژگیهای منابع در هنگام ایجاد آنها.
- اجبار به سیاستها: پیادهسازی قوانین و سیاستها مانند استفاده از منابع خاص، محدودیتهای دسترسی، یا درخواستهای مبتنی بر تیم و محیط.
در این بخش، به دو Admission Controller مهم که برای امنیت و مدیریت منابع در Kubernetes استفاده میشوند خواهیم پرداخت: PodSecurityAdmission و ImagePolicyWebhook.
2. PodSecurityAdmission
PodSecurityAdmission یک Admission Controller است که برای محدود کردن رفتار Pods و افزایش امنیت در هنگام استقرار منابع در کلاستر Kubernetes استفاده میشود. این کنترلر به شما این امکان را میدهد که سیاستهای امنیتی را بر روی Pods اعمال کنید و از اجرای Pods با پیکربندیهای خطرناک جلوگیری کنید.
2.1. نحوه عملکرد PodSecurityAdmission
PodSecurityAdmission بهطور خاص برای پیادهسازی سیاستهای امنیتی Podها مانند محدودیتهای سطح دسترسی، استفاده از کاربرهای غیر ریشه و همچنین محدودیتهای دیگر طراحی شده است. این Admission Controller میتواند بر اساس یک سری از Policies امنیتی اعمال شود و اجازه ندهد Pods غیرمجاز به کلاستر اضافه شوند.
2.2. پیکربندی PodSecurityAdmission
برای پیکربندی PodSecurityAdmission، باید یک PodSecurityPolicy مناسب تعیین کنید که رفتارهای مجاز و غیرمجاز برای Pods را مشخص کند. بهطور مثال، میتوانید سیاستهایی ایجاد کنید که فقط به Pods با userNamespace خاص اجازه اجرا بدهد یا اجرای Pods با دسترسیهای ریشه را مسدود کند.
برای پیکربندی PodSecurityAdmission، میتوانید به صورت زیر عمل کنید:
- ابتدا باید PodSecurityPolicy را فعال کرده و تنظیمات مورد نیاز را در فایل کانفیگ قرار دهید.
- تنظیمات اعمالشده در کانفیگ را بهصورت زیر در Pod مشخص کنید.
نمونهای از استفاده از PodSecurityAdmission:
apiVersion: admission.k8s.io/v1
kind: AdmissionControlConfiguration
admissionControl:
enabled:
- PodSecurityAdmission
این تنظیم باعث میشود که PodSecurityAdmission فعال شده و سیاستهای امنیتی بر روی Pods اعمال شود.
2.3. سیاستهای PodSecurityAdmission
PodSecurityAdmission از سه سطح امنیتی پشتیبانی میکند:
- Privileged: اجازه به تمام Pods با سطح دسترسی بالا.
- Baseline: محدودیتهای پایه مانند جلوگیری از اجرای Pods با دسترسیهای ریشه.
- Restricted: محدودیتهای دقیقتر مانند مسدود کردن اجرای هرگونه Pod با سطوح امنیتی پایین.
3. ImagePolicyWebhook
ImagePolicyWebhook یک Admission Controller است که برای بررسی و اعتبارسنجی Images قبل از اجرا در Kubernetes استفاده میشود. این کنترلر به شما این امکان را میدهد که از اجرای تصاویر Docker یا container image که بهطور خاص به تصویب نرسیدهاند یا از منابع غیرمجاز هستند، جلوگیری کنید.
3.1. نحوه عملکرد ImagePolicyWebhook
ImagePolicyWebhook بهطور معمول در مقایسه با سایر کنترلرها کمی پیچیدهتر است، زیرا نیاز به پیکربندی سرویسهای وب خاص برای اعتبارسنجی تصاویر دارد. این سرویس وب میتواند درخواستهایی که به ImagePull میشوند را دریافت کرده و مشخص کند که آیا آنها باید ادامه یابند یا رد شوند.
با استفاده از ImagePolicyWebhook میتوانید:
- از اجرای images که از مخازن خصوصی یا خطرناک هستند جلوگیری کنید.
- اطمینان حاصل کنید که تنها نسخههای تایید شده از یک image در کلاستر اجرا میشوند.
- سیاستهای امنیتی برای جلوگیری از اجرای images با آسیبپذیریهای شناختهشده اعمال کنید.
3.2. پیکربندی ImagePolicyWebhook
برای استفاده از ImagePolicyWebhook، ابتدا نیاز به یک وبهوک برای بررسی سیاستهای image دارید. این وبهوک میتواند از APIهای خارجی استفاده کند تا درخواستهای مربوط به images را تایید یا رد کند.
برای تنظیم یک وبهوک ImagePolicy، شما باید:
- یک سرویس وب ایجاد کنید که بتواند درخواستهای Webhook را پردازش کند.
- Webhook خود را در Kubernetes برای پردازش اعتبارسنجیهای image ثبت کنید.
نمونهای از پیکربندی Webhook برای اعتبارسنجی image:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: example-image-policy
webhooks:
- name: image-policy.example.com
clientConfig:
url: "https://your-webhook-server.com"
rules:
- operations: ["CREATE"]
apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["pods"]
این پیکربندی باعث میشود که درخواستهای ایجاد Pods که از image استفاده میکنند، ابتدا توسط سرویس وب شما بررسی شوند.
جمع بندی
Admission Controllers مانند PodSecurityAdmission و ImagePolicyWebhook ابزارهای قدرتمندی برای افزایش امنیت و مدیریت منابع در Kubernetes هستند. PodSecurityAdmission به شما این امکان را میدهد که سیاستهای امنیتی را برای Pods اعمال کنید و از اجرای پیکربندیهای خطرناک جلوگیری کنید. از طرف دیگر، ImagePolicyWebhook اجازه میدهد که Images قبل از اجرا بررسی شوند و تنها تصاویر تاییدشده و امن در کلاستر اجرا شوند. استفاده از این کنترلرها برای حفظ امنیت و مدیریت دسترسیها در Kubernetes ضروری است.
پیکربندی Admission Controllers برای افزایش امنیت سخنرانی
توضیحات کامل
در این بخش، به نحوه پیکربندی Admission Controllers برای افزایش امنیت در Kubernetes پرداخته و تنظیمات مختلفی که برای تقویت امنیت منابع و کاربران ضروری هستند، بررسی خواهیم کرد.
1. معرفی Admission Controllers و نقش آنها در امنیت
Admission Controllers بهطور خاص برای اجرا شدن پس از مرحله اعتبارسنجی و قبل از ذخیره دادهها در etcd طراحی شدهاند. این کنترلرها در سطوح مختلفی میتوانند به درخواستها اعمال شوند:
- Mutating Admission Controllers: این کنترلرها میتوانند تغییراتی را در درخواستهای ورودی اعمال کنند (مثلاً اضافه کردن برچسبها یا تنظیمات پیشفرض).
- Validating Admission Controllers: این کنترلرها بهطور عمده برای بررسی صحت و اعتبار درخواستها و منابع جدید استفاده میشوند (مثلاً بررسی اعتبار «PodSecurityPolicy» یا سیاستهای امنیتی).
برای تأمین امنیت در Kubernetes، میتوانید از Admission Controllers برای پیادهسازی سیاستهای مختلف استفاده کنید. در اینجا به بررسی نحوه پیکربندی و استفاده از مهمترین Admission Controllers امنیتی خواهیم پرداخت.
2. پیکربندی PodSecurityAdmission
PodSecurityAdmission یک Admission Controller است که برای اجرای سیاستهای امنیتی بر روی Pods طراحی شده است. با استفاده از این کنترلر میتوان از اجرای Pods با پیکربندیهای خطرناک جلوگیری کرد و رفتارهایی مانند اجرای دسترسیهای ریشه یا استفاده از کاربرهای ناامن را محدود کرد.
2.1. نحوه پیکربندی PodSecurityAdmission
برای پیکربندی PodSecurityAdmission در Kubernetes، باید ابتدا آن را در کلاستر فعال کنید. سپس سیاستهای امنیتی را برای Pods تعریف کرده و آنها را بهطور خودکار بر روی درخواستهای جدید اعمال کنید.
برای فعالسازی PodSecurityAdmission باید تنظیمات زیر را در فایل پیکربندی kube-apiserver وارد کنید:
--enable-admission-plugins=PodSecurityAdmission
سپس میتوانید سیاستهای امنیتی زیر را برای Pods تنظیم کنید:
- Privileged: اجازه به تمام Pods برای اجرا با سطوح دسترسی بالا.
- Baseline: اجازه به Pods با دسترسیهای ایمنتر مانند جلوگیری از استفاده از دسترسیهای ریشه.
- Restricted: محدودترین سیاست که فقط Pods با بالاترین سطح امنیتی اجازه اجرا خواهند داشت.
نمونهای از پیکربندی PodSecurityAdmission:
apiVersion: admission.k8s.io/v1
kind: AdmissionControlConfiguration
admissionControl:
enabled:
- PodSecurityAdmission
policy: "Baseline"
با این تنظیم، Kubernetes بهطور پیشفرض از سیاستهای امنیتی Baseline برای Pods استفاده میکند.
3. پیکربندی ImagePolicyWebhook
ImagePolicyWebhook یک Admission Controller است که برای کنترل تصاویر Docker یا container imageها پیش از اجرای آنها در کلاستر طراحی شده است. این کنترلر به شما امکان میدهد که از اجرای Images خطرناک یا ناامن جلوگیری کنید.
3.1. نحوه پیکربندی ImagePolicyWebhook
برای پیکربندی ImagePolicyWebhook، باید یک وبهوک (Webhook) تنظیم کنید که درخواستهای مربوط به کشیدن یا استفاده از images را بررسی کند. این وبهوک میتواند درخواستهایی که به image ارسال میشود را اعتبارسنجی کرده و بررسی کند که آیا آنها به سیاستهای تعریفشده مطابقت دارند یا خیر.
برای پیکربندی این Webhook باید سرویس Webhook خود را ایجاد کنید و سپس در Kubernetes آن را بهعنوان Mutating Admission Controller ثبت کنید:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: example-image-policy
webhooks:
- name: image-policy.example.com
clientConfig:
url: "https://your-webhook-server.com"
rules:
- operations: ["CREATE"]
apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["pods"]
در این پیکربندی، هر بار که یک Pod با Image جدید ایجاد میشود، درخواست به وبهوک شما ارسال میشود تا اعتبارسنجی انجام شود.
4. پیکربندی NodeRestriction
NodeRestriction یک Admission Controller است که بهطور خاص برای محدود کردن دسترسی به اطلاعات حساس در سطح نودها (Nodes) طراحی شده است. این کنترلر میتواند دسترسی کاربران و سرویسها به اطلاعات نودها را محدود کند، مانند اینکه چه کسی قادر است به ConfigMapها و Secretsهای نودها دسترسی پیدا کند.
4.1. نحوه پیکربندی NodeRestriction
برای فعالسازی این Admission Controller در Kubernetes، کافیست گزینه زیر را در پیکربندی kube-apiserver اضافه کنید:
--enable-admission-plugins=NodeRestriction
این کنترلر بهطور پیشفرض از اعمال تغییرات نادرست در منابع نودها جلوگیری میکند و فقط کاربران مجاز قادر به انجام عملیات بر روی نودها خواهند بود.
5. پیکربندی AlwaysPullImages
یکی دیگر از Admission Controllers که میتواند به امنیت کمک کند، AlwaysPullImages است. این کنترلر باعث میشود که Kubernetes همیشه تصویر (image) موردنظر را از مخزن بارگیری کند و از استفاده از caches یا local images جلوگیری کند. این کار بهویژه در سناریوهایی مفید است که میخواهید از اجرای images ناامن یا قدیمی جلوگیری کنید.
5.1. نحوه پیکربندی AlwaysPullImages
برای پیکربندی AlwaysPullImages در Kubernetes، باید گزینه زیر را در kube-apiserver فعال کنید:
--enable-admission-plugins=AlwaysPullImages
این کنترلر تضمین میکند که هر بار که Pod جدیدی ایجاد میشود، image آن از مخزن معتبر بهروز دریافت شود.
جمع بندی
Admission Controllers ابزارهای قدرتمندی برای افزایش امنیت در Kubernetes هستند. با استفاده از این کنترلرها میتوان دسترسیها، اعتبارسنجیها و سیاستهای امنیتی دقیقتری را در سطح کلاستر و منابع مختلف پیادهسازی کرد. پیکربندی صحیح و استفاده از کنترلرهای امنیتی مانند PodSecurityAdmission، ImagePolicyWebhook و NodeRestriction میتواند از بسیاری از تهدیدات امنیتی جلوگیری کرده و مدیریت منابع را بهبود بخشد.
Image Security:
استفاده از تصاویر معتبر و امن سخنرانی
توضیحات کامل
در این بخش، به نحوه استفاده از تصاویر معتبر و امن، نحوه مدیریت این تصاویر، و روشهای مختلف برای کنترل امنیت آنها پرداخته میشود.
1. اهمیت استفاده از تصاویر معتبر و امن
تصاویر Docker برای اجرای کانتینرها در Kubernetes حیاتی هستند، اما همانطور که از منابع اینترنتی مختلف میتوان تصاویر دریافت کرد، ممکن است این تصاویر شامل آسیبپذیریها یا حتی کدهای مخرب باشند. تصاویر معتبر و امن بهطور خاص بهمنظور جلوگیری از این خطرات ایجاد شدهاند.
- آسیبپذیریها: تصاویر قدیمی یا آسیبدیده ممکن است دارای vulnerabilities شناختهشدهای باشند که مهاجمین از آنها سوءاستفاده کنند.
- تصاویر غیرمعتبر: استفاده از تصاویر منتشرشده از منابع ناشناخته میتواند شامل کدهای مخرب باشد.
- پشتیبانی و نگهداری: تصاویر رسمی یا معتبر معمولا پشتیبانی و بروزرسانیهای منظم دریافت میکنند تا از مشکلات امنیتی جلوگیری شود.
2. راهکارهای استفاده از تصاویر معتبر و امن
برای استفاده از تصاویر معتبر و امن در Kubernetes، نیاز است که روشهای مختلفی را برای کنترل تصاویر و سیاستهای امنیتی آنها اعمال کنید.
2.1. استفاده از مخازن معتبر و شناختهشده
اولین و مهمترین قدم برای اطمینان از امنیت تصاویر، استفاده از maven repositories و image registries معتبر است. برای مثال:
- Docker Hub: بزرگترین و معروفترین مخزن تصاویر Docker است که تصاویر رسمی را از سازمانهای معتبر منتشر میکند.
- Google Container Registry (GCR): برای تصاویر مرتبط با Google Cloud.
- Amazon Elastic Container Registry (ECR): برای تصاویر مرتبط با AWS.
همچنین میتوانید از private registries برای ذخیرهسازی و استفاده از تصاویر خاص خودتان استفاده کنید که بهطور اختصاصی برای سازمان شما ساخته شدهاند.
2.2. بررسی و اسکن تصاویر برای آسیبپذیریها
برای اطمینان از عدم وجود آسیبپذیریهای امنیتی در تصاویر، از ابزارهای vulnerability scanning استفاده کنید. این ابزارها بهطور خودکار تصاویر را بررسی کرده و آسیبپذیریها را شناسایی میکنند. نمونههایی از این ابزارها عبارتند از:
- Clair: یک ابزار برای اسکن آسیبپذیریها در تصاویر Docker.
- Trivy: یک ابزار ساده و سریع برای اسکن تصاویر Docker به منظور شناسایی آسیبپذیریها.
- Anchore: یک ابزار برای بررسی امنیت تصاویر و تطبیق با استانداردهای امنیتی.
- Aqua Security: یک پلتفرم جامع برای امنیت تصاویر و کانتینرها.
برای استفاده از این ابزارها در Kubernetes، معمولاً باید تصاویر خود را در یک مخزن بارگذاری کنید و پس از آن بهطور خودکار توسط این ابزارها اسکن شوند.
2.3. استفاده از Signed Images
تصاویر امضا شده (Signed Images) راه دیگری برای اطمینان از اعتبار تصویر است. امضا کردن تصاویر به شما این امکان را میدهد که تضمین کنید تصویر مورد استفاده از یک منبع معتبر است و تغییرات غیرمجاز در آن اعمال نشده است.
برای امضای تصاویر Docker از ابزار Notary استفاده میشود. Notary یک ابزار متنباز است که به شما امکان میدهد تصاویر را بهصورت دیجیتالی امضا کرده و از صحت آنها اطمینان حاصل کنید.
در صورتی که از Docker Hub استفاده میکنید، این سرویس بهطور پیشفرض از امضای تصاویر پشتیبانی میکند. برای بررسی امضای یک تصویر در Docker Hub میتوانید از دستور زیر استفاده کنید:
docker trust inspect <image_name>
این دستور بررسی میکند که تصویر مورد نظر امضا شده است یا خیر و به شما این امکان را میدهد که بهراحتی آن را اعتبارسنجی کنید.
2.4. محدود کردن استفاده از تصاویر با سیاستهای امنیتی
برای محدود کردن استفاده از تصاویر غیرمعتبر و خطرناک، میتوانید از Admission Controllers استفاده کنید که درخواستهای ساخت Pods را برای استفاده از تصاویر خاص بررسی کنند. به عنوان مثال، استفاده از ImagePolicyWebhook به شما این امکان را میدهد که تصاویری که از منابع غیرمعتبر یا غیرمجاز کشیده میشوند را مسدود کنید.
نمونهای از پیکربندی ImagePolicyWebhook برای محدود کردن تصاویر:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: example-image-policy
webhooks:
- name: image-policy.example.com
clientConfig:
url: "https://your-webhook-server.com"
rules:
- operations: ["CREATE"]
apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["pods"]
با این تنظیمات، هر زمان که یک Pod جدید با Image مشخصی ایجاد شود، این درخواست از طریق Webhook بررسی خواهد شد.
2.5. تنظیمات پیکربندی در Kubernetes برای استفاده از تصاویر امن
برای افزایش امنیت در Kubernetes و جلوگیری از استفاده از تصاویر ناامن، میتوان تنظیماتی را برای kubelet و kube-apiserver اعمال کرد. برای مثال، میتوانید به Kubernetes دستور دهید که تنها از تصاویر امضا شده یا از مخازن خاص استفاده کند.
برای اعمال این تنظیمات در kube-apiserver میتوان گزینههای زیر را استفاده کرد:
--feature-gates=ImagePolicyWebhook=true
--enable-admission-plugins=ImagePolicyWebhook
این تنظیمات به Kubernetes اجازه میدهد که از ImagePolicyWebhook برای اعتبارسنجی تصاویر استفاده کند.
جمع بندی
استفاده از تصاویر معتبر و امن یکی از اصول اصلی در تضمین امنیت در Kubernetes است. با استفاده از مخازن معتبر، اسکن تصاویر برای آسیبپذیریها، امضای دیجیتالی تصاویر، و پیکربندی دقیق سیاستها و Admission Controllers میتوانید از تهدیدات امنیتی جلوگیری کرده و یک محیط امن برای اجرای کانتینرها ایجاد کنید. این اقدامات به شما کمک میکند تا از خطرات ناشی از استفاده از تصاویر آسیبپذیر یا غیرمعتبر دوری کنید و از درز دادهها و حملات به منابع کلاستر جلوگیری کنید.
امضای تصاویر کانتینرها (Container Image Signing) سخنرانی
توضیحات کامل
در این بخش، به معرفی فرآیند امضای تصاویر کانتینر، ابزارهای مورد استفاده، نحوه تنظیم و مدیریت امضای تصاویر کانتینر پرداخته میشود.
1. چرا امضای تصاویر کانتینر اهمیت دارد؟
امضای تصاویر کانتینر باعث میشود که اطمینان حاصل شود تصویر از یک منبع معتبر گرفته شده و تغییرات غیرمجاز در آن اعمال نشده است. بهطور خاص، امضای دیجیتالی تصاویر میتواند در مقابله با خطرات زیر مؤثر باشد:
- آسیبپذیریها: تصاویر منتشرشده ممکن است حاوی آسیبپذیریهایی باشند که مهاجمین میتوانند از آنها برای نفوذ به کلاستر استفاده کنند. امضای تصاویر به شما این امکان را میدهد که اطمینان حاصل کنید تصویری که استفاده میکنید از یک منبع معتبر و امن است.
- دستکاری تصاویر: تصاویر ممکن است بهوسیله مهاجمین در مخازن عمومی یا خصوصی دستکاری شوند. امضا به شما این اطمینان را میدهد که تصویر تغییر نکرده و بدون تغییرات غیرمجاز به شما تحویل داده شده است.
- کنترل دسترسی: امضاهای دیجیتال به شما این امکان را میدهند که دسترسی به تصاویر را محدود کرده و فقط از تصاویری که امضا شدهاند، استفاده کنید.
2. روشهای امضای تصاویر کانتینر
امضای تصاویر کانتینر معمولاً با استفاده از ابزارهای خاص انجام میشود که امکان امضا کردن تصاویر را بهطور خودکار و دیجیتال فراهم میکنند. برخی از مهمترین ابزارهای امضای تصاویر عبارتند از:
2.1. Docker Content Trust (DCT)
Docker Content Trust (DCT) یک ویژگی در Docker است که اجازه میدهد تصاویر Docker امضا شده و اعتبارسنجی شوند. با فعال کردن این ویژگی، Docker تنها به تصاویر امضا شده اجازه بارگذاری و اجرا میدهد. این ویژگی از Notary برای انجام امضای دیجیتال استفاده میکند.
برای فعالسازی Docker Content Trust در Docker:
export DOCKER_CONTENT_TRUST=1
پس از فعالسازی این تنظیم، زمانی که میخواهید یک تصویر را کش کنید یا به مخزن Docker push کنید، Docker تنها تصاویر امضا شده را قبول میکند. برای امضای یک تصویر، میتوانید از دستور docker trust
استفاده کنید.
برای امضای یک تصویر با استفاده از Docker:
docker trust sign <image_name>
این دستور تصویر را امضا کرده و آن را به مخزن ارسال میکند.
2.2. Notary
Notary یک ابزار متنباز است که برای امضای محتوا و تصاویر Docker استفاده میشود. این ابزار به شما این امکان را میدهد که تصاویر را بهطور دیجیتالی امضا کرده و از صحت و اعتبار آنها اطمینان حاصل کنید.
برای امضای یک تصویر با استفاده از Notary، مراحل زیر را انجام دهید:
- نصب ابزار Notary:
curl -sSL https://github.com/theupdateframework/notary/releases/download/v0.6.0/notary-0.6.0-linux-amd64.tar.gz | tar xz -C /usr/local/bin
- تنظیم Notary برای کار با Docker Hub:
برای امضای تصاویر در Docker Hub، باید ابتدا وارد حساب کاربری خود شوید:
docker login
- امضای تصویر:
notary sign <image_name>
2.3. Cosign
Cosign یک ابزار دیگر است که توسط Sigstore برای امضای تصاویر کانتینر و دیگر فایلها ایجاد شده است. Cosign به شما این امکان را میدهد که بهراحتی تصاویر Docker را امضا کنید و سپس از این امضا برای تأیید اعتبار تصویر استفاده نمایید.
برای استفاده از Cosign، ابتدا باید آن را نصب کنید:
brew install cosign
سپس میتوانید تصویر مورد نظر را امضا کنید:
cosign sign <image_name>
Cosign از KMS (Key Management Services) برای مدیریت کلیدهای امضا استفاده میکند که موجب میشود فرآیند امضا و تأیید اعتبار امنتر شود.
3. نحوه بررسی و اعتبارسنجی تصاویر امضا شده
پس از امضای یک تصویر، باید روشهایی برای بررسی صحت و اعتبار آن نیز وجود داشته باشد. برای اعتبارسنجی تصاویر امضا شده، میتوان از ابزارهای مختلف استفاده کرد.
3.1. بررسی امضای تصویر با Docker
برای بررسی امضای تصویر در Docker، میتوانید از دستور زیر استفاده کنید:
docker trust inspect <image_name>
این دستور به شما اطلاعاتی در مورد امضای تصویر و وضعیت آن را نمایش میدهد.
3.2. بررسی امضای تصویر با Cosign
برای اعتبارسنجی تصویر امضا شده با Cosign، از دستور زیر استفاده کنید:
cosign verify <image_name>
این دستور صحت امضای تصویر را بررسی میکند و در صورت معتبر بودن، اطلاعات امضا را نمایش میدهد.
4. استفاده از تصاویر امضا شده در Kubernetes
در Kubernetes میتوان از Admission Controllers برای بررسی و استفاده از تصاویر امضا شده استفاده کرد. یکی از Admission Controllers مفید برای این کار ImagePolicyWebhook است که میتواند درخواستهای ساخت Pod را بررسی کرده و تنها تصاویری که امضا شدهاند را بپذیرد.
برای پیکربندی ImagePolicyWebhook، تنظیمات زیر را در فایل mutatingwebhookconfiguration
خود قرار دهید:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: image-policy-webhook
webhooks:
- name: image-policy.example.com
clientConfig:
url: "https://your-webhook-server.com"
rules:
- operations: ["CREATE"]
apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["pods"]
این وبهوک هر بار که یک Pod ساخته میشود، تصویر آن را اعتبارسنجی کرده و فقط تصاویری که امضا شدهاند را میپذیرد.
جمع بندی
امضای تصاویر کانتینر یکی از راههای اصلی برای تأمین امنیت در استفاده از کانتینرها و Kubernetes است. این روش به شما امکان میدهد تا از تصاویر دستکاری شده و آسیبپذیر جلوگیری کنید. ابزارهای مختلفی مانند Docker Content Trust، Notary، و Cosign میتوانند در فرآیند امضای تصاویر کمک کنند و از امنیت تصاویر اطمینان حاصل کنند. علاوه بر این، استفاده از Admission Controllers در Kubernetes میتواند اطمینان حاصل کند که تنها تصاویر امضا شده در کلاستر استفاده شوند.
محدودسازی دسترسی به Registryهای خارجی سخنرانی
توضیحات کامل
استفاده از ImagePullSecrets
یکی از رایجترین روشهای محدود کردن دسترسی به Registryهای خارجی، استفاده از ImagePullSecrets است. این ویژگی به Kubernetes اجازه میدهد تا از اطلاعات احراز هویت برای دسترسی به Registryهای خصوصی استفاده کند. برای استفاده از این ویژگی، میتوان یک Secret برای نگهداری اطلاعات ورود (مانند توکنها یا کلمه عبور) به Registryهای خصوصی ایجاد کرد.
مراحل پیکربندی
- ایجاد یک Secret برای دسترسی به Registry خارجی
ابتدا یک Secret برای نگهداری اطلاعات دسترسی به Registry خارجی ایجاد میکنیم. به عنوان مثال، اگر بخواهید از Docker Hub استفاده کنید:
kubectl create secret docker-registry my-registry-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=myuser \
--docker-password=mypassword \
--docker-email=myemail@example.com
در این مثال:
my-registry-secret
: نام Secret که برای دسترسی به Docker Hub استفاده میشود.docker-server
: آدرس Registry خارجی (مثلاً Docker Hub).docker-username
: نام کاربری شما در Docker Hub.docker-password
: کلمه عبور شما در Docker Hub.docker-email
: ایمیل حساب Docker Hub شما.
- استفاده از Secret در Pod
پس از ایجاد Secret، میتوان از آن در پیکربندی Pod برای دسترسی به Registry خصوصی استفاده کرد. برای این کار، باید Secret را به صورت یک ImagePullSecret در Pod قرار دهیم. نمونهای از پیکربندی Pod که از Secret برای دسترسی به Registry خارجی استفاده میکند به شکل زیر است:
apiVersion: v1
kind: Pod
metadata:
name: my-private-pod
spec:
containers:
- name: my-container
image: my-registry.com/my-image:latest
imagePullSecrets:
- name: my-registry-secret
در این پیکربندی:
imagePullSecrets
: به Kubernetes اعلام میکند که از Secret مشخصشده برای احراز هویت هنگام کشیدن تصویر از Registry خارجی استفاده کند.
- محدود کردن دسترسی به Registry خارجی
برای محدود کردن دسترسی به Registryهای خارجی، میتوان از ابزارهای امنیتی مانند Network Policies استفاده کرد تا ترافیک به Registryهای خاص محدود شود. با ایجاد Network Policy، میتوان فقط به Registryهایی که مورد تایید هستند، دسترسی داد و از تماس با Registryهای ناامن جلوگیری کرد.
مثال برای ایجاد یک Network Policy که دسترسی به Registry خاصی را محدود میکند:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-registry-access
spec:
podSelector: {}
ingress:
- from:
- podSelector:
matchLabels:
app: trusted-app
egress:
- to:
- ipBlock:
cidr: "192.168.0.0/16" # فرض بر این است که آدرس IP Registry معتبر در این رنج قرار دارد
در این پیکربندی:
podSelector
: به Kubernetes میگوید که چه Podهایی مشمول این سیاست میشوند.ingress
وegress
: دسترسیها به منابع را کنترل میکند.ipBlock
: آدرسهای IP معتبر برای Registry محدود میشوند.
جمعبندی
برای امنیت بیشتر در Kubernetes و جلوگیری از بارگذاری تصاویر کانتینرهای غیرمجاز از Registryهای خارجی، میتوان از روشهایی همچون ImagePullSecrets برای احراز هویت به Registryها و Network Policies برای محدود کردن دسترسی به Registryهای خاص استفاده کرد. این اقدامات به شما کمک میکنند تا از امنیت بالاتری در محیط Kubernetes برخوردار باشید.
Resource Quotas:
تعریف Resource Quotas برای جلوگیری از مصرف بیش از حد منابع سخنرانی
توضیحات کامل
با استفاده از Resource Quotas، میتوان از ایجاد بار اضافی بر روی کل کلاستر جلوگیری کرده و منابع را به طور مؤثر بین پروژهها یا تیمهای مختلف تخصیص داد. این سیاستها میتوانند به کاهش خطر اختلال در عملکرد کلاستر و اطمینان از بهینهسازی استفاده از منابع کمک کنند.
ویژگیهای Resource Quotas
- محدود کردن منابع مصرفی: شما میتوانید میزان مصرف منابع همچون CPU، حافظه، تعداد Podها، تعداد PVCها و سایر منابع را در سطح Namespace مشخص کنید.
- مانیتورینگ مصرف منابع: Resource Quotas به شما کمک میکنند تا میزان مصرف منابع را در Namespaceها نظارت کرده و مانع از تجاوز از مقدار مشخصشده شوید.
- بیشتر استفاده برای محیطهای چندکاربره: در محیطهایی که چند تیم یا کاربر از یک کلاستر Kubernetes استفاده میکنند، Resource Quotas ابزار مناسبی برای مدیریت منابع است.
نحوه ایجاد و پیکربندی Resource Quotas
برای استفاده از Resource Quotas، ابتدا باید یک شیء ResourceQuota ایجاد کنید که منابع مختلفی که میخواهید محدود کنید، در آن تعریف شود.
- ایجاد ResourceQuota برای محدود کردن منابع
در این مثال، ResourceQuotaای تعریف میکنیم که مقدار مصرف حافظه و CPU را محدود میکند و تعداد Podها را نیز مشخص میکند:
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-resource-quota
namespace: my-namespace
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
pods: "10"
در این پیکربندی:
requests.cpu
وrequests.memory
: مقدار منابعی که در هر درخواست میتوان مصرف کرد.limits.cpu
وlimits.memory
: حد حداکثر منابعی که یک Pod میتواند مصرف کند.pods
: حداکثر تعداد Podهایی که میتوانند در Namespace ایجاد شوند.
- اعمال ResourceQuota به Namespace
این ResourceQuota به طور خاص برای Namespace my-namespace
تعریف شده است. به این ترتیب، هر Pod یا شیء دیگری که در این Namespace ایجاد میشود، باید از این محدودیتها تبعیت کند.
- مشاهده وضعیت Resource Quotas
برای بررسی وضعیت مصرف منابع در یک Namespace خاص و میزان استفاده از ResourceQuota، میتوان از دستور زیر استفاده کرد:
kubectl get resourcequota -n my-namespace
این دستور اطلاعاتی در مورد میزان استفاده از منابع موجود و میزان مصرف فعلی در Namespace مورد نظر نمایش میدهد.
- استفاده از Resource Quotas برای دیگر منابع
علاوه بر محدود کردن CPU و حافظه، ResourceQuota میتواند برای محدود کردن انواع دیگری از منابع مانند تعداد Services، PVCها، ConfigMapها و Secrets نیز مورد استفاده قرار گیرد. در زیر یک مثال برای محدود کردن تعداد Services و PVCها آورده شده است:
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-resource-quota
namespace: my-namespace
spec:
hard:
services: "5"
persistentvolumeclaims: "5"
جمعبندی
Resource Quotas در Kubernetes ابزاری قدرتمند برای جلوگیری از مصرف بیش از حد منابع در یک کلاستر است. این ابزار امکان تخصیص منابع به طور دقیقتر را در محیطهای چندکاربره فراهم میآورد و از ایجاد ترافیک اضافی یا بارگذاری بیش از حد منابع جلوگیری میکند. با استفاده از Resource Quotas، مدیران سیستم میتوانند سطح منابعی که هر Namespace یا کاربر میتواند استفاده کند را به دقت کنترل کنند، که این امر به بهبود عملکرد و مدیریت منابع در کلاستر کمک میکند.
مدیریت دسترسی تیمها به منابع مشخص سخنرانی
توضیحات کامل
با این روشها، میتوانید منابع مختلف مانند Pods، Services، ConfigMaps، Secrets و دیگر منابع را به تیمها یا گروههای خاص اختصاص دهید و دسترسی آنها را مطابق با نیازهای کاریشان محدود کنید. این کار به افزایش امنیت و کارآمدی در استفاده از منابع کمک میکند.
نحوه مدیریت دسترسی تیمها به منابع
- استفاده از Namespaces برای جداسازی منابع
یکی از سادهترین روشها برای مدیریت دسترسی به منابع، استفاده از Namespaces است. با ایجاد Namespaceهای جداگانه برای هر تیم یا پروژه، میتوانید منابع مرتبط با هر تیم را به طور مستقل از یکدیگر مدیریت کنید و دسترسی تیمها به منابع را محدود کنید.
برای مثال، اگر دو تیم A و B دارید، میتوانید دو Namespace مجزا برای هر کدام ایجاد کنید:
kubectl create namespace team-a
kubectl create namespace team-b
در این حالت، منابع مربوط به هر تیم در فضای مخصوص به خود قرار میگیرند و شما میتوانید دسترسی تیمها را به منابع داخل این Namespaces محدود کنید.
- استفاده از RBAC برای مدیریت دسترسی به منابع
برای مدیریت دسترسی دقیقتر، از RBAC (Role-Based Access Control) استفاده میکنیم که اجازه میدهد دسترسی به منابع مشخص بر اساس نقشهای تعریفشده تعیین شود. در این سیستم، میتوانید برای هر تیم یا کاربر، نقشهایی ایجاد کرده و دسترسی به منابع را به آن نقشها اختصاص دهید.
مراحل ایجاد Role و RoleBinding
- Role: یک Role مجموعهای از مجوزها را برای منابع در داخل یک Namespace خاص تعریف میکند.
- RoleBinding: از طریق RoleBinding میتوانید یک Role را به کاربران یا Service Accountها در یک Namespace خاص اختصاص دهید.
مثال از ایجاد Role برای دسترسی به Pods در Namespace خاص:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
در این مثال، Role به نام pod-reader
تعریف شده است که فقط اجازه دسترسی به Pods در Namespace team-a
را با دسترسیهای get
و list
میدهد.
سپس با استفاده از RoleBinding میتوان این Role را به یک کاربر یا Service Account اختصاص داد:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: team-a
subjects:
- kind: User
name: "team-a-user" # نام کاربری که میخواهیم به این Role اختصاص دهیم
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
در این مثال، RoleBinding به کاربر team-a-user
در Namespace team-a
اجازه میدهد تا از Role pod-reader
استفاده کند.
- استفاده از Service Accounts برای تخصیص دسترسی
Service Accounts در Kubernetes به شما این امکان را میدهند که دسترسیها را به کانتینرها و Pods اختصاص دهید. با استفاده از Service Accounts میتوان دسترسی به منابع را به صورت دقیق کنترل کرد.
برای ایجاد یک Service Account برای تیم A:
kubectl create serviceaccount team-a-sa -n team-a
سپس میتوانید این Service Account را در پیکربندی Podها یا Deployments برای هر تیم مشخص کنید تا دسترسیهای آن تیم را مدیریت کنید.
نمونهای از تنظیمات ServiceAccount در Pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: team-a
spec:
serviceAccountName: team-a-sa
containers:
- name: mycontainer
image: nginx
در این مثال، Pod به Service Account team-a-sa
در Namespace team-a
متصل است و دسترسیها بر اساس این Service Account مدیریت میشوند.
- استفاده از Network Policies برای محدودسازی ترافیک بین تیمها
در Kubernetes میتوان از Network Policies برای محدود کردن ترافیک بین Pods در داخل Namespaceهای مختلف یا بین تیمها استفاده کرد. این Policies میتوانند به شما کمک کنند که کنترل دقیقی بر روی ارتباطات شبکهای بین تیمها داشته باشید.
به طور مثال، میتوانید دسترسی به Pods تیم A را از تیم B مسدود کنید:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-team-b
namespace: team-a
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
team: "b"
این NetworkPolicy مانع از این میشود که Pods در Namespace team-b
به Pods در Namespace team-a
دسترسی داشته باشند.
جمعبندی
مدیریت دسترسی تیمها به منابع در Kubernetes از اهمیت زیادی برخوردار است. با استفاده از ابزارهایی مانند Namespaces، RBAC، Service Accounts و Network Policies میتوان دسترسی دقیق به منابع را در سطح کلاستر کنترل کرد. این روشها کمک میکنند تا هر تیم یا کاربر تنها به منابع مربوط به خود دسترسی داشته باشد و از ایجاد تداخل یا سوءاستفاده از منابع جلوگیری شود.
فصل 6. مدیریت گواهینامهها و TLS
TLS/SSL در Kubernetes:
پیکربندی TLS برای ارتباطات بین سرویسها سخنرانی
توضیحات کامل
در این قسمت، به نحوه پیکربندی TLS برای ارتباطات بین سرویسها در Kubernetes پرداخته خواهد شد.
مراحل پیکربندی TLS برای ارتباطات بین سرویسها
- ایجاد گواهینامههای TLS و کلیدها
برای استفاده از TLS، اولین قدم ایجاد گواهینامهها و کلیدهای SSL است. این گواهینامهها باید توسط یک Certificate Authority (CA) امضا شوند تا اعتبار داشته باشند.
برای تولید یک Certificate و Private Key برای استفاده در Kubernetes میتوان از دستور openssl
استفاده کرد:
# ایجاد کلید خصوصی
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
# ایجاد گواهینامه CSR (Certificate Signing Request)
openssl req -new -key server.key -out server.csr -subj "/CN=example.com/O=myorg"
# امضای گواهینامه با استفاده از CA
openssl x509 -req -in server.csr -signkey server.key -out server.crt
در این مرحله، شما دو فایل server.crt
(گواهینامه) و server.key
(کلید خصوصی) خواهید داشت که برای پیکربندی TLS نیاز دارید.
- استفاده از Secrets برای ذخیره گواهینامهها و کلیدها
در Kubernetes، شما میتوانید از Secrets برای ذخیره اطلاعات حساس مانند گواهینامهها و کلیدهای TLS استفاده کنید.
برای ذخیره گواهینامهها و کلیدها به صورت Secret، از دستور زیر استفاده کنید:
kubectl create secret tls my-tls-secret --cert=server.crt --key=server.key -n mynamespace
در این دستور:
my-tls-secret
: نام Secretserver.crt
: گواهینامهserver.key
: کلید خصوصیmynamespace
: Namespace که Secret در آن ذخیره میشود
- پیکربندی سرویس برای استفاده از TLS
برای استفاده از TLS در ارتباطات بین سرویسها، باید سرویسها را به گونهای پیکربندی کنید که از گواهینامههای TLS استفاده کنند. این کار معمولاً با استفاده از Ingress Controller یا Mutual TLS (mTLS) انجام میشود.
به عنوان مثال، اگر از Ingress Controller برای مدیریت ترافیک ورودی استفاده میکنید، باید TLS را در Ingress پیکربندی کنید:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: my-tls-secret
در این مثال، گواهینامه TLS از Secret my-tls-secret
استفاده میکند تا ترافیک ورودی به example.com
را به صورت امن رمزنگاری کند.
- پیکربندی Mutual TLS (mTLS) برای ارتباطات داخلی
برای ارتباطات امن بین سرویسها در داخل کلاستر، میتوان از Mutual TLS (mTLS) استفاده کرد که در آن هر دو طرف ارتباط (سرویسها) برای اعتبارسنجی و رمزنگاری ترافیک، گواهینامههای TLS خود را ارسال میکنند. برای پیادهسازی mTLS، میتوان از Istio یا Linkerd به عنوان سرویس مش (Service Mesh) استفاده کرد.
به طور مثال، با Istio میتوانید Peer Authentication و DestinationRule را برای تنظیم mTLS بین سرویسها پیکربندی کنید:
- ایجاد Peer Authentication برای اجبار mTLS:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: mynamespace
spec:
mtls:
mode: STRICT
- ایجاد DestinationRule برای تنظیم mTLS:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
namespace: mynamespace
spec:
host: my-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
در این مثال، Istio به طور خودکار mTLS را بین سرویسها فعال میکند.
- پیکربندی سرویسها برای استفاده از TLS
هر سرویس که قرار است از TLS استفاده کند، باید به گونهای پیکربندی شود که از گواهینامه و کلیدهای TLS استفاده کند. این پیکربندی معمولاً در بخش containers در فایلهای YAML برای هر سرویس انجام میشود. به عنوان مثال، در یک سرویس که نیاز به TLS دارد، میتوانید از Secretهای ذخیرهشده برای تنظیم گواهینامه و کلید استفاده کنید:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
namespace: mynamespace
spec:
replicas: 1
template:
spec:
containers:
- name: my-container
image: myimage
volumeMounts:
- name: tls-secret
mountPath: /etc/tls
readOnly: true
volumes:
- name: tls-secret
secret:
secretName: my-tls-secret
در این پیکربندی، گواهینامه و کلید TLS از Secret my-tls-secret
به داخل کانتینر مونت میشود و سرویس میتواند از آن برای رمزنگاری و ارتباطات امن استفاده کند.
جمعبندی
پیکربندی TLS برای ارتباطات بین سرویسها در Kubernetes یکی از مهمترین اقدامات برای حفظ امنیت دادهها در حال انتقال است. با استفاده از gRPC و Mutual TLS (mTLS) میتوان ارتباطات امنی بین سرویسها فراهم کرد. مراحل این کار شامل ایجاد گواهینامههای TLS، ذخیرهسازی آنها به صورت Secret، پیکربندی سرویسها برای استفاده از TLS، و استفاده از Istio یا Linkerd برای پشتیبانی از mTLS میباشد. این روشها باعث میشوند که ارتباطات بین سرویسها در کلاستر Kubernetes به صورت رمزنگاریشده و امن انجام شود.
ایجاد و مدیریت گواهینامههای TLS سخنرانی
توضیحات کامل
مراحل ایجاد و مدیریت گواهینامههای TLS
- ایجاد گواهینامههای خودامضا (Self-Signed Certificates)
برای تست یا استفاده در محیطهایی که نیاز به گواهینامههای معتبر از یک Certificate Authority (CA) ندارند، میتوان از گواهینامههای خودامضا استفاده کرد. برای ایجاد یک گواهینامه خودامضا از ابزار openssl استفاده میکنیم.
ایجاد گواهینامه و کلید خصوصی با استفاده از دستور openssl:
# ایجاد یک کلید خصوصی
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
# ایجاد درخواست گواهینامه (CSR)
openssl req -new -key server.key -out server.csr -subj "/CN=example.com/O=myorg"
# امضای گواهینامه با استفاده از کلید خصوصی
openssl x509 -req -in server.csr -signkey server.key -out server.crt
در اینجا:
server.key
: کلید خصوصیserver.crt
: گواهینامه
- استفاده از Kubernetes Secrets برای ذخیره گواهینامهها و کلیدها
پس از ایجاد گواهینامه و کلید، شما میتوانید این فایلها را در Kubernetes Secrets ذخیره کنید تا به صورت امن درون کلاستر استفاده شوند. برای ذخیره گواهینامه و کلید در یک Secret، دستور زیر را اجرا کنید:
kubectl create secret tls my-tls-secret --cert=server.crt --key=server.key -n mynamespace
در این دستور:
my-tls-secret
: نام Secretserver.crt
: فایل گواهینامهserver.key
: فایل کلید خصوصیmynamespace
: نام namespace که Secret در آن ذخیره میشود.
- ایجاد گواهینامههای معتبر از یک CA
اگر شما نیاز به گواهینامهای دارید که توسط یک Certificate Authority (CA) معتبر امضا شده باشد، میتوانید از CAهای معتبر مانند Let’s Encrypt استفاده کنید. برای استفاده از گواهینامههای صادر شده توسط یک CA، معمولاً لازم است که درخواست CSR به CA ارسال شود.
با استفاده از ابزارهایی مانند cert-manager در Kubernetes، میتوانید فرآیند درخواست، تمدید و مدیریت گواهینامههای TLS را خودکار کنید. cert-manager از پروتکلهایی مانند ACME (که توسط Let’s Encrypt پشتیبانی میشود) برای درخواست گواهینامههای TLS از یک CA استفاده میکند.
برای نصب cert-manager و پیکربندی آن برای استفاده از Let’s Encrypt، مراحل زیر را دنبال کنید:
- نصب cert-manager:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml
- ایجاد یک Issuer برای درخواست گواهینامه از Let’s Encrypt:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
namespace: mynamespace
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: nginx
- درخواست گواهینامه با استفاده از cert-manager:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-tls-certificate
namespace: mynamespace
spec:
secretName: my-tls-secret
issuerRef:
name: letsencrypt-prod
kind: Issuer
commonName: example.com
dnsNames:
- example.com
با این پیکربندی، cert-manager به صورت خودکار گواهینامهای از Let’s Encrypt برای دامنه example.com
درخواست میکند و آن را به صورت یک Secret در Kubernetes ذخیره میکند.
- مدیریت دورهای گواهینامهها (Certificate Rotation)
گواهینامهها معمولاً یک تاریخ انقضا دارند، بنابراین نیاز به چرخش گواهینامهها (certificate rotation) وجود دارد. در Kubernetes، میتوانید از ابزارهایی مانند cert-manager برای چرخش خودکار گواهینامهها استفاده کنید.
cert-manager به طور خودکار گواهینامهها را تمدید میکند و اگر تاریخ انقضا نزدیک باشد، گواهینامه جدیدی ایجاد کرده و آن را در Secret ذخیره میکند.
اگر از گواهینامههای دستی استفاده میکنید، باید به صورت دستی تاریخ انقضای گواهینامهها را بررسی کرده و آنها را تمدید کنید.
- پیکربندی TLS در سرویسها
پس از ایجاد گواهینامهها، میتوانید از آنها در سرویسهای خود استفاده کنید. برای این کار، گواهینامه و کلید TLS باید به سرویسهایی که نیاز به ارتباط امن دارند، متصل شوند. این کار معمولاً با استفاده از Secrets انجام میشود.
یک سرویس نمونه که از گواهینامه TLS استفاده میکند:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-tls-app
namespace: mynamespace
spec:
replicas: 1
template:
spec:
containers:
- name: my-app-container
image: myimage
ports:
- containerPort: 443
volumeMounts:
- name: tls-volume
mountPath: /etc/tls
readOnly: true
volumes:
- name: tls-volume
secret:
secretName: my-tls-secret
در این پیکربندی، گواهینامه و کلید TLS از Secret my-tls-secret
به داخل کانتینر مونت میشود و برنامه میتواند از آن برای ارتباطات امن استفاده کند.
جمعبندی
ایجاد و مدیریت گواهینامههای TLS یکی از مهمترین اقدامات برای تأمین ارتباطات امن در Kubernetes است. شما میتوانید گواهینامههای خودامضا برای استفاده داخلی یا گواهینامههای معتبر از CAها مانند Let’s Encrypt ایجاد کنید. پس از ایجاد گواهینامهها، باید آنها را در Kubernetes ذخیره کنید و از Secrets برای پیکربندی سرویسها استفاده کنید. همچنین، برای مدیریت گواهینامهها، ابزارهایی مانند cert-manager میتوانند به شما کمک کنند تا گواهینامهها را به طور خودکار تمدید و مدیریت کنید.
Cert Manager:
استفاده از Cert Manager برای مدیریت خودکار گواهینامهها سخنرانی
توضیحات کامل
در این بخش، نحوه استفاده از Cert Manager برای مدیریت خودکار گواهینامهها را بررسی خواهیم کرد.
مراحل استفاده از Cert Manager
- نصب Cert Manager
ابتدا باید Cert Manager را در کلاستر Kubernetes خود نصب کنید. نصب Cert Manager از طریق دستور زیر انجام میشود:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml
این دستور، تمامی منابع لازم برای اجرای Cert Manager را در کلاستر Kubernetes شما نصب میکند.
- ایجاد Issuer یا ClusterIssuer
برای درخواست گواهینامهها، باید یک Issuer یا ClusterIssuer ایجاد کنید. Issuer برای یک namespace خاص و ClusterIssuer برای تمام کلاستر به کار میرود.
برای استفاده از Let’s Encrypt، از یک Issuer یا ClusterIssuer استفاده میکنیم که از پروتکل ACME پشتیبانی کند. برای استفاده از Let’s Encrypt در حالت Production، میتوان از دستور زیر برای ایجاد یک ClusterIssuer استفاده کرد:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: nginx
در این پیکربندی:
server
: آدرس سرور Let’s Encryptemail
: ایمیل شما که برای ثبت درخواستها در Let’s Encrypt استفاده میشودprivateKeySecretRef
: نام Secret که کلید خصوصی مربوط به این Issuer را ذخیره میکند.solvers
: تنظیماتی که نشان میدهند Cert Manager چگونه میتواند چالشهای DNS یا HTTP را حل کند (در این مثال از روش HTTP استفاده شده است).
برای ایجاد این ClusterIssuer در Kubernetes از دستور زیر استفاده کنید:
kubectl apply -f letsencrypt-prod-clusterissuer.yaml
- ایجاد درخواست گواهینامه (Certificate)
پس از ایجاد Issuer یا ClusterIssuer، میتوانید از آن برای درخواست گواهینامه استفاده کنید. برای این کار، یک Certificate ایجاد میکنیم.
به عنوان مثال، برای درخواست گواهینامه برای دامنه example.com
، فایل YAML زیر را ایجاد میکنیم:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-tls-certificate
namespace: mynamespace
spec:
secretName: my-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: example.com
dnsNames:
- example.com
در این پیکربندی:
secretName
: نام Secret که گواهینامه و کلید خصوصی در آن ذخیره خواهند شد.issuerRef
: ارجاع به Issuer یا ClusterIssuer که گواهینامه را صادر میکند.commonName
: نام دامنهای که گواهینامه برای آن صادر میشود.dnsNames
: لیستی از نامهای دامنه برای گواهینامه.
برای ایجاد این Certificate در Kubernetes، دستور زیر را اجرا میکنیم:
kubectl apply -f my-tls-certificate.yaml
پس از اعمال این پیکربندی، Cert Manager به صورت خودکار گواهینامه را از Let’s Encrypt درخواست کرده و آن را به Secret my-tls-secret
ذخیره میکند.
- استفاده از گواهینامه در سرویسها
پس از درخواست گواهینامه، شما میتوانید از این گواهینامه در سرویسها یا Ingressها استفاده کنید. برای مثال، میتوانید گواهینامه صادر شده را در یک Ingress برای سرویس خود استفاده کنید.
یک پیکربندی نمونه برای استفاده از گواهینامه TLS در Ingress به صورت زیر است:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
tls:
- hosts:
- example.com
secretName: my-tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
در این پیکربندی:
- بخش
tls
مشخص میکند که این Ingress از گواهینامه TLS برای دامنهexample.com
استفاده کند. secretName
: نام Secret که گواهینامه TLS در آن ذخیره شده است.
- مدیریت تمدید گواهینامهها
Cert Manager به صورت خودکار گواهینامهها را تمدید میکند. زمانی که یک گواهینامه در حال منقضی شدن باشد، Cert Manager یک درخواست جدید برای گواهینامه میفرستد و پس از دریافت گواهینامه جدید، آن را به صورت خودکار در Secret مربوطه به روز میکند.
با استفاده از cert-manager دیگر نیازی به نگرانی در مورد تمدید دستی گواهینامهها نخواهید داشت و این فرآیند به طور کامل خودکار خواهد بود.
جمعبندی
Cert Manager یک ابزار قوی برای مدیریت گواهینامههای TLS در Kubernetes است که میتواند درخواست، تمدید و مدیریت گواهینامهها را به صورت خودکار انجام دهد. با استفاده از Cert Manager میتوانید گواهینامهها را از Let’s Encrypt یا منابع دیگر دریافت کنید و آنها را در Kubernetes به طور ایمن ذخیره کرده و از آنها در سرویسها و Ingressها استفاده کنید. همچنین، Cert Manager به صورت خودکار گواهینامهها را تمدید کرده و این فرآیند را برای شما ساده میکند.
صدور و تمدید خودکار گواهینامههای SSL سخنرانی
توضیحات کامل
در این بخش، به بررسی نحوه صدور و تمدید خودکار گواهینامههای SSL با استفاده از Cert Manager خواهیم پرداخت.
مراحل صدور و تمدید خودکار گواهینامههای SSL
- نصب Cert Managerبرای استفاده از Cert Manager در Kubernetes، ابتدا باید این ابزار را نصب کنید. دستور نصب Cert Manager از طریق Kubernetes به شرح زیر است:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml
این دستور تمام منابع لازم برای راهاندازی Cert Manager را در کلاستر Kubernetes شما نصب میکند.
- ایجاد Issuer یا ClusterIssuerبرای درخواست گواهینامههای SSL، نیاز است تا یک Issuer یا ClusterIssuer ایجاد کنید. Issuer مخصوص یک namespace است و ClusterIssuer بهطور سراسری در تمام کلاستر در دسترس است.برای استفاده از Let’s Encrypt در Cert Manager، میتوان از یک ClusterIssuer استفاده کرد که از پروتکل ACME پشتیبانی کند. نمونهای از پیکربندی ClusterIssuer برای Let’s Encrypt به شرح زیر است:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com privateKeySecretRef: name: letsencrypt-prod-key solvers: - http01: ingress: class: nginx
در این پیکربندی:
server
: سرور ACME که به Let’s Encrypt اشاره دارد.email
: ایمیلی که برای مدیریت درخواستها استفاده میشود.privateKeySecretRef
: Secret برای ذخیره کلید خصوصی مربوط به درخواستهای ACME.solvers
: روشهایی که Cert Manager برای حل چالشهای دامنه استفاده میکند. در این مثال، از چالش HTTP استفاده شده است.
برای ایجاد این ClusterIssuer از دستور زیر استفاده کنید:
kubectl apply -f letsencrypt-prod-clusterissuer.yaml
- درخواست گواهینامه SSLپس از ایجاد Issuer یا ClusterIssuer، میتوانید درخواست گواهینامه SSL برای دامنههای خود ارسال کنید. در اینجا، یک Certificate ایجاد میکنیم که به Issuer یا ClusterIssuer ارجاع میدهد و برای دامنهی خاص گواهینامه درخواست میکند.نمونهای از درخواست گواهینامه برای دامنه
example.com
به شکل زیر است:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-com-tls namespace: default spec: secretName: example-com-tls-secret issuerRef: name: letsencrypt-prod kind: ClusterIssuer commonName: example.com dnsNames: - example.com
در این پیکربندی:
secretName
: نام Secret که گواهینامه و کلید خصوصی آن ذخیره خواهند شد.issuerRef
: ارجاع به Issuer یا ClusterIssuer که مسئول صدور گواهینامه است.commonName
: نام دامنهای که گواهینامه برای آن درخواست میشود.dnsNames
: لیستی از نامهای دامنه که گواهینامه برای آنها معتبر خواهد بود.
برای درخواست گواهینامه از دستور زیر استفاده کنید:
kubectl apply -f example-com-tls-certificate.yaml
- استفاده از گواهینامه در سرویسها و Ingressبعد از دریافت گواهینامه، میتوانید از آن در سرویسها یا Ingressها استفاده کنید. در اینجا، از گواهینامه SSL صادر شده برای یک Ingress استفاده خواهیم کرد.نمونهای از پیکربندی Ingress برای استفاده از گواهینامه SSL به شکل زیر است:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress namespace: default annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/secure-backends: "true" spec: tls: - hosts: - example.com secretName: example-com-tls-secret rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-service port: number: 80
در این پیکربندی:
- بخش
tls
مشخص میکند که این Ingress از گواهینامه SSL برای دامنهexample.com
استفاده کند. secretName
: نام Secret که گواهینامه و کلید خصوصی در آن ذخیره شده است.
- بخش
- مدیریت تمدید گواهینامههاCert Manager به صورت خودکار گواهینامهها را تمدید میکند. زمانی که یک گواهینامه به پایان اعتبار خود نزدیک میشود، Cert Manager به طور خودکار درخواست تمدید ارسال کرده و پس از دریافت گواهینامه جدید، آن را به Secret مربوطه بروزرسانی میکند.تمدید خودکار گواهینامهها به صورت کاملاً اتوماتیک انجام میشود و شما نیازی به نگرانی برای تمدید دستی گواهینامهها نخواهید داشت.
جمعبندی
با استفاده از Cert Manager، میتوان فرآیند صدور و تمدید خودکار گواهینامههای SSL/TLS را بهطور ساده و امن مدیریت کرد. این ابزار با استفاده از منابع مانند Let’s Encrypt و دیگر سرویسها، گواهینامهها را به طور خودکار درخواست، صادر و تمدید میکند. همچنین، این گواهینامهها بهراحتی در Ingressها و سرویسهای Kubernetes استفاده میشوند و این روند بهصورت خودکار مدیریت میشود، که به بهبود امنیت ارتباطات در Kubernetes کمک میکند.
فصل 7. شناسایی و رفع آسیبپذیریها
بررسی حملات رایج مانند Privilege Escalation و Data Exfiltration سخنرانی
توضیحات کامل
بررسی حملات رایج در Kubernetes
1. Privilege Escalation
Privilege Escalation به معنای ارتقاء دسترسی یک کاربر یا فرآیند از سطح دسترسی پایینتر به سطح بالاتر (مثلاً از کاربر معمولی به کاربر ریشه) است. این حمله یکی از بزرگترین تهدیدات در هر سیستمعامل و بهویژه در Kubernetes است که میتواند به نفوذگران اجازه دهد تا دسترسی کامل به کلاستر داشته باشند.
در Kubernetes، چندین سناریو وجود دارد که میتوانند موجب Privilege Escalation شوند، از جمله:
- اجرای کانتینر با دسترسی ریشه (root): یکی از شایعترین دلایل این نوع حمله، اجرای کانتینرها با دسترسی ریشه است. اگر کانتینری که بهطور اشتباه با دسترسی ریشه اجرا شود، مهاجم میتواند به راحتی دسترسی به سیستم عامل میزبان پیدا کند.
- استفاده از Podهای Privileged: Podهایی که در حالت privileged اجرا میشوند، بهطور کامل به منابع سیستم عامل میزبان دسترسی دارند. این باعث میشود که اگر مهاجم بتواند به یک Pod privileged دسترسی پیدا کند، بهطور بالقوه قادر به اجرای دستورات مدیریتی بر روی سیستم میزبان باشد.
- استفاده از Capabilities لینوکس: اگر یک کانتینر دارای دسترسی به قابلیتهای خاص لینوکس باشد، میتواند به راحتی از این قابلیتها برای ارتقاء دسترسی خود استفاده کند.
برای جلوگیری از Privilege Escalation، توصیههایی وجود دارد:
- اطمینان حاصل کنید که Security Context کانتینرها و Podها بهدرستی پیکربندی شدهاند.
- از Pod Security Policies (اگرچه بهطور رسمی Deprecated شده است) یا جایگزینهای آن برای محدودسازی دسترسیهای غیرضروری استفاده کنید.
- کانتینرها را با کاربرهای غیر ریشه اجرا کنید و از اجرای کانتینرها در حالت privileged خودداری کنید.
- بهجای اعطای دسترسی کامل به قابلیتهای سیستم، تنها آن دسته از قابلیتهای لینوکس را که برای عملکرد کانتینر لازم است، اعطا کنید.
2. Data Exfiltration
Data Exfiltration به معنای انتقال غیرمجاز دادهها از یک سیستم به مقصد دیگر است. این نوع حمله در Kubernetes میتواند از طریق کانتینرها، Podها و یا حتی سرویسهای خارجی انجام شود. در محیط Kubernetes، موارد زیر میتوانند منجر به Data Exfiltration شوند:
- دسترسی به Secrets و ConfigMaps: اگر یک مهاجم بتواند به Secrets و ConfigMaps که معمولاً شامل اطلاعات حساس مانند توکنهای دسترسی، رمزهای عبور و کلیدهای API هستند، دسترسی پیدا کند، ممکن است بتواند دادههای حساسی را استخراج کند.
- عدم مدیریت دسترسی به منابع: اگر دسترسی به منابع مختلف Kubernetes بهدرستی مدیریت نشود، ممکن است مهاجم بتواند به منابعی که به او تعلق ندارد، دسترسی پیدا کند و دادههای مهم را از سیستم خارج کند.
- عدم استفاده از Encryption: اگر دادهها در حال انتقال و یا ذخیرهسازی رمزنگاری نشوند، ممکن است در حین انتقال دادهها به بیرون از شبکه یا در زمان ذخیرهسازی بهراحتی قابل استخراج باشند.
برای جلوگیری از Data Exfiltration، اقدامات زیر میتوانند مفید باشند:
- استفاده از RBAC برای محدودسازی دسترسی به منابع حساس.
- تنظیم Network Policies برای مسدود کردن ترافیک خروجی غیرمجاز از Podها.
- ذخیرهسازی و انتقال دادهها با استفاده از Encryption بهویژه در حالت Encryption at Rest و Encryption in Transit.
- محدودسازی دسترسی به Secrets و ConfigMaps و استفاده از روشهایی مانند HashiCorp Vault یا Kubernetes Secrets Management برای مدیریت دادههای حساس.
- بررسی و نظارت دقیق بر Audit Logs برای شناسایی هرگونه فعالیت مشکوک در سیستم.
جمعبندی
حملات Privilege Escalation و Data Exfiltration از جمله حملات رایج و خطرناک در محیطهای Kubernetes هستند که میتوانند آسیبهای جدی به امنیت سیستم وارد کنند. برای مقابله با این تهدیدات، پیادهسازی کنترلهای امنیتی مناسب نظیر RBAC، استفاده از Network Policies برای محدودسازی ترافیک شبکه، و تنظیم Security Context کانتینرها بهدرستی ضروری است. علاوه بر این، استفاده از گواهینامههای امنیتی مانند Encryption در تمام مراحل ذخیرهسازی و انتقال دادهها میتواند از Data Exfiltration جلوگیری کند.
ابزارهای شناسایی آسیبپذیری:
استفاده از ابزارهای امنیتی مانند Trivy و Kube-bench سخنرانی
توضیحات کامل
1. استفاده از Trivy
Trivy یک ابزار شناخته شده و متنباز برای شناسایی آسیبپذیریها در تصاویر Docker است. این ابزار به طور ویژه برای یافتن آسیبپذیریها در کانتینرها و بستههای نرمافزاری که در آنها وجود دارد، طراحی شده است. Trivy میتواند آسیبپذیریهای موجود در images، file systems و Git repositories را شناسایی کند.
ویژگیهای Trivy:
- اسکن تصاویر Docker: Trivy میتواند بهطور خودکار تصاویر Docker را اسکن کرده و آسیبپذیریهای موجود را شناسایی کند.
- پشتیبانی از انواع آسیبپذیریها: آسیبپذیریهای مربوط به کتابخانهها و پکیجها، سیستمعاملها و کانتینرها را شناسایی میکند.
- پشتیبانی از اسکن در زمان واقعی: میتوان آن را بهطور خودکار در سیستم CI/CD برای اسکن تصاویر در زمان ساخت اضافه کرد.
نصب Trivy:
برای نصب Trivy در سیستم خود، میتوانید از دستور زیر استفاده کنید:
# برای سیستمهای مبتنی بر Debian/Ubuntu:
sudo apt-get install -y wget
wget https://github.com/aquasecurity/trivy/releases/download/v0.39.0/trivy_0.39.0_Linux-64bit.deb
sudo dpkg -i trivy_0.39.0_Linux-64bit.deb
# برای سیستمهای macOS:
brew install aquasecurity/trivy/trivy
اسکن تصاویر با Trivy:
برای اسکن یک تصویر Docker با استفاده از Trivy، میتوانید دستور زیر را اجرا کنید:
trivy image <image_name>
مثال:
trivy image ubuntu:latest
این دستور تمامی آسیبپذیریهای موجود در تصویر ubuntu:latest
را شناسایی کرده و نمایش میدهد.
2. استفاده از Kube-bench
Kube-bench یک ابزار متنباز است که بهطور خاص برای ارزیابی امنیتی کلاسترهای Kubernetes طراحی شده است. این ابزار با استفاده از معیارهای CIS Kubernetes Benchmark (CIS Kubernetes Security Benchmark) به بررسی پیکربندیهای امنیتی در کلاسترهای Kubernetes میپردازد و گزارشهایی از آسیبپذیریها و تنظیمات نادرست ارائه میدهد.
ویژگیهای Kube-bench:
- مطابقت با CIS Kubernetes Benchmark: این ابزار بهطور دقیق تنظیمات امنیتی را با استانداردهای CIS مقایسه میکند.
- ارزیابی خودکار کلاستر: Kube-bench بهطور خودکار پیکربندیهای مختلف کلاستر را بررسی کرده و گزارشی از آسیبپذیریها و مشکلات امنیتی آنها ارائه میدهد.
- گزارشدهی جامع: گزارشهایی دقیق و جزئی از وضعیت امنیتی کلاستر و هشدارهای مربوط به مسائل امنیتی دریافت میکنید.
نصب Kube-bench:
برای نصب Kube-bench، میتوانید از دستور زیر استفاده کنید:
# دانلود و نصب Kube-bench بهصورت مستقیم از GitHub:
curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.0/kube-bench-0.6.0-linux-amd64.tar.gz -o kube-bench.tar.gz
tar -xvzf kube-bench.tar.gz
cd kube-bench-0.6.0-linux-amd64
sudo mv kube-bench /usr/local/bin/
اجرای Kube-bench:
برای اجرای Kube-bench و بررسی وضعیت امنیتی کلاستر Kubernetes، دستور زیر را وارد کنید:
kube-bench run --targets Node
این دستور تنظیمات امنیتی مربوط به Node در کلاستر را بررسی میکند. شما میتوانید با تغییر گزینه --targets
به بررسی دیگر بخشها (مانند ControlPlane
یا Etcd
) بپردازید.
پیکربندی و گزارشدهی:
پس از اجرای Kube-bench، گزارشی شامل مشکلات امنیتی و تنظیمات نادرست کلاستر نمایش داده میشود. شما میتوانید این گزارشها را برای اصلاح و بهبود امنیت کلاستر خود استفاده کنید.
جمعبندی
برای شناسایی و مدیریت آسیبپذیریها در محیط Kubernetes، استفاده از ابزارهای امنیتی مانند Trivy و Kube-bench بسیار مؤثر است. Trivy ابزاری عالی برای شناسایی آسیبپذیریهای موجود در تصاویر Docker است، در حالی که Kube-bench به شما کمک میکند تا وضعیت امنیتی کلاستر Kubernetes خود را با معیارهای معتبر جهانی ارزیابی کنید. استفاده از این ابزارها به شما این امکان را میدهد که مشکلات امنیتی را شناسایی کرده و تدابیر لازم را برای رفع آنها اتخاذ کنید.
اسکن Cluster برای شناسایی تنظیمات ناامن سخنرانی
توضیحات کامل
در این بخش، به دو ابزار محبوب و کارآمد برای اسکن کلاستر Kubernetes و شناسایی تنظیمات ناامن، یعنی Kube-bench و kube-score خواهیم پرداخت.
1. استفاده از Kube-bench برای اسکن تنظیمات ناامن کلاستر
Kube-bench یکی از ابزارهای قدرتمند و متنباز است که برای اسکن و ارزیابی تنظیمات امنیتی کلاسترهای Kubernetes طراحی شده است. این ابزار از معیارهای CIS Kubernetes Benchmark استفاده میکند و میتواند تنظیمات ناامن موجود در کلاستر را شناسایی کند.
مراحل نصب و استفاده از Kube-bench:
- نصب Kube-bench: برای نصب این ابزار، میتوانید از دستور زیر استفاده کنید:
# دانلود و نصب Kube-bench بهصورت مستقیم از GitHub: curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.0/kube-bench-0.6.0-linux-amd64.tar.gz -o kube-bench.tar.gz tar -xvzf kube-bench.tar.gz cd kube-bench-0.6.0-linux-amd64 sudo mv kube-bench /usr/local/bin/
- اجرای Kube-bench: بعد از نصب، برای اسکن کلاستر Kubernetes خود، میتوانید از دستور زیر استفاده کنید. این دستور بهطور پیشفرض تمامی تنظیمات مربوط به Node، Control Plane و Etcd را بررسی میکند:
kube-bench run
شما میتوانید اسکن را بر اساس بخشهای مختلف کلاستر مانند
ControlPlane
،Node
یاEtcd
انجام دهید:kube-bench run --targets Node
- تحلیل گزارشها: پس از اجرای Kube-bench، گزارشی شامل نتایج بررسی تنظیمات امنیتی کلاستر و شناسایی آسیبپذیریها و تنظیمات نادرست در کلاستر به شما نمایش داده میشود. این گزارشها شامل هشدارها و توصیههایی برای اصلاح تنظیمات ناامن خواهند بود.
2. استفاده از kube-score برای ارزیابی تنظیمات Pod
kube-score ابزاری است که برای ارزیابی پیکربندیهای YAML مربوط به منابع Kubernetes مانند Pods، Deployments و دیگر منابع Kubernetes طراحی شده است. این ابزار به شما کمک میکند تا مشکلات امنیتی و پیکربندیهای نادرست در منابع مختلف را شناسایی کنید.
مراحل نصب و استفاده از kube-score:
- نصب kube-score: برای نصب این ابزار، از دستور زیر استفاده کنید:
# نصب با استفاده از Homebrew (برای macOS): brew install kube-score # نصب با استفاده از curl (برای سیستمهای لینوکس): curl -s https://api.github.com/repos/zegl/kube-score/releases/latest | \ jq -r ".assets[] | select(.name | test(\"Linux-x86_64\")) | .browser_download_url" | \ xargs curl -LO tar -xvzf kube-score-* && sudo mv kube-score /usr/local/bin/
- اجرای kube-score برای بررسی منابع Kubernetes: برای بررسی منابع Kubernetes، کافی است فایل YAML مورد نظر خود را به دستور زیر وارد کنید:
kube-score score <your-kubernetes-manifest>.yaml
این ابزار موارد مختلفی مانند Security Contexts، ImagePullPolicy، Resource Requests/Limits، Labels و دیگر تنظیمات امنیتی را بررسی کرده و به شما گزارش میدهد.
- تحلیل گزارشها: بعد از اجرای دستور، kube-score گزارشی را به شما نشان خواهد داد که شامل پیشنهادات و مشکلات مربوط به منابع Kubernetes است. اگر تنظیمات امنیتی یا پیکربندیهای نادرستی وجود داشته باشد، آنها را شناسایی و برای اصلاح آنها توصیههایی ارائه میدهد.
3. استفاده از Kubectl و کدهای تست
ابزارهایی مانند kubectl
میتوانند برای اجرای دستورات و دریافت اطلاعات در مورد تنظیمات کلاستر نیز مورد استفاده قرار گیرند. برای مثال، میتوان از دستور زیر برای مشاهده دسترسیها و بررسی اینکه آیا تنظیمات امنیتی به درستی پیکربندی شدهاند، استفاده کرد:
kubectl auth can-i create pod --as=system:serviceaccount:<namespace>:<serviceaccount-name>
این دستور بررسی میکند که آیا یک ServiceAccount خاص دسترسی لازم برای ایجاد Pod را دارد یا خیر. این نوع اسکنها میتوانند به شناسایی مسائل امنیتی در کلاستر کمک کنند.
جمعبندی
برای شناسایی تنظیمات ناامن در کلاستر Kubernetes، استفاده از ابزارهایی مانند Kube-bench و kube-score بسیار مفید است. Kube-bench به شما کمک میکند تا مطابق با معیارهای CIS Kubernetes Benchmark تنظیمات امنیتی کلاستر خود را ارزیابی کنید، در حالی که kube-score برای ارزیابی تنظیمات YAML منابع Kubernetes و شناسایی مشکلات امنیتی در آنها طراحی شده است. همچنین ابزارهای خط فرمان مانند kubectl
میتوانند به شما در تحلیل دسترسیها و شناسایی تنظیمات اشتباه کمک کنند. این ابزارها به شما این امکان را میدهند که مشکلات امنیتی کلاستر را شناسایی کرده و اقدامات اصلاحی را انجام دهید.
Patch Management: بهروزرسانی مداوم Cluster و اجزای آن برای جلوگیری از سوءاستفاده سخنرانی
توضیحات کامل
در این بخش، مراحل اصلی Patch Management و چگونگی انجام بهروزرسانی در کلاستر Kubernetes برای جلوگیری از سوءاستفاده و آسیبپذیریها شرح داده خواهد شد.
1. اهمیت بهروزرسانی اجزای کلاستر
بهروزرسانی مداوم اجزای کلاستر Kubernetes نه تنها برای افزودن ویژگیهای جدید و بهبود عملکرد است، بلکه بهروزرسانی امنیتی برای رفع آسیبپذیریها و جلوگیری از سوءاستفادههای احتمالی از اهمیت ویژهای برخوردار است. بسیاری از آسیبپذیریهای امنیتی بهدلیل استفاده از نسخههای قدیمی و دارای ضعفهای شناخته شده در Kubernetes، سیستم عامل، یا ابزارهای جانبی به وجود میآید.
- افزایش امنیت: بهروزرسانیها معمولاً شامل رفع آسیبپذیریها و نقصهای امنیتی شناخته شده هستند. با بهروزرسانی مداوم، میتوان از بسیاری از حملات امنیتی جلوگیری کرد.
- پایداری و کارایی: بهروزرسانیها میتوانند مشکلات عملکردی و پایداری که ممکن است در نسخههای قدیمی وجود داشته باشد را برطرف کنند.
- ویژگیهای جدید: بهروزرسانیها همچنین ویژگیها و قابلیتهای جدیدی را برای کلاستر به ارمغان میآورند.
2. نحوه انجام Patch Management در Kubernetes
برای انجام بهروزرسانی در Kubernetes و اجزای مختلف آن، فرآیندهای مختلفی باید طی شود. در اینجا، نحوه انجام بهروزرسانی برای اجزای مختلف Kubernetes توضیح داده میشود:
2.1 بهروزرسانی Kubernetes Cluster
بهروزرسانی Kubernetes کلاستر شامل بهروزرسانی نسخههای مختلف مانند کنترل پلن (Control Plane)، نودها (Nodes) و سرویسهای مختلف کلاستر است.
- برای بهروزرسانی نسخه کنترل پلن میتوانید از ابزار
kubeadm
استفاده کنید. ابتدا نسخه جدید را در سیستم خود نصب کنید و سپس کنترل پلن را بهروزرسانی کنید:- بهروزرسانی kubeadm:
sudo apt-get update && sudo apt-get install -y kubeadm=<new-version>
- بهروزرسانی Control Plane: پس از بهروزرسانی
kubeadm
، از دستور زیر برای بهروزرسانی کنترل پلن استفاده کنید:sudo kubeadm upgrade apply v<new-version>
- بهروزرسانی نودها: برای بهروزرسانی نودهای Kubernetes، از دستور زیر استفاده کنید:
sudo apt-get update && sudo apt-get install -y kubelet=<new-version> sudo systemctl restart kubelet
- تأیید بهروزرسانی: پس از بهروزرسانی، میتوانید از دستور زیر برای بررسی وضعیت کلاستر و نودها استفاده کنید:
kubectl get nodes
- بهروزرسانی kubeadm:
2.2 بهروزرسانی Containers و Images
یکی از مهمترین اجزای Kubernetes کانتینرها و ایمیجهای مورد استفاده در Podها هستند. این اجزا باید بهطور مداوم بهروزرسانی شوند تا از آسیبپذیریهای شناخته شده جلوگیری شود.
- بهروزرسانی تصاویر کانتینرها بهطور معمول با استفاده از دستورات زیر انجام میشود:
- Pull کردن تصویر جدید:
docker pull <image-name>:<new-version>
- بهروزرسانی Deployment: پس از بهروزرسانی تصویر، برای بهروزرسانی Podها و اطمینان از استفاده از تصویر جدید، از دستور زیر برای آپدیت کردن Deployment استفاده کنید:
kubectl set image deployment/<deployment-name> <container-name>=<image-name>:<new-version>
- تأیید بهروزرسانی: برای بررسی اینکه Pods جدید با تصویر بهروز در حال اجرا هستند، میتوانید از دستور زیر استفاده کنید:
kubectl get pods
- Pull کردن تصویر جدید:
2.3 بهروزرسانی Plugins و Extensions
در Kubernetes، پلاگینها و افزونهها (مانند Helm charts، Network Policies و Ingress controllers) نیز نیاز به بهروزرسانی دارند.
- بهروزرسانی Helm Charts: برای بهروزرسانی Helm charts به نسخه جدید، میتوانید از دستور زیر استفاده کنید:
helm repo update helm upgrade <release-name> <chart-name> --version <new-version>
- بهروزرسانی Ingress Controllers: بهروزرسانی Ingress controller نیز از طریق دستوراتی مشابه با دستور زیر انجام میشود:
kubectl apply -f ingress-controller.yaml
3. استفاده از ابزارهای خودکار برای Patch Management
برای سادهسازی فرآیند بهروزرسانی و Patch Management در کلاسترهای Kubernetes، میتوانید از ابزارهای خودکاری مانند Kured استفاده کنید که برای بهروزرسانی خودکار نودها طراحی شده است.
- نصب Kured:
kubectl apply -f https://raw.githubusercontent.com/weaveworks/kured/master/deploy/kured.yaml
این ابزار بهصورت خودکار نودهایی که نیاز به بهروزرسانی دارند را شناسایی کرده و آنها را بدون اختلال در عملکرد کلاستر بهروز میکند.
جمعبندی
Patch Management یک بخش حیاتی از امنیت کلاستر Kubernetes است که به بهروزرسانی منظم اجزای مختلف کلاستر برای جلوگیری از آسیبپذیریها و سوءاستفادهها کمک میکند. فرآیند بهروزرسانی کلاستر شامل بهروزرسانی اجزای مختلف مانند کنترل پلن، نودها، کانتینرها و تصاویر، پلاگینها و افزونهها است. استفاده از ابزارهای خودکار مانند Kured میتواند این فرآیند را تسهیل کند. با بهروزرسانی منظم و مراقبت از اجزای مختلف کلاستر، میتوان از تهدیدات امنیتی جلوگیری کرده و پایداری و کارایی کلاستر را حفظ کرد.
بخش 6. نظارت و Debugging در Kubernetes
فصل 1. مشاهده و بررسی لاگها
دستور kubectl logs: مشاهده لاگهای یک Pod سخنرانی
توضیحات کامل
بررسی لاگهای یک کانتینر خاص در Podهای چند کانتینری سخنرانی
توضیحات کامل
استفاده از پارامتر -f برای مشاهده Real-Time لاگها (Follow Mode) سخنرانی
توضیحات کامل
مدیریت حجم بالای لاگها: فیلتر کردن لاگها با ابزارهایی مانند grep سخنرانی
توضیحات کامل
ذخیره لاگها برای تحلیلهای بعدی سخنرانی
توضیحات کامل
فصل 2. بررسی وضعیت منابع با دستورات اصلی
دستور kubectl describe: دریافت اطلاعات جزئی در مورد Podها، Deploymentها، و سایر منابع سخنرانی
توضیحات کامل
مشاهده وقایع مرتبط (Events) برای هر منبع در Kubernetes سخنرانی
توضیحات کامل
دستور kubectl get: مشاهده وضعیت کلی منابع Kubernetes سخنرانی
توضیحات کامل
استفاده از فرمتهای خروجی مانند o yaml- یا o json- برای تحلیل دقیقتر سخنرانی
توضیحات کامل
دستور kubectl top: مشاهده مصرف CPU و حافظه Podها و Nodeها سخنرانی
توضیحات کامل
فصل 3. عیبیابی Pods و کانتینرها
دستور kubectl exec سخنرانی
توضیحات کامل
دستور kubectl port-forward سخنرانی
توضیحات کامل
بررسی وضعیت Pod: شناسایی دلایل خرابی (CrashLoopBackOff، ImagePullBackOff، و غیره) سخنرانی
توضیحات کامل
بررسی وضعیت Liveness و Readiness Probes سخنرانی
توضیحات کامل
فصل 4. مدیریت Events و رویدادها
دستور kubectl get events: مشاهده رویدادهای اخیر مرتبط با منابع سخنرانی
توضیحات کامل
تشخیص مشکلات شبکه، محدودیت منابع، یا خطاهای مرتبط با زمانبندی (Scheduling) سخنرانی
توضیحات کامل
تحلیل وقایع: مرتبسازی وقایع بر اساس زمان یا نوع رویداد سخنرانی
توضیحات کامل
استفاده از ابزارهای خارجی برای ثبت و تحلیل وقایع سخنرانی
توضیحات کامل
فصل 5. رفع مشکلات ارتباطات شبکه
شناسایی محدودیتهای شبکه با بررسی تنظیمات Network Policy سخنرانی
توضیحات کامل
بررسی سرویسها و DNS: تست ارتباطات بین Podها و سرویسها سخنرانی
توضیحات کامل
استفاده از ابزارهایی مانند nslookup یا dig برای بررسی مشکلات DNS سخنرانی
توضیحات کامل
دستور kubectl proxy: راهاندازی پروکسی برای دسترسی به سرویسهای داخلی سخنرانی
توضیحات کامل
فصل 6. استفاده از ابزارهای داخلی و خارجی
ابزارهای داخلی Kubernetes:
استفاده از Dashboard برای نظارت گرافیکی سخنرانی
توضیحات کامل
ابزارهای داخلی مانند kubectl debug (در نسخههای جدید) سخنرانی
توضیحات کامل
ابزارهای خارجی برای مانیتورینگ:
استفاده از Prometheus و Grafana برای نظارت دقیق منابع سخنرانی
توضیحات کامل
ELK Stack برای مدیریت و تحلیل لاگها سخنرانی
توضیحات کامل
ابزارهای دیگر مانند Fluentd، Datadog، یا New Relic سخنرانی
توضیحات کامل
فصل 7. بررسی وضعیت سلامت (Health)
بررسی کانفیگ Probeها برای تشخیص مشکلات سخنرانی
توضیحات کامل
بهینهسازی زمانبندی و حساسیت پروبها سخنرانی
توضیحات کامل
مدیریت Restart Policy: تنظیم و تحلیل Restart Policyها برای Pods سخنرانی
توضیحات کامل
فصل 8. مدیریت فضای دیسک و ذخیرهسازی
شناسایی مشکلات Mount یا دسترسی به Persistent Volumeها سخنرانی
توضیحات کامل
دستور kubectl df-pv: مشاهده مصرف فضای PVها سخنرانی
توضیحات کامل
فصل 9. عیبیابی Image و کانتینرها
بررسی مشکلات Pull Image (مانند خطاهای ImagePullBackOff) سخنرانی
توضیحات کامل
استفاده از Registryهای خصوصی با Secretها سخنرانی
توضیحات کامل
Debugging کانتینرها: استفاده از ابزارهای داخل کانتینر مانند curl یا ping برای تست ارتباطات سخنرانی
توضیحات کامل
بخش 7. ابزارها و دستورات Kubernetes
فصل 1. مدیریت منابع با kubectl
نحوه نصب و پیکربندی ابزار kubectl سخنرانی
توضیحات کامل
استفاده از kubectl create برای ایجاد منابع (مثل Pods، Services، Deployments) سخنرانی
توضیحات کامل
ساخت منابع از فایلهای YAML سخنرانی
توضیحات کامل
استفاده از kubectl apply برای بهروزرسانی منابع سخنرانی
توضیحات کامل
مقایسه تغییرات با kubectl diff سخنرانی
توضیحات کامل
استفاده از kubectl delete برای حذف منابع با نام یا نوع مشخص سخنرانی
توضیحات کامل
حذف منابع از فایلهای YAML سخنرانی
توضیحات کامل
فصل 2. مشاهده و مدیریت منابع
استفاده از kubectl get برای مشاهده منابع مختلف (Pods، Nodes، Deployments و …) سخنرانی
توضیحات کامل
فیلتر کردن خروجیها با o- (مانند o json- یا o wide-) سخنرانی
توضیحات کامل
استفاده از kubectl describe برای مشاهده جزئیات منابع سخنرانی
توضیحات کامل
استفاده از kubectl top برای مشاهده مصرف منابع (CPU و Memory) سخنرانی
توضیحات کامل
فصل 3. مدیریت Namespaceها
مشاهده Namespaceهای موجود با kubectl get namespaces سخنرانی
توضیحات کامل
تغییر Namespace پیشفرض با kubectl config set-context سخنرانی
توضیحات کامل
ایجاد و حذف Namespaceها سخنرانی
توضیحات کامل
فصل 4. بررسی و Debugging
بررسی وضعیت Pods با kubectl logs سخنرانی
توضیحات کامل
مشاهده لاگهای همه کانتینرها با all-containers-- سخنرانی
توضیحات کامل
استفاده از kubectl exec برای اجرای دستورات در داخل کانتینرها سخنرانی
توضیحات کامل
مشاهده وقایع (Events) با kubectl get events سخنرانی
توضیحات کامل
بررسی مشکلات منابع با kubectl describe سخنرانی
توضیحات کامل
فصل 5. مدیریت فایلهای YAML
ایجاد فایلهای YAML برای منابع Kubernetes سخنرانی
توضیحات کامل
خواندن و ویرایش منابع از فایلهای YAML سخنرانی
توضیحات کامل
استفاده از kubectl edit برای ویرایش مستقیم منابع سخنرانی
توضیحات کامل
اعمال تغییرات با kubectl apply -f سخنرانی
توضیحات کامل
بررسی وضعیت منابع تعریفشده در YAML با kubectl get -f سخنرانی
توضیحات کامل
فصل 6. مدیریت Contextها و Clusterها
مشاهده Contextهای موجود با kubectl config get-contexts سخنرانی
توضیحات کامل
تغییر Context پیشفرض با kubectl config use-context سخنرانی
توضیحات کامل
اضافه کردن Cluster جدید به تنظیمات kubectl سخنرانی
توضیحات کامل
فصل 7. دستورات پیشرفته و خودکارسازی
افزودن Label به منابع با kubectl label سخنرانی
توضیحات کامل
افزودن Annotation به منابع با kubectl annotate سخنرانی
توضیحات کامل
اعمال تغییرات جزئی با kubectl patch سخنرانی
توضیحات کامل
استفاده از kubectl get -o yaml برای استخراج تعریف YAML سخنرانی
توضیحات کامل
تست فایلهای YAML با kubectl dry-run و kubectl validate سخنرانی
توضیحات کامل
فصل 8. دستورات متداول برای Scaling
تغییر تعداد Replicas با kubectl scale سخنرانی
توضیحات کامل
مدیریت Auto-scaling با kubectl autoscale سخنرانی
توضیحات کامل
فصل 9. مدیریت ConfigMaps و Secrets
ایجاد ConfigMaps سخنرانی
توضیحات کامل
ایجاد Secrets سخنرانی
توضیحات کامل
فصل 10. استفاده از kubectl برای مانیتورینگ
مشاهده وضعیت Health منابع با kubectl get pods --show-labels سخنرانی
توضیحات کامل
مشاهده Nodeها و وضعیتشان با kubectl get nodes سخنرانی
توضیحات کامل
نمایش وضعیت منابع با kubectl describe nodes سخنرانی
توضیحات کامل
بخش 8. طراحی برنامههای Cloud-Native
فصل 1. اصول Cloud-Native Development
آشنایی با مفهوم Cloud-Native و کاربرد آن در توسعه برنامهها سخنرانی
توضیحات کامل
ویژگیهای برنامههای Cloud-Native:
- میکروسرویسها (Microservices): برنامههای Cloud-Native معمولاً بهصورت میکروسرویس طراحی میشوند. این بدان معناست که برنامه به اجزای کوچک و مستقل تقسیم میشود که هر کدام مسئولیت خاصی دارند و میتوانند بهطور مستقل توسعه و مقیاسبندی شوند. این اجزا از طریق API با یکدیگر ارتباط برقرار میکنند.مزایا:
- توسعه سریعتر
- توانایی بهروزرسانی و اصلاح بخشهای خاص بدون تأثیر بر سایر بخشها
- مقیاسپذیری مستقل برای هر میکروسرویس
- کانتینرها (Containers): در Cloud-Native، کانتینرها ابزاری برای بستهبندی و اجرای برنامهها در یک محیط ایزوله و قابل حمل هستند. کانتینرها میتوانند برنامهها و وابستگیهایشان را در خود جای دهند و این امکان را میدهند که برنامهها در هر محیطی که پشتیبانی از کانتینر داشته باشد اجرا شوند. این ویژگی باعث سهولت در پیادهسازی و انتقال برنامهها میشود.مزایا:
- سازگاری در محیطهای مختلف (محیط توسعه، آزمایش، تولید)
- ایزولهسازی منابع
- مقیاسپذیری و انعطافپذیری بالا
- اورکستراسیون کانتینرها (Container Orchestration): اورکستراسیون ابزارهایی را فراهم میکند که برای مدیریت، استقرار، مقیاسپذیری و خودترمیمی کانتینرها طراحی شدهاند. Kubernetes یکی از پرکاربردترین ابزارهای اورکستراسیون کانتینرهاست. این ابزار به شما کمک میکند تا کانتینرها را بهطور خودکار مقیاسبندی، راهاندازی و مدیریت کنید.مزایا:
- خودکارسازی مدیریت منابع
- مدیریت مقیاسپذیری و بالانس بار
- بهبود قابلیت اطمینان و مقاومسازی در برابر خطاها
- DevOps و CICD: Cloud-Native معمولاً به یک فرهنگ و رویکرد DevOps مرتبط است که در آن تیمهای توسعه و عملیات همکاری نزدیکی دارند تا فرایندهای توسعه، تست، و استقرار بهطور خودکار و مداوم انجام شوند. ابزارهای CICD (Continuous Integration / Continuous Deployment) به شما این امکان را میدهند که تغییرات در کد بهطور مداوم در محیطهای مختلف آزمایش و تولید تست شوند.مزایا:
- زمانبندی سریعتر برای تولید ویژگیهای جدید
- کاهش خطاهای انسانی در فرایندهای دستی
- بهبود کیفیت و اطمینان از نرمافزارهای ارائهشده
- Cloud-Native Storage: در برنامههای Cloud-Native، استفاده از ذخیرهسازی مقیاسپذیر و پرسرعت از اهمیت زیادی برخوردار است. این نوع ذخیرهسازی معمولاً بهطور پویا مقیاس میشود و نیاز به پیکربندی دستی ندارد. ابزارهایی مانند Ceph و Cloud Storage برای ارائه ذخیرهسازی مقیاسپذیر بهطور خودکار طراحی شدهاند.مزایا:
- مقیاسپذیری خودکار
- مدیریت ساده
- بازیابی سریع اطلاعات در صورت بروز خطا
کاربردهای Cloud-Native در توسعه برنامهها:
- پیادهسازی سریعتر ویژگیها: با استفاده از اصول Cloud-Native مانند میکروسرویسها، تیمها میتوانند تغییرات را سریعتر اعمال کرده و ویژگیهای جدید را به بازار عرضه کنند.
- مقیاسپذیری بالا: در محیطهای Cloud-Native، برنامهها میتوانند بهطور خودکار و بر اساس نیاز بار ترافیکی مقیاسبندی شوند، که این ویژگی به ویژه در برنامههای با ترافیک زیاد یا متغیر بسیار مهم است.
- استحکام و مقاومت در برابر خرابی: معماری Cloud-Native بهگونهای طراحی شده است که در برابر خرابیهای جزئی مقاوم است. اگر یک بخش از برنامه دچار مشکل شود، میکروسرویسهای دیگر بهطور مستقل به کار خود ادامه میدهند و از این رو استحکام سیستم کلی حفظ میشود.
- کاربرد در سرویسهای وب: این مدل برای توسعه سرویسهای وب بسیار مناسب است، زیرا امکان مقیاسپذیری بالا و مدیریت خودکار منابع را فراهم میکند. ابزارهایی مانند Kubernetes و Docker به راحتی این نیازها را پوشش میدهند.
- یکپارچگی با خدمات ابری: برنامههای Cloud-Native بهطور طبیعی با خدمات ابری (مانند Amazon Web Services، Google Cloud Platform و Microsoft Azure) یکپارچه میشوند و از قابلیتهایی مانند ذخیرهسازی ابری، پردازش مقیاسپذیر، و ارتباطات بینخدماتی بهصورت خودکار بهرهبرداری میکنند.
جمع بندی:
Cloud-Native رویکردی مؤثر و کارآمد برای ساخت و اجرای برنامهها در محیطهای ابری است که به تیمها این امکان را میدهد که برنامههایی مقیاسپذیر، انعطافپذیر و مقاوم در برابر خرابی ایجاد کنند. با استفاده از اصول و ابزارهای Cloud-Native، تیمها میتوانند زمان توسعه را کاهش دهند، بهبود عملکرد و اطمینان از نرمافزار را تجربه کنند، و بهراحتی برنامههای خود را در ابری مقیاسپذیر و مدیریتشده پیادهسازی کنند.
درک معماری مبتنی بر میکروسرویسها (Microservices Architecture) سخنرانی
توضیحات کامل
ویژگیهای اصلی معماری میکروسرویسها:
- خدمات مستقل (Independent Services): در معماری میکروسرویسها، هر سرویس بهطور مستقل از سایر سرویسها عمل میکند. این سرویسها ممکن است از نظر پیادهسازی، زبان برنامهنویسی و پلتفرم متفاوت باشند، ولی همگی از طریق API با یکدیگر ارتباط برقرار میکنند. این استقلال به تیمهای توسعه این امکان را میدهد که هر سرویس را بهطور جداگانه توسعه، مقیاسبندی و نگهداری کنند.مزایا:
- توسعه و استقرار مستقل
- توانایی انتخاب تکنولوژی مناسب برای هر سرویس
- بهبود مقیاسپذیری و قابلیت نگهداری
- مدیریت مجزای دادهها (Independent Data Management): هر میکروسرویس معمولاً پایگاه داده خود را دارد و دادههای مربوط به خود را مدیریت میکند. این بهمعنای عدم وابستگی به یک پایگاه داده مشترک است که در معماریهای قدیمیتر مانند معماریهای تکسرویس (Monolithic) معمولاً مشاهده میشود. این ویژگی به هر میکروسرویس این امکان را میدهد که دادههای خود را بهصورت مجزا مدیریت کند و از مشکلات همزمانی دادهها جلوگیری شود.مزایا:
- استقلال در مدیریت دادهها
- جلوگیری از مشکلات مقیاسپذیری که به دلیل استفاده از یک پایگاه داده مشترک پیش میآید
- مقیاسپذیری (Scalability): هر میکروسرویس میتواند بهطور مستقل مقیاسبندی شود. این بدین معناست که اگر یک سرویس بار زیادی داشته باشد، فقط همان سرویس میتواند مقیاسپذیر شود بدون اینکه نیاز به مقیاسپذیری کل سیستم باشد. این ویژگی برای برنامههایی که بار متغیر دارند بسیار مفید است.مزایا:
- مقیاسپذیری بالا
- بهینهسازی منابع بر اساس نیاز واقعی
- توسعه مستقل (Independent Development): با تقسیمبندی سیستم به میکروسرویسها، تیمهای مختلف میتوانند بهطور همزمان روی قسمتهای مختلف سیستم کار کنند. هر تیم میتواند ویژگیهای جدید را برای سرویس خود توسعه دهد و آن را بهصورت مستقل از سایر تیمها استقرار دهد.مزایا:
- کاهش وابستگیهای متقابل
- امکان توسعه سریعتر و استقرار مستقل
- کاهش پیچیدگی توسعه
- استفاده از پروتکلهای ارتباطی استاندارد (Standard Communication Protocols): میکروسرویسها از پروتکلهای استاندارد مانند HTTP/REST، gRPC یا GraphQL برای برقراری ارتباط با یکدیگر استفاده میکنند. این پروتکلها به میکروسرویسها اجازه میدهند که اطلاعات را بهصورت JSON، XML یا دیگر فرمتها منتقل کنند.مزایا:
- ارتباط استاندارد و ساده بین میکروسرویسها
- مقیاسپذیری در شبکههای توزیعشده
مزایای معماری میکروسرویسها:
- استقلال در استقرار: میکروسرویسها میتوانند بهطور جداگانه استقرار یابند، این بدین معناست که هر سرویس میتواند بهطور مستقل از دیگر سرویسها بهروز شود بدون اینکه به سایر سرویسها آسیب بزند.
- پایداری و انعطافپذیری بیشتر: اگر یک میکروسرویس خراب شود، سایر میکروسرویسها میتوانند بهطور مستقل عمل کنند. این ویژگی باعث میشود که سیستم کلی مقاومتر در برابر خطا باشد و از خرابیهای جزئی جلوگیری کند.
- مقیاسپذیری بهینه: در معماری میکروسرویسها، میتوان تنها آن سرویسهایی که بار زیادی دارند را مقیاسبندی کرد. این ویژگی بهطور چشمگیری باعث بهبود کارایی و کاهش هزینهها میشود.
- انتخاب تکنولوژیهای مختلف: هر میکروسرویس میتواند از یک زبان برنامهنویسی خاص یا پلتفرم متفاوت استفاده کند. برای مثال، یکی از میکروسرویسها میتواند در Java نوشته شود، در حالی که دیگری در Node.js توسعه یابد.
- توسعه سریعتر و بهبود زمانبندی: به دلیل مستقل بودن سرویسها، تیمهای توسعه میتوانند بهطور همزمان روی قسمتهای مختلف سیستم کار کنند، که این بهبود قابل توجهی در سرعت توسعه و استقرار ایجاد میکند.
چالشهای معماری میکروسرویسها:
- پیچیدگی در مدیریت ارتباطات: میکروسرویسها برای برقراری ارتباط با یکدیگر به استفاده از API نیاز دارند. این بهمعنای افزایش پیچیدگی در مدیریت API و شبکه است. مشکلاتی مانند مدیریت زمان تأخیر، ترافیک زیاد، و امنیت API میتواند چالشبرانگیز باشد.
- مدیریت دادهها و هماهنگی: در معماری میکروسرویسها، به دلیل داشتن پایگاه دادههای مجزا برای هر سرویس، هماهنگی و همزمانی دادهها میتواند پیچیده باشد. در این معماری، ممکن است نیاز به رویکردهایی مانند Event Sourcing یا CQRS (Command Query Responsibility Segregation) داشته باشیم.
- پشتیبانی از جزئیات و نظارت پیچیده: به دلیل توزیعشدن سیستم، نظارت بر عملکرد و جمعآوری لاگها از چندین سرویس مختلف میتواند چالشبرانگیز باشد. برای حل این مشکل، باید از ابزارهای نظارتی مانند Prometheus یا ELK Stack استفاده کرد.
- امنیت: امنیت در معماری میکروسرویسها نیازمند توجه ویژهای به پروتکلهای ارتباطی، احراز هویت و مجوزها است. استفاده از OAuth، JWT و mTLS میتواند به مدیریت امنیت کمک کند.
ابزارها و تکنولوژیهای رایج در معماری میکروسرویسها:
- Docker: برای بستهبندی و اجرای میکروسرویسها در کانتینرهای ایزولهشده از Docker استفاده میشود. این امکان را به میکروسرویسها میدهد که بهطور مستقل و در محیطهای مختلف اجرا شوند.
- Kubernetes: بهعنوان سیستم اورکستراسیون کانتینرها، Kubernetes به مدیریت، مقیاسبندی، و استقرار میکروسرویسها کمک میکند. این ابزار برای مدیریت مقیاسپذیری و نگهداری میکروسرویسها در ابعاد بزرگ بسیار مناسب است.
- API Gateway: برای مدیریت و روتینگ درخواستها به میکروسرویسها از API Gateway استفاده میشود. این ابزار بهعنوان یک نقطه ورود واحد برای تمام درخواستهای ورودی به سیستم عمل میکند و به مدیریت احراز هویت، نظارت، و مدیریت ترافیک کمک میکند.
- Spring Boot: در بسیاری از پروژههای میکروسرویس، فریمورک Spring Boot برای توسعه سریع میکروسرویسها بهکار میرود.
- Istio: Istio بهعنوان یک سرویس مش (Service Mesh) برای مدیریت و نظارت بر ارتباطات بین میکروسرویسها استفاده میشود.
جمع بندی:
معماری میکروسرویسها به دلیل تقسیمبندی سیستم به اجزای مستقل، مزایای بسیاری از جمله مقیاسپذیری بالا، استقلال در استقرار، و توانایی استفاده از تکنولوژیهای مختلف برای هر سرویس را فراهم میآورد. با این حال، چالشهایی نیز از جمله پیچیدگی در مدیریت ارتباطات، امنیت و نظارت بر عملکرد وجود دارد. با استفاده از ابزارهای مناسب و رویکردهای مدیریتی صحیح، این چالشها قابل مدیریت خواهند بود.
مدیریت Stateless و Stateful در برنامهها سخنرانی
توضیحات کامل
Stateless Applications
در Stateless Applications، هیچ اطلاعات یا وضعیت میان درخواستهای مختلف حفظ نمیشود. هر درخواست بهطور مستقل از درخواستهای قبلی پردازش میشود و نیازی به ذخیرهسازی اطلاعات مابین درخواستها وجود ندارد.
استفاده در Kubernetes:
برای مدیریت Stateless Applications در Kubernetes، از Deployments استفاده میشود. Deployments برای مقیاسبندی افقی، مدیریت بهروزرسانیها و استفاده از استراتژیهای Rolling Update طراحی شدهاند.
مثال یک Deployment برای یک اپلیکیشن Stateless:
apiVersion: apps/v1
kind: Deployment
metadata:
name: stateless-app
spec:
replicas: 3
selector:
matchLabels:
app: stateless-app
template:
metadata:
labels:
app: stateless-app
spec:
containers:
- name: web-container
image: nginx
ports:
- containerPort: 80
در این مثال، یک Deployment ساده برای Nginx بهعنوان یک اپلیکیشن Stateless ایجاد شده است. تعداد replicas سه است، که یعنی سه Pod بهصورت موازی در حال اجرا خواهند بود. این برنامه نیازی به ذخیرهسازی دادهها ندارد و هر درخواست بهطور مستقل از دیگر درخواستها پردازش میشود.
مزایا:
- مقیاسپذیری آسان: بهراحتی میتوان تعداد Podها را افزایش داد یا کاهش داد.
- سادگی: برنامه نیازی به ذخیرهسازی دادهها یا وضعیتهای درونسازمانی ندارد.
چالشها:
- برای ذخیرهسازی دادهها باید به سرویسهای خارجی مثل databases و object storage وابسته بود.
Stateful Applications
در Stateful Applications، وضعیت و دادهها بین درخواستها حفظ میشود. این مدل بهویژه برای سیستمهایی مثل پایگاه دادهها، کشها یا سرویسهای احراز هویت که نیاز به ذخیرهسازی دادهها در داخل یا خارج از Pod دارند، مفید است.
استفاده در Kubernetes:
برای برنامههای Stateful از StatefulSet استفاده میشود. StatefulSet برخلاف Deployment، قابلیتهایی برای حفظ وضعیت و تخصیص ذخیرهسازی دائم برای هر Pod دارد. این ویژگیها شامل Persistent Volumes و VolumeClaimTemplates است که به دادههای درونسازمانی اطمینان میدهد.
مثال یک StatefulSet برای یک پایگاه داده PostgreSQL:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stateful-app
spec:
serviceName: "stateful-service"
replicas: 3
selector:
matchLabels:
app: stateful-app
template:
metadata:
labels:
app: stateful-app
spec:
containers:
- name: db-container
image: postgres
ports:
- containerPort: 5432
volumeMounts:
- name: db-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: db-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
در این مثال، یک StatefulSet برای پایگاه داده PostgreSQL تعریف شده است. هر Pod به یک Persistent Volume متصل میشود که دادههای آن را بین Pods حفظ میکند. استفاده از VolumeClaimTemplates برای درخواست حجم ذخیرهسازی خاص به هر Pod امکانپذیر است.
مزایا:
- حفظ وضعیت: دادهها و وضعیتها بین Pods حفظ میشوند.
- مناسب برای پایگاه دادهها: برای برنامههایی که نیاز به ذخیرهسازی دادهها دارند (مثل سیستمهای دیتابیس و کشها).
چالشها:
- مقیاسپذیری پیچیدهتر: افزایش Pods بهطور افقی برای برنامههای Stateful دشوارتر از برنامههای Stateless است.
- مدیریت دادهها: باید سیستمهای ذخیرهسازی و همگامسازی دادهها را مدیریت کرد.
مقایسه Stateless و Stateful در Kubernetes
ویژگی | Stateless | Stateful |
---|---|---|
حفظ وضعیت | وضعیت حفظ نمیشود | وضعیت و دادهها حفظ میشوند |
مقیاسپذیری | مقیاسپذیری افقی آسان | مقیاسپذیری پیچیدهتر |
مدیریت ذخیرهسازی | نیاز به ذخیرهسازی خارجی | نیاز به Persistent Volumes برای حفظ دادهها |
استفاده | مناسب برای APIها و سرویسهای وب | مناسب برای پایگاه دادهها و سرویسهای با وضعیت |
پیچیدگی | سادگی و مدیریت آسان | پیچیدگی بیشتر در ذخیرهسازی و مقیاسپذیری |
جمعبندی
در Kubernetes، مدیریت برنامههای Stateless و Stateful به نیازهای خاص هر نوع برنامه بستگی دارد. برای برنامههای Stateless که نیازی به حفظ وضعیت ندارند، از Deployments استفاده میشود که به راحتی میتوان آنها را مقیاسبندی کرد. در مقابل، برای برنامههای Stateful که باید دادهها و وضعیتها حفظ شوند، از StatefulSets و Persistent Volumes استفاده میشود. این دو استراتژی، بسته به نوع برنامه و نیازهای ذخیرهسازی، میتوانند مزایای زیادی را برای طراحی و استقرار سیستمهای توزیعشده در Kubernetes فراهم کنند.
مزایا و چالشهای طراحی برنامههای Cloud-Native سخنرانی
توضیحات کامل
مزایا
تحمل خطا (Fault Tolerance)
یکی از مزایای اصلی طراحی Cloud-Native، تحمل خطا است. برنامههای Cloud-Native بهگونهای طراحی میشوند که بتوانند در مواجهه با مشکلات سختافزاری یا خرابی سرویسها عملکرد خود را حفظ کنند. این امر با استفاده از ویژگیهایی مانند توزیع جغرافیایی، مقیاسپذیری افقی و استفاده از Redundancy (اضافیسازی منابع) انجام میشود.
- مثال: در Kubernetes، استفاده از ReplicaSets و Deployments باعث میشود که در صورت خراب شدن یک Pod، Pod جدیدی بهصورت خودکار ایجاد شود تا تداوم سرویس حفظ گردد.
مقیاسپذیری (Scalability)
برنامههای Cloud-Native بهطور خودکار قادر به مقیاسبندی منابع بر اساس نیازهای لحظهای هستند. این ویژگی باعث میشود که سیستم بتواند به راحتی از بار زیاد (Load) عبور کرده و در زمانهای کمباری منابع را کاهش دهد.
- مثال: Horizontal Pod Autoscaling در Kubernetes به شما این امکان را میدهد که تعداد Pods را بهصورت خودکار بر اساس میزان مصرف منابع (مثل CPU یا Memory) تنظیم کنید.
خودکارسازی (Automation)
برنامههای Cloud-Native بر خودکارسازی و DevOps تکیه دارند تا بهطور مداوم عملیاتها را انجام دهند. این امر باعث میشود که چرخههای توسعه، تست و استقرار بهطور خودکار و سریعتر اجرا شوند. ابزارهای خودکار مانند CI/CD باعث تسهیل در استقرار و بهروزرسانی برنامهها میشوند.
- مثال: در Kubernetes، فرآیندهای Deployment، Scaling و Monitoring میتوانند بهطور خودکار با استفاده از ابزارهایی مانند Helm یا GitOps انجام شوند.
پویایی در محیط ابری (Dynamic in Cloud Environments)
محیطهای ابری بسیار پویا هستند و برنامههای Cloud-Native باید بتوانند بهطور مداوم با تغییرات محیط و نیازهای کاربری سازگار شوند. این امر بهویژه در زمانی که منابع و دادهها بهصورت غیرمتمرکز و در دسترس از هر نقطه از جهان توزیع شدهاند اهمیت دارد.
- مثال: Kubernetes از منابعی مانند Pods و Services بهطور پویا استفاده میکند و بهراحتی میتواند به تغییرات محیطی، مثل خرابیهای گره (Node) یا تغییرات شبکه پاسخ دهد.
چالشها
پیچیدگی در معماری (Architectural Complexity)
یکی از چالشهای طراحی برنامههای Cloud-Native پیچیدگی در معماری است. این نوع برنامهها معمولاً از تعداد زیادی میکروسرویسهای مستقل تشکیل میشوند که باید بهطور مؤثر با هم ارتباط داشته باشند. این ساختار میتواند پیادهسازی، مدیریت و نظارت را پیچیده کند.
- راهکار: استفاده از Service Mesh مانند Istio یا Linkerd میتواند به شما کمک کند تا خدمات میکروسرویسها را بهطور خودکار مدیریت و نظارت کنید.
مدیریت پیکربندی و تنظیمات (Configuration and Management)
در برنامههای Cloud-Native، پیکربندیها و تنظیمات بهطور مداوم تغییر میکنند و باید بهطور هماهنگ در میان میکروسرویسها و منابع مختلف مدیریت شوند. این امر میتواند منجر به مشکلاتی در هماهنگی و تطابق پیکربندیها شود.
- راهکار: استفاده از ابزارهایی مانند ConfigMaps و Secrets در Kubernetes برای مدیریت تنظیمات و اطلاعات حساس بهصورت ایمن میتواند به این مشکل کمک کند.
نظارت و عیبیابی (Monitoring and Troubleshooting)
با توجه به اینکه برنامههای Cloud-Native معمولاً شامل تعداد زیادی از سرویسها و میکروسرویسها هستند، نظارت و عیبیابی مشکلات در این محیطها میتواند چالشبرانگیز باشد. همچنین، پیگیری و تجزیه و تحلیل رویدادها و لاگها از نقاط مختلف شبکه دشوار است.
- راهکار: استفاده از ابزارهای نظارتی مانند Prometheus، Grafana و ELK Stack میتواند به شما کمک کند تا وضعیت سیستم را بهطور پیوسته رصد کرده و مشکلات را سریعاً شناسایی کنید.
مدیریت وابستگیها و نسخهها (Dependency and Version Management)
در برنامههای Cloud-Native، میکروسرویسها و اجزا میتوانند به سرعت تغییر کنند و نسخههای مختلفی از یک سرویس همزمان اجرا شوند. مدیریت این نسخهها و هماهنگی بین آنها میتواند به چالش بزرگی تبدیل شود.
- راهکار: استفاده از Helm Charts و Kustomize برای مدیریت نسخههای مختلف و بهروزرسانیهای مداوم میتواند کمککننده باشد.
امنیت و حریم خصوصی (Security and Privacy)
با توجه به محیط توزیعشده و پویا در برنامههای Cloud-Native، تأمین امنیت و حفظ حریم خصوصی اطلاعات میتواند مشکلساز باشد. محافظت از دادهها در حین انتقال، شناسایی تهدیدات و آسیبپذیریها و پیادهسازی کنترلهای امنیتی چالشهای بزرگی هستند.
- راهکار: استفاده از PodSecurityPolicies، Network Policies و ابزارهای امنیتی مانند Aqua Security یا Twistlock میتواند به تقویت امنیت برنامههای Cloud-Native کمک کند.
جمعبندی
طراحی و استقرار برنامههای Cloud-Native مزایای زیادی از جمله تحمل خطا، مقیاسپذیری، خودکارسازی و پویایی در محیط ابری فراهم میآورد، اما همراه با آن چالشهایی چون پیچیدگی معماری، مدیریت پیکربندی، نظارت، و امنیت نیز وجود دارد. با بهرهگیری از ابزارهای مناسب و بهترین شیوهها، میتوان این چالشها را بهطور مؤثر مدیریت کرد و از مزایای کامل محیطهای ابری بهرهبرداری کرد.
فصل 2. مدیریت مقیاسپذیری برنامهها
تعریف و اهمیت مقیاسپذیری افقی و عمودی (Horizontal & Vertical Scaling) سخنرانی
توضیحات کامل
آشنایی با Horizontal Pod Autoscaler (HPA) سخنرانی
توضیحات کامل
نحوه پیکربندی و استفاده از Horizontal Pod Autoscaler (HPA) سخنرانی
توضیحات کامل
تنظیم مقیاسپذیری بر اساس معیارهایی مانند CPU و Memory سخنرانی
توضیحات کامل
مدیریت منابع در Kubernetes سخنرانی
توضیحات کامل
جلوگیری از Overcommit منابع سخنرانی
توضیحات کامل
فصل 3. طراحی برای تحمل خطا (Fault Tolerance)
مفاهیم تحمل خطا در برنامههای توزیعشده سخنرانی
توضیحات کامل
پیکربندی برنامهها برای بازیابی خودکار (Self-Healing) سخنرانی
توضیحات کامل
کاربرد Restart Policies سخنرانی
توضیحات کامل
طراحی برنامهها برای بازیابی از خرابی (Failover) سخنرانی
توضیحات کامل
فصل 4. استفاده از Config Maps و Secrets
مدیریت متغیرهای محیطی با ConfigMaps سخنرانی
توضیحات کامل
ذخیرهسازی امن اطلاعات حساس (مانند رمزهای عبور) با Secrets سخنرانی
توضیحات کامل
بهترین روشها در استفاده از ConfigMaps و Secrets در برنامههای Cloud-Native سخنرانی
توضیحات کامل
فصل 5. مدیریت ترافیک و Networking
مدیریت Networking بین سرویسها سخنرانی
توضیحات کامل
آشنایی با Ingress برای مدیریت درخواستهای HTTP/HTTPS سخنرانی
توضیحات کامل
استفاده از Network Policies برای محدود سازی ترافیک شبکه سخنرانی
توضیحات کامل
پیکربندی DNS داخلی Kubernetes سخنرانی
توضیحات کامل
فصل 6. طراحی برای مقیاسپذیری بالا (High Availability)
طراحی سیستمهایی با مقیاسپذیری بالا سخنرانی
توضیحات کامل
درک توزیع بار و توزیع منطقی Pods در Nodeها سخنرانی
توضیحات کامل
فصل 7. مدیریت Logging و Monitoring
جمعآوری و مدیریت لاگها در برنامههای Cloud-Native سخنرانی
توضیحات کامل
استفاده از ابزارهای مانیتورینگ مانند Prometheus و Grafana سخنرانی
توضیحات کامل
بهترین روشها برای بررسی سلامت و کارایی سیستم سخنرانی
توضیحات کامل
فصل 8. بهینهسازی هزینهها در Kubernetes
کاهش هزینههای منابع با تنظیم Resource Requests و Limits سخنرانی
توضیحات کامل
شناسایی و مدیریت منابع بلا استفاده در Kubernetes سخنرانی
توضیحات کامل
استفاده از Auto-Scaling برای بهینهسازی استفاده از منابع سخنرانی
توضیحات کامل
فصل 9. طراحی برنامهها برای CI/CD در Kubernetes
آشنایی با ابزارهای CI/CD مانند Jenkins، GitLab CI/CD و ArgoCD سخنرانی
توضیحات کامل
استفاده از Helm Charts برای مدیریت Deploymentها سخنرانی
توضیحات کامل
مدیریت Rolloutها و Rollbackها بهصورت خودکار سخنرانی
توضیحات کامل
فصل 10. امنیت در طراحی برنامههای Cloud-Native
پیادهسازی امنیت در سطح Pod با SecurityContext سخنرانی
توضیحات کامل
استفاده از RBAC (Role-Based Access Control) برای مدیریت دسترسیها سخنرانی
توضیحات کامل
استفاده از Network Policies برای محدود کردن دسترسیها سخنرانی
توضیحات کامل
پاسخ به سوالات فنی کاربران
پشتیبانی دائمی و در لحظه رایگان
توضیحات کامل
پرسشهای شما، بخش مهمی از دوره است:
هر سوال یا مشکلی که مطرح کنید، با دقت بررسی شده و پاسخ کامل و کاربردی برای آن ارائه میشود. علاوه بر این، سوالات و پاسخهای شما به دوره اضافه خواهند شد تا برای سایر کاربران نیز مفید باشد.
پشتیبانی دائمی و در لحظه:
تیم ما همواره آماده پاسخگویی به سوالات شماست. هدف ما این است که شما با خیالی آسوده بتوانید مهارتهای خود را به کار بگیرید و پروژههای واقعی را با اعتماد به نفس کامل انجام دهید.
آپدیت دائمی دوره:
این دوره به طور مداوم بهروزرسانی میشود تا همگام با نیازهای جدید و سوالات کاربران تکمیلتر و بهتر گردد. هر نکته جدید یا مشکل رایج، در نسخههای بعدی دوره قرار خواهد گرفت.
حرف آخر
با ما همراه باشید تا نه تنها به مشکلات شما پاسخ دهیم، بلکه در مسیر یادگیری و پیشرفت حرفهای، شما را پشتیبانی کنیم. هدف ما این است که شما به یک متخصص حرفهای و قابلاعتماد تبدیل شوید و بتوانید با اطمینان پروژههای واقعی را بپذیرید و انجام دهید.
📩 اگر سوالی دارید یا به مشکلی برخوردید، همین حالا مطرح کنید!
ما در کوتاهترین زمان ممکن پاسخ شما را ارائه خواهیم داد. 🙌
موارد مرتبط
نظرات
متوسط امتیازات
جزئیات امتیازات
.فقط مشتریانی که این محصول را خریداری کرده اند و وارد سیستم شده اند میتوانند برای این محصول دیدگاه ارسال کنند.
قیمت
دیدگاهها
هیچ دیدگاهی برای این محصول نوشته نشده است.