
يساعدك kubeaudit في تدقيق مجموعات Kubernetes الخاصة بك مقابل ضوابط الأمان الشائعة.
أصبح الآن مطلوبًا أن تعمل الكتلة على Kubernetes >=1.19.
سيتم إهمال التسميات (labels) المتجاوزة التي تحتوي على تعليقات توضيحية (annotations) غير مسجلة من
kubernetes.io. سيكون من الضروري قريبًا استخدامkubeaudit.ioبدلاً من ذلك. يرجى الرجوع إلى هذه المناقشة لمزيد من السياق.
من المقرر إهمال Kubeaudit بحلول أكتوبر 2024.
نحن نبحث بنشاط عن مطورين مهتمين بتولي مسؤولية هذا المشروع. إذا كنت شغوفًا بمواصلة تطويره وصيانته، فيرجى التواصل معنا.
للمستخدمين الذين يبحثون عن بدائل، نوصي بالانتقال إلى Kubebench، الذي يوفر وظائف مماثلة ويتم صيانته بنشاط.
نشكر المجتمع على مساهماتكم ودعمكم.
kubeaudit هي أداة سطر أوامر وحزمة Go لتدقيق مجموعات Kubernetes لمخاوف أمنية متنوعة، مثل:
باختصار. kubeaudit يضمن لك نشر حاويات آمنة!
لاستخدام kubeaudit كحزمة Go، راجع وثائق الحزمة.
سيركز باقي ملف README هذا على كيفية استخدام kubeaudit كأداة سطر أوامر.
brew install kubeaudit
لدى Kubeaudit إصدارات رسمية مباركة ومستقرة: الإصدارات الرسمية
قد يحتوي الفرع الرئيسي على ميزات أحدث من الإصدارات المستقرة. إذا كنت بحاجة إلى ميزة أحدث غير مدرجة بعد في إصدار، فتأكد من أنك تستخدم أحدث إصدار من Go وقم بتشغيل ما يلي:
go get -v github.com/Shopify/kubeaudit
ابدأ استخدام kubeaudit من خلال البدء السريع أو اعرض جميع الأوامر المدعومة.
المتطلب الأساسي: kubectl v1.12.0 أو أحدث
مع إصدار kubectl v1.12.0 الذي يقدم قابلية الإضافة بسهولة للوظائف الخارجية، يمكن استدعاء kubeaudit كـ kubectl audit عن طريق:
make plugin وجعل $GOPATH/bin متاحًا في مسارك.أو
kubectl-audit وجعله متاحًا في مسارك.لم نعد ننشر الصور إلى Docker Hub (منذ أن أوقفت Docker Hub خطط المؤسسات المجانية). في الوقت الحالي، الصور القديمة لا تزال متاحة ولكن قد تتوقف عن التوفر في أي وقت. سنبدأ في نشر الصور إلى سجل حاويات Github قريبًا.
لتشغيل kubeaudit كوظيفة في مجموعتك، راجع تشغيل kubeaudit في مجموعة.
لدى kubeaudit ثلاثة أوضاع:
إذا تم توفير ملف مانيفست Kubernetes باستخدام العلامة -f/--manifest، سيقوم kubeaudit بتدقيق ملف المانيفست.
مثال الأمر:
kubeaudit all -f "/path/to/manifest.yml"
مثال الإخراج:
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- النتائج لـ ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [خطأ] AppArmorAnnotationMissing
الرسالة: التعليق التوضيحي لـ AppArmor مفقود. يجب إضافة التعليق التوضيحي 'container.apparmor.security.beta.kubernetes.io/container'.
البيانات الوصفية:
الحاوية: container
التعليق التوضيحي المفقود: container.apparmor.security.beta.kubernetes.io/container
-- [خطأ] AutomountServiceAccountTokenTrueAndDefaultSA
الرسالة: حساب الخدمة الافتراضي مع الرمز المميز مركب. يجب تعيين automountServiceAccountToken إلى 'false' أو يجب استخدام حساب خدمة غير افتراضي.
-- [خطأ] CapabilityShouldDropAll
الرسالة: لم يتم تعيين القدرة إلى ALL. من الأفضل إسقاط جميع القدرات وإضافة القدرات المحددة التي تحتاجها إلى قائمة الإضافة.
البيانات الوصفية:
الحاوية: container
القدرة: AUDIT_WRITE
...
إذا لم يتم العثور على أي أخطاء ذات خطورة دنيا معينة، يتم إرجاع ما يلي:
تم الانتهاء من جميع الفحوصات. تم العثور على 0 ثغرات عالية الخطورة.
يدعم وضع المانيفست أيضًا الإصلاح التلقائي لجميع المشكلات الأمنية باستخدام الأمر autofix:
kubeaudit autofix -f "/path/to/manifest.yml"
لكتابة المانيفست المُصلَح إلى ملف جديد بدلاً من تعديل الملف المصدر، استخدم العلامة -o/--output.
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
لإصلاح مانيفست بناءً على قواعد مخصصة محددة في ملف تكوين kubeaudit، استخدم العلامة -k/--kconfig.
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
يمكن لـ Kubeaudit اكتشاف ما إذا كان يعمل داخل حاوية في الكتلة. إذا كان الأمر كذلك، فسيحاول تدقيق جميع موارد Kubernetes في تلك الكتلة:
kubeaudit all
سيحاول Kubeaudit الاتصال بكتلة باستخدام ملف kubeconfig المحلي ($HOME/.kube/config). يمكن تحديد موقع kubeconfig مختلف باستخدام العلامة --kubeconfig. لتحديد سياق kubeconfig، استخدم العلامة -c/--context.
kubeaudit all --kubeconfig "/path/to/config" --context my_cluster
لمزيد من المعلومات حول ملفات تكوين kubernetes، راجع https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
ينتج Kubeaudit نتائج بثلاث مستويات من الخطورة:
خطأ: مشكلة أمنية أو تكوين Kubernetes غير صحيحتحذير: توصية بأفضل الممارساتمعلومات: إعلامي، لا يتطلب إجراءً. يتضمن ذلك النتائج التي تم تجاوزهايمكن تعيين الحد الأدنى لمستوى الخطورة باستخدام العلامة --minSeverity/-m.
بشكل افتراضي، سيقوم kubeaudit بإخراج النتائج بطريقة قابلة للقراءة البشرية. إذا كان الإخراج مخصصًا لمزيد من المعالجة، يمكن ضبطه لإخراج JSON باستخدام العلامة --format json. لإخراج النتائج كسجلات (الافتراضي السابق) استخدم --format logrus. تتضمن بعض تنسيقات الإخراج ألوانًا لتسهيل قراءة النتائج في الطرفية. لتعطيل الألوان (على سبيل المثال، إذا كنت ترسل الإخراج إلى ملف نصي)، يمكنك استخدام العلامة --no-color.
يمكنك إنشاء تقرير kubeaudit بتنسيق SARIF باستخدام العلامة --format sarif. لكتابة نتائج SARIF إلى ملف، يمكنك إعادة توجيه الإخراج باستخدام >. على سبيل المثال:
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
إذا كانت هناك نتائج بمستوى خطورة error، فسيخرج kubeaudit برمز خروج 2. يمكن تغيير ذلك باستخدام العلامة --exitcode/-e.
لجميع طرق تخصيص kubeaudit، راجع العلامات العامة.
يمكن أيضًا تشغيل المدققين بشكل فردي.
يمكن استخدام تكوين kubeaudit لشيئين:
يمكن تمثيل أي تكوين يمكن تحديده باستخدام علامات للمدققين الفرديين باستخدام التكوين.
التكوين له التنسيق التالي:
enabledAuditors:
# المدققون ممكّنون افتراضيًا إذا لم يتم تعيينهم صراحةً إلى "false"
apparmor: false
asat: false
capabilities: true
deprecatedapis: true
hostns: true
image: true
limits: true
mounts: true
netpols: true
nonroot: true
privesc: true
privileged: true
rootfs: true
seccomp: true
auditors:
capabilities:
# أضف القدرات المطلوبة إلى قائمة الإضافة، حتى لا يبلغ kubeaudit عن أخطاء
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# إذا لم يتم تحديد إصدارات وتم تمكين مدقق 'deprecatedapis'، سيتم إنشاء نتائج WARN
# للموارد المحددة بإصدار API مهمل.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# إذا لم يتم تحديد صورة وتم تمكين مدقق 'image'، سيتم إنشاء نتائج WARN
# للحاويات التي تستخدم صورة بدون علامة
image: 'myimage:mytag'
limits:
# إذا لم يتم تحديد حدود وتم تمكين مدقق 'limits'، سيتم إنشاء نتائج WARN
# للحاويات التي لا تحتوي على حدود cpu أو memory محددة
cpu: '750m'
memory: '500m'
لمزيد من التفاصيل حول كل مدقق، بما في ذلك وصف التكوين الخاص بالمدقق في التكوين، راجع وثائق المدقق.
ملاحظة: تكوين kubeaudit ليس هو نفسه ملف kubeconfig المحدد بالعلامة --kubeconfig، والذي يشير إلى ملف تكوين Kubernetes (راجع الوضع المحلي). لاحظ أيضًا أن أمرى all و autofix فقط هما اللذان يدعمان استخدام تكوين kubeaudit. لن يعمل مع الأوامر الأخرى.
ملاحظة: إذا تم استخدام العلامات مع ملف التكوين، فستكون العلامات لها الأولوية.
يمكن تجاهل المشكلات الأمنية لحاويات أو بودات محددة عن طريق إضافة تسميات تجاوز (override labels). وهذا يعني أن المدقق سينتج نتائج info بدلاً من نتائج error وسيتم إلحاق اسم نتيجة التدقيق بـ Allowed. يتم توثيق التسميات في وثائق كل مدقق، ولكن التنسيق العام للمدققين الذين يدعمون التجاوزات هو كما يلي:
تتكون تسمية التجاوز من مفتاح و قيمة.
المفتاح هو مزيج من نوع التجاوز (حاوية أو بود) و معرف التجاوز الفريد لكل مدقق (راجع الوثائق للمدقق المحدد). يمكن أن يأخذ المفتاح أحد شكلين اعتمادًا على نوع التجاوز:
container.kubeaudit.io/[اسم الحاوية].[معرف التجاوز]
kubeaudit.io/[معرف التجاوز]
إذا تم تعيين القيمة إلى سلسلة غير فارغة، فسيتم عرضها في نتيجة info كـ OverrideReason:
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- النتائج لـ ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [معلومات] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
الرسالة: تم تجاوز نتيجة التدقيق: حساب الخدمة الافتراضي مع الرمز المميز مركب. يجب تعيين automountServiceAccountToken إلى 'false' أو يجب استخدام حساب خدمة غير افتراضي.
البيانات الوصفية:
سبب التجاوز: SomeReason
وفقًا لمواصفات Kubernetes، يجب ألا يزيد value عن 63 حرفًا ويجب أن يكون فارغًا أو يبدأ وينتهي بحرف أبجدي رقمي ([a-z0-9A-Z]) مع شرطات (-)، وشرطات سفلية (_)، ونقاط (.)، وأحرف أبجدية رقمية بينها.
يمكن إضافة تسميات تجاوز متعددة (لعدة مدققين) إلى نفس المورد.
راجع وثائق المدقق المحددة للمدقق الذي ترغب في تجاوزه للحصول على أمثلة.
لمعرفة المزيد عن التسميات، راجع https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
إذا كنت ترغب في إصلاح خطأ، أو المساهمة بميزة، أو مجرد تصحيح خطأ إملائي، فلا تتردد في القيام بذلك طالما تتبعت قواعد السلوك الخاصة بنا.
go get github.com/Shopify/kubeauditcd $GOPATH/src/github.com/Shopify/kubeauditgit remote add fork https://github.com/you-are-awesome/kubeauditgit checkout -b awesome-new-featureUSE_KIND=true make test (لتشغيل الاختبارات بدون Kind: make test)git commit -am 'يضيف ميزة رائعة'git push forkلاحظ أنه إذا لم تقم بتوقيع CLA قبل فتح طلب السحب الخاص بك، يمكنك إعادة تشغيل الفحص عن طريق إضافة تعليق إلى طلب السحب يقول "I've signed the CLA!"!
| الأمر | الوصف | التوثيق |
|---|
all | تشغيل جميع المدققين المتاحين، أو أولئك المحددين باستخدام تكوين kubeaudit. | docs |
autofix | إصلاح المشكلات الأمنية تلقائيًا. | docs |
version | طباعة إصدار kubeaudit الحالي. |
| الأمر | الوصف | التوثيق |
|---|
apparmor | العثور على الحاويات التي تعمل بدون AppArmor. | docs |
asat | العثور على البودات التي تستخدم حساب خدمة افتراضيًا مركبًا تلقائيًا. | docs |
capabilities | العثور على الحاويات التي لا تسقط القدرات الموصى بها أو تضيف قدرات جديدة. | docs |
deprecatedapis | العثور على أي مورد محدد بإصدار API مهمل. | docs |
hostns | العثور على الحاويات التي لديها HostPID أو HostIPC أو HostNetwork ممكّنة. | docs |
image | العثور على الحاويات التي لا تستخدم الإصدار المطلوب من الصورة (عبر العلامة) أو تستخدم صورة بدون علامة. | docs |
limits | العثور على الحاويات التي تتجاوز حدود CPU والذاكرة المحددة أو لا تحدد أيًا منها. | docs |
mounts | العثور على الحاويات التي تحتوي على مسارات مضيفة حساسة مركبة. | docs |
netpols | العثور على مساحات الأسماء التي لا تحتوي على سياسة شبكة من نوع منع-الكل-افتراضيًا. | docs |
nonroot | العثور على الحاويات التي تعمل كـ root. | docs |
privesc | العثور على الحاويات التي تسمح بتصعيد الامتيازات. | docs |
privileged | العثور على الحاويات التي تعمل بامتيازات. | docs |
rootfs | العثور على الحاويات التي لا تحتوي على نظام ملفات جذري للقراءة فقط. | docs |
seccomp | العثور على الحاويات التي تعمل بدون Seccomp. | docs |
| قصير | طويل | الوصف |
|---|
| --format | تنسيق الإخراج المستخدم (أحد "sarif", "pretty", "logrus", "json") (الافتراضي هو "pretty") | |
| --kubeconfig | مسار ملف تكوين Kubernetes المحلي. يُستخدم فقط في الوضع المحلي (الافتراضي هو $HOME/.kube/config) | |
| -c | --context | اسم سياق kubeconfig المراد استخدامه |
| -f | --manifest | مسار ملف yaml المراد تدقيقه. يُستخدم فقط في وضع المانيفست. يمكنك استخدام - للقراءة من stdin. |
| -n | --namespace | تدقيق الموارد فقط في مساحة الاسم المحددة. غير مدعوم حاليًا في وضع المانيفست. |
| -g | --includegenerated | تضمين الموارد المُنشأة في الفحص (مثل البودات المُنشأة بواسطة النشر). إذا كنت ترغب في أن ينتج kubeaudit نتائج للموارد المُنشأة (على سبيل المثال إذا كان لديك موارد مخصصة أو تريد التقاط الموارد التي أصبحت يتيمة حيث لم يعد المورد المالك موجودًا)، يمكنك استخدام هذه العلامة. |
| -m | --minseverity | تعيين أدنى مستوى خطورة لإظهاره (أحد "error", "warning", "info") (الافتراضي هو "info") |
| -e | --exitcode | رمز الخروج المستخدم في حالة وجود نتائج بمستوى خطورة "error". تقليديًا، 0 يُستخدم للنجاح وجميع الرموز غير الصفرية للأخطاء. (الافتراضي هو 2) |
| --no-color | عدم استخدام الألوان في الإخراج (الافتراضي هو false) |