وصول حاوية الأمان إلى الموارد باستخدام ميزات أمان Linux المضمنة
في هذه المقالة، ستتعلم كيفية تأمين وصول الحاوية إلى الموارد لأحمال عمل Azure Kubernetes Service (AKS).
نظرة عامة
بنفس الطريقة التي يجب أن تمنح بها المستخدمين أو المجموعات الحد الأدنى من الامتيازات المطلوبة، يجب أيضاً قصر الحاويات على الإجراءات والعمليات الضرورية فقط. لتقليل مخاطر الهجوم، تجنب تكوين التطبيقات والحاويات التي تتطلب تصعيد الامتيازات أو الوصول إلى الجذر.
يمكنك استخدام سياقات أمان Kubernetes pod المضمنة لتحديد المزيد من الأذونات، مثل المستخدم أو المجموعة للتشغيل ك، أو قدرات Linux للكشف، أو الإعداد allowPrivilegeEscalation: false
في بيان pod. لمزيد من أفضل الممارسات، راجع الوصول الآمن إلى الموارد.
لمزيد من التحكم الدقيق في إجراءات الحاوية، يمكنك استخدام ميزات أمان Linux المضمنة مثل AppArmor و seccomp.
- حدد ميزات أمان Linux على مستوى العقدة.
- تنفيذ الميزات من خلال بيان جراب.
تتوفر ميزات أمان Linux المضمنة فقط على عقد Linux وأجهزة pods.
إشعار
حاليا، بيئات Kubernetes ليست آمنة تماما للاستخدام العدائي متعدد المستأجرين. ميزات أمان إضافية، مثل Microsoft Defender for Containers أو AppArmor أو seccomp أو Pod Security Admission أو Kubernetes RBAC للعقد، تمنع عمليات الاستغلال بكفاءة.
للأمان الحقيقي عند تشغيل أحمال عمل عدائية متعددة المستأجرين، لا تثق إلا في برنامج مراقبة الأجهزة الافتراضية. مجال الأمان لـ Kubernetes يصبح المجموعة بأكملها، وليس عقدة فردية.
بالنسبة لهذه الأنواع من أحمال العمل العدائية متعددة المستأجرين، يجب عليك استخدام مجموعات معزولة ماديا.
درع التطبيق
للحد من إجراءات الحاوية، يمكنك استخدام وحدة أمان AppArmor Linux kernel. يتوفر AppArmor كجزء من نظام تشغيل عقدة AKS الأساسي ويتم تمكينه افتراضيا. يمكنك إنشاء ملفات تعريف AppArmor التي تقيد القراءة أو الكتابة أو تنفيذ الإجراءات أو وظائف النظام مثل تركيب أنظمة الملفات. تقيد ملفات تعريف AppArmor الافتراضية الوصول إلى مواقع ومواقع /sys
مختلفة /proc
وتوفر وسيلة لعزل الحاويات منطقيا عن العقدة الأساسية. يعمل AppArmor مع أي تطبيق يعمل على Linux، وليس فقط Kubernetes pods.
لمشاهدة AppArmor أثناء العمل، يقوم المثال التالي بإنشاء ملف تعريف يمنع الكتابة إلى الملفات.
SSH إلى عقدة AKS.
قم بإنشاء ملف باسم deny-write.profile.
انسخ والصق المحتوى التالي:
#include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, }
تتم إضافة ملفات تعريف AppArmor باستخدام الأمر apparmor_parser
.
أضف ملف التعريف إلى AppArmor.
حدد اسم ملف التعريف الذي تم إنشاؤه في الخطوة السابقة:
sudo apparmor_parser deny-write.profile
إذا تم تحليل ملف التعريف بشكل صحيح وتطبيقه على AppArmor، فلن ترى أي إخراج وستعود إلى موجه الأوامر.
من جهازك المحلي، قم بإنشاء بيان pod باسم aks-apparmor.yaml. هذا البيان:
- يحدد تعليقاً توضيحياً لـ
container.apparmor.security.beta.kubernetes
. - يشير إلى ملف التعريف deny-write الذي تم إنشاؤه في الخطوات السابقة.
apiVersion: v1 kind: Pod metadata: name: hello-apparmor annotations: container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write spec: containers: - name: hello image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
- يحدد تعليقاً توضيحياً لـ
مع نشر pod، قم بتشغيل الأمر التالي وتحقق من أن hello-apparmor pod يظهر حالة التشغيل :
kubectl get pods NAME READY STATUS RESTARTS AGE aks-ssh 1/1 Running 0 4m2s hello-apparmor 0/1 Running 0 50s
لمزيد من المعلومات عن AppArmor، راجع ملفات تعريف AppArmor في Kubernetes.
الحوسبة الآمنة (seccomp)
أثناء عمل AppArmor مع أي تطبيق Linux، يعمل seccomp (secure computing) على مستوى العملية. Seccomp هي أيضا وحدة أمان Linux kernel وهي مدعومة أصلا من قبل containerd
وقت التشغيل المستخدم من قبل عقد AKS. باستخدام seccomp، يمكنك الحد من استدعاءات نظام الحاوية. ينشئ Seccomp طبقة إضافية من الحماية ضد الثغرات الأمنية لاستدعاء النظام الشائعة التي تستغلها الجهات الفاعلة الضارة ويسمح لك بتحديد ملف تعريف افتراضي لجميع أحمال العمل في العقدة.
تكوين ملف تعريف seccomp افتراضي (معاينة)
يمكنك تطبيق ملفات تعريف seccomp الافتراضية باستخدام تكوينات العقدة المخصصة عند إنشاء تجمع عقدة Linux جديد. هناك قيمتان معتمدتان على AKS: RuntimeDefault
و Unconfined
. قد تتطلب بعض أحمال العمل عددا أقل من قيود syscall من غيرها. وهذا يعني أنها يمكن أن تفشل أثناء وقت التشغيل مع ملف تعريف 'RuntimeDefault'. للتخفيف من مثل هذا الفشل، يمكنك تحديد Unconfined
ملف التعريف. إذا كان حمل العمل يتطلب ملف تعريف مخصص، فشاهد تكوين ملف تعريف seccomp مخصص.
القيود
- SeccompDefault ليست معلمة معتمدة لتجمعات عقد windows.
- SeccompDefault متاح بدءا من 2024-09-02-preview API.
هام
تتوفر ميزات معاينة AKS على أساس الخدمة الذاتية والاشتراك. يتم توفير المعاينات "كما هي" و"كما هي متوفرة"، ويتم استبعادها من اتفاقيات مستوى الخدمة والضمان المحدود. تتم تغطية معاينات AKS جزئيًا بواسطة دعم العملاء على أساس بذل أفضل الجهود. على هذا النحو، هذه الميزات ليست مخصصة للاستخدام الإنتاجي. لمزيد من المعلومات، يُرجي الاطلاع على مقالات الدعم الآتية:
تسجيل KubeletDefaultSeccompProfilePreview
العلامات المميزة
تسجيل علامة الميزة
KubeletDefaultSeccompProfilePreview
باستخدامaz feature register
الأمر .az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
يستغرق الأمر بضع دقائق حتى تظهر الحالة مُسجل.
تحقق من حالة التسجيل باستخدام
az feature show
الأمر .az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
عندما تعكس الحالة Registered، قم بتحديث تسجيل موفر موارد Microsoft.ContainerService باستخدام
az provider register
الأمر .az provider register --namespace Microsoft.ContainerService
تقييد استدعاءات نظام الحاوية باستخدام seccomp
1. اتبع الخطوات لتطبيق ملف تعريف seccomp في تكوين kubelet الخاص بك عن طريق تحديد "seccompDefault": "RuntimeDefault"
.
RuntimeDefault
يستخدم ملف تعريف seccomp الافتراضي لحاوية، ما يقيد استدعاءات نظام معينة لتحسين الأمان. ستفشل syscalls المقيدة. لمزيد من المعلومات، راجع ملف تعريف seccomp الافتراضي containerD.
2. تحقق من تطبيق التكوين.
يمكنك تأكيد تطبيق الإعدادات على العقد عن طريق الاتصال بالمضيف والتحقق من إجراء تغييرات التكوين على نظام الملفات.
3. استكشاف أخطاء فشل حمل العمل وإصلاحها.
عند تمكين SeccompDefault، يتم استخدام ملف تعريف seccomp الافتراضي لوقت تشغيل الحاوية بشكل افتراضي لجميع أحمال العمل المجدولة على العقدة. قد يؤدي هذا إلى فشل أحمال العمل بسبب syscalls المحظورة. إذا حدث فشل في حمل العمل، فقد ترى أخطاء مثل:
- يوجد حمل العمل بشكل غير متوقع بعد تمكين الميزة، مع خطأ "رفض الإذن".
- يمكن أيضا رؤية رسائل خطأ Seccomp في سجل النظام أو التدقيق عن طريق استبدال SCMP_ACT_ERRNO SCMP_ACT_LOG في ملف التعريف الافتراضي.
إذا واجهت الأخطاء المذكورة أعلاه، نوصي بتغيير ملف تعريف seccomp الخاص بك إلى Unconfined
. Unconfined
لا يضع أي قيود على syscalls، ما يسمح بجميع استدعاءات النظام، ما يقلل من الأمان.
تكوين ملف تعريف seccomp مخصص
باستخدام ملف تعريف seccomp مخصص، يمكنك الحصول على تحكم أكثر دقة على syscalls المقيدة. توافق مع أفضل ممارسة لمنح الحاوية الحد الأدنى من الإذن فقط للتشغيل من خلال:
- تحديد مع عوامل التصفية الإجراءات التي يجب السماح بها أو رفضها.
- إضافة تعليق توضيحي داخل بيان جراب YAML لربطه بعامل تصفية seccomp.
لمشاهدة seccomp قيد التنفيذ، قم بإنشاء عامل تصفية يمنع تغيير الأذونات على ملف.
SSH إلى عقدة AKS.
أنشئ عامل تصفية seccomp باسم / var / lib / kubelet / seccomp / Prevention-chmod.
انسخ والصق المحتوى التالي:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" }, { "name": "fchmodat", "action": "SCMP_ACT_ERRNO" }, { "name": "chmodat", "action": "SCMP_ACT_ERRNO" } ] }
في الإصدار 1.19 والإصدارات الأحدث، تحتاج إلى تكوين:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["chmod","fchmodat","chmodat"], "action": "SCMP_ACT_ERRNO" } ] }
من جهازك المحلي، قم بإنشاء بيان pod باسم aks-seccomp.yaml والصق المحتوى التالي. هذا البيان:
- يحدد تعليقاً توضيحياً لـ
seccomp.security.alpha.kubernetes.io
. - يشير إلى عامل التصفية Prevention-chmod الذي تم إنشاؤه في الخطوة السابقة.
apiVersion: v1 kind: Pod metadata: name: chmod-prevented annotations: seccomp.security.alpha.kubernetes.io/pod: localhost/prevent-chmod spec: containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
في الإصدار 1.19 والإصدارات الأحدث، تحتاج إلى تكوين:
apiVersion: v1 kind: Pod metadata: name: chmod-prevented spec: securityContext: seccompProfile: type: Localhost localhostProfile: prevent-chmod containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
- يحدد تعليقاً توضيحياً لـ
انشر نموذج pod باستخدام الأمر kubectl apply :
kubectl apply -f ./aks-seccomp.yaml
اعرض حالة pod باستخدام الأمر kubectl get pods.
- يُبلغ pod عن خطأ.
chmod
يتم منع الأمر من التشغيل بواسطة عامل تصفية seccomp، كما هو موضح في إخراج المثال:
kubectl get pods NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
خيارات ملف تعريف أمان Seccomp
ملفات تعريف أمان Seccomp هي مجموعة من syscalls المحددة المسموح بها أو المقيدة. تحتوي معظم أوقات تشغيل الحاوية على ملف تعريف seccomp افتراضي مشابه إذا لم يكن هو نفسه الذي يستخدمه Docker. لمزيد من المعلومات حول ملفات التعريف المتوفرة، راجع ملفات تعريف docker أو containerD seccomp الافتراضية.
تستخدم AKS ملف تعريف seccomp الافتراضي containerD ل RuntimeDefault عند تكوين seccomp باستخدام تكوين العقدة المخصصة.
تم حظر syscalls كبيرة بشكل افتراضي
يحتفظ كل من Docker و containerD بقوائم السماح ل syscalls الآمنة. يسرد هذا الجدول syscalls الهامة (وليس كلها) التي تم حظرها بشكل فعال لأنها ليست على قائمة السماح. إذا كان أي من syscalls المحظورة مطلوبة من قبل حمل العمل الخاص بك، فلا تستخدم RuntimeDefault
ملف تعريف seccomp.
عند إجراء تغييرات على Docker و containerD، تقوم AKS بتحديث التكوين الافتراضي الخاص بهم لمطابقته. قد تتسبب تحديثات هذه القائمة في فشل حمل العمل. للحصول على تحديثات الإصدار، راجع ملاحظات إصدار AKS.
حظر syscall | الوصف |
---|---|
acct |
Accounting syscall الذي يمكن أن يسمح للحاويات بتعطيل حدود الموارد الخاصة بها أو معالجة المحاسبة. مسورة أيضا بواسطة CAP_SYS_PACCT . |
add_key |
منع الحاويات من استخدام مفتاح kernel، وهو غير مساحة الاسم. |
bpf |
رفض تحميل برامج bpf التي يحتمل أن تكون مستمرة في نواة، مسورة بالفعل بواسطة CAP_SYS_ADMIN . |
clock_adjtime |
الوقت/التاريخ ليس مساحة الاسم. مسورة أيضا بواسطة CAP_SYS_TIME . |
clock_settime |
الوقت/التاريخ ليس مساحة الاسم. مسورة أيضا بواسطة CAP_SYS_TIME . |
clone |
رفض استنساخ مساحات أسماء جديدة. مسورة أيضا بالأعلام CAP_SYS_ADMIN for CLONE_* ، باستثناء CLONE_NEWUSER . |
create_module |
رفض المعالجة والوظائف على وحدات النواة. قديم. مسورة أيضا بواسطة CAP_SYS_MODULE . |
delete_module |
رفض المعالجة والوظائف على وحدات النواة. مسورة أيضا بواسطة CAP_SYS_MODULE . |
finit_module |
رفض المعالجة والوظائف على وحدات النواة. مسورة أيضا بواسطة CAP_SYS_MODULE . |
get_kernel_syms |
رفض استرداد رموز النواة والوحدة النمطية المصدرة. قديم. |
get_mempolicy |
Syscall الذي يعدل ذاكرة النواة وإعدادات NUMA. تم بالفعل بوابة بواسطة CAP_SYS_NICE . |
init_module |
رفض المعالجة والوظائف على وحدات النواة. مسورة أيضا بواسطة CAP_SYS_MODULE . |
ioperm |
منع الحاويات من تعديل مستويات امتيازات إدخال/إخراج النواة. تم بالفعل بوابة بواسطة CAP_SYS_RAWIO . |
iopl |
منع الحاويات من تعديل مستويات امتيازات إدخال/إخراج النواة. تم بالفعل بوابة بواسطة CAP_SYS_RAWIO . |
kcmp |
تقييد قدرات فحص العملية، المحظورة بالفعل عن طريق إسقاط CAP_SYS_PTRACE . |
kexec_file_load |
شقيقة syscall من kexec_load أن يفعل الشيء نفسه، حجج مختلفة قليلا. مسورة أيضا بواسطة CAP_SYS_BOOT . |
kexec_load |
رفض تحميل نواة جديدة للتنفيذ لاحقا. مسورة أيضا بواسطة CAP_SYS_BOOT . |
keyctl |
منع الحاويات من استخدام مفتاح kernel، وهو غير مساحة الاسم. |
lookup_dcookie |
تتبع/جمع معلومات syscall، والتي قد تسرب المعلومات على المضيف. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
mbind |
Syscall الذي يعدل ذاكرة النواة وإعدادات NUMA. تم بالفعل بوابة بواسطة CAP_SYS_NICE . |
mount |
رفض التركيب، مسور بالفعل بواسطة CAP_SYS_ADMIN . |
move_pages |
Syscall الذي يعدل ذاكرة النواة وإعدادات NUMA. |
nfsservctl |
رفض التفاعل مع kernel nfs daemon. قديم منذ Linux 3.1. |
open_by_handle_at |
سبب تعطل حاوية قديمة. مسورة أيضا بواسطة CAP_DAC_READ_SEARCH . |
perf_event_open |
تتبع/جمع معلومات syscall، والتي قد تسرب المعلومات على المضيف. |
personality |
منع الحاوية من تمكين محاكاة BSD. ليست خطرة بطبيعتها، ولكنها ضعيفة الاختبار، محتملة ل kernel vulns. |
pivot_root |
رفض pivot_root، يجب أن تكون عملية مميزة. |
process_vm_readv |
تقييد قدرات فحص العملية، المحظورة بالفعل عن طريق إسقاط CAP_SYS_PTRACE . |
process_vm_writev |
تقييد قدرات فحص العملية، المحظورة بالفعل عن طريق إسقاط CAP_SYS_PTRACE . |
ptrace |
تتبع/جمع المعلومات syscall. محظور في إصدارات Linux kernel قبل 4.8 لتجنب تجاوز seccomp. تم حظر عمليات التتبع/التنميط العشوائية بالفعل عن طريق إسقاط CAP_SYS_PTRACE، لأنها قد تسرب المعلومات على المضيف. |
query_module |
رفض المعالجة والوظائف على وحدات النواة. قديم. |
quotactl |
الحصة النسبية syscall التي يمكن أن تسمح للحاويات بتعطيل حدود الموارد الخاصة بها أو معالجة المحاسبة. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
reboot |
لا تدع الحاويات تعيد تشغيل المضيف. مسورة أيضا بواسطة CAP_SYS_BOOT . |
request_key |
منع الحاويات من استخدام مفتاح kernel، وهو غير مساحة الاسم. |
set_mempolicy |
Syscall الذي يعدل ذاكرة النواة وإعدادات NUMA. تم بالفعل بوابة بواسطة CAP_SYS_NICE . |
setns |
رفض ربط مؤشر ترابط بمساحة اسم. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
settimeofday |
الوقت/التاريخ ليس مساحة الاسم. مسورة أيضا بواسطة CAP_SYS_TIME . |
stime |
الوقت/التاريخ ليس مساحة الاسم. مسورة أيضا بواسطة CAP_SYS_TIME . |
swapon |
رفض تبديل البدء/الإيقاف إلى ملف/جهاز. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
swapoff |
رفض تبديل البدء/الإيقاف إلى ملف/جهاز. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
sysfs |
syscall قديم. |
_sysctl |
قديم، تم استبداله ب /proc/sys. |
umount |
يجب أن تكون عملية مميزة. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
umount2 |
يجب أن تكون عملية مميزة. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
unshare |
رفض استنساخ مساحات أسماء جديدة للعمليات. مسور أيضا بواسطة CAP_SYS_ADMIN ، باستثناء unshare --user. |
uselib |
syscall الأقدم المتعلقة بالمكتبات المشتركة، غير مستخدمة لفترة طويلة. |
userfaultfd |
معالجة أخطاء صفحة مساحة المستخدم، وهي مطلوبة إلى حد كبير لترحيل العملية. |
ustat |
syscall قديم. |
vm86 |
في الجهاز الظاهري لوضع kernel x86 الحقيقي. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
vm86old |
في الجهاز الظاهري لوضع kernel x86 الحقيقي. مسورة أيضا بواسطة CAP_SYS_ADMIN . |
الخطوات التالية
للاطلاع على أفضل الممارسات ذات الصلة، راجع أفضل ممارسات أمان وترقيات نظام المجموعة في AKS وأفضل ممارسات أمان الجراب في AKS.
Azure Kubernetes Service