AppArmor - تحسين لنواة النظام لتحديد نطاق عمل البرامج لمجموعة محدودة من الموارد.
الوصف
AppArmor هو تحسين لنواة النظام لتحديد نطاق عمل البرامج لمجموعة محدودة من الموارد. يتمثل نموذج الأمان الفريد لـ AppArmor في ربط سمات التحكم في الوصول بالبرامج بدلاً من المستخدمين.
يتم توفير احتواء AppArmor عبر ملفات التعريف التي يتم تحميلها في النواة عبر apparmor_parser(8)، وعادةً من خلال وحدة نظام apparmor.service systemd، والتي تُستخدم على النحو التالي:
# systemctl start apparmor
# systemctl reload apparmor
يمكن أن يعمل AppArmor في وضعين: الإنفاذ، أو التنبيه أو التعلم:
الإنفاذ - ستؤدي ملفات التعريف التي تم تحميلها في وضع الإنفاذ إلى تطبيق السياسة المحددة في ملف التعريف، بالإضافة إلى الإبلاغ عن محاولات انتهاك السياسة إلى syslogd.
التنبيه - لا تقوم ملفات التعريف التي تم تحميلها في وضع "التنبيه" بتطبيق السياسة. بدلاً من ذلك، ستقوم بالإبلاغ عن محاولات انتهاك السياسة. هذا الوضع مناسب لتطوير ملفات التعريف. لإدارة وضع التنبيه لملفات التعريف الفردية، يمكن استخدام الأدوات المساعدة aa-complain(8) و aa-enforce(8). تأخذ هذه الأدوات المساعدة اسم البرنامج كمعامل.
تُخزّن ملفات التعريف تقليديًا في ملفات في /etc/apparmor.d/ تحت أسماء ملفات باستخدام اصطلاح استبدال / في أسماء المسارات بـ . (باستثناء الجذر /) بحيث يسهل إدارة ملفات التعريف (على سبيل المثال، سيكون اسم ملف التعريف الخاص بـ /usr/sbin/nscd هو usr.sbin.nscd).
تُطبّق ملفات التعريف على العملية في وقت exec(3) (كما يظهر من خلال استدعاء النظام execve(2)): بمجرد تحميل ملف تعريف لبرنامج، سيتم تطبيق الاحتواء على هذا البرنامج في المرة التالية التي يتم فيها استدعاء exec(3). إذا كانت العملية قيد التشغيل بالفعل تحت ملف تعريف، وعندما يتم استبدال هذا الملف في النواة، يتم تطبيق ملف التعريف المحدث على هذه العملية على الفور. من ناحية أخرى، لا يمكن احتواء عملية قيد التشغيل بالفعل غير خاضعة للاحتواء.
يدعم AppArmor نظام الملفات securityfs الخاص بنواة Linux، ويتيح قائمة ملفات التعريف التي تم تحميلها حاليًا؛ لتثبيت نظام الملفات:
# mount -tsecurityfs securityfs /sys/kernel/security
$ cat /sys/kernel/security/apparmor/profiles
/usr/bin/mutt
/usr/bin/gpg
...
عادةً ما يقوم البرنامج النصي للتهيئة بتثبيت securityfs إذا لم يتم تثبيته بالفعل.
يقيد AppArmor أيضًا العمليات ذات الامتيازات التي يمكن للعملية المحتواة تنفيذها، حتى إذا كانت العملية قيد التشغيل كـ root. لا يمكن للعملية المحتواة استدعاء استدعاءات النظام التالية:
create_module(2) delete_module(2) init_module(2) ioperm(2)
iopl(2) ptrace(2) reboot(2) setdomainname(2) sethostname(2) swapoff(2) swapon(2) sysctl(2)
وضع الشكوى
بدلاً من منع الوصول إلى الموارد التي لا يملك الملف الشخص قاعدة لها، يمكن لـ AppArmor "السماح" بالوصول وتسجيل رسالة للعملية التي تؤدي إلى ذلك. يُعرف هذا باسم وضع الشكوى. من المهم ملاحظة أن القواعد الموجودة في الملف الشخص لا تزال مطبقة، لذلك ستظل قواعد السماح تعمل على إسكات أو فرض رسائل التدقيق، وستظل قواعد الرفض تؤدي إلى الرفض وإسكات رسائل الرفض (راجع إيقاف تشغيل إسكات تدقيق الرفض إذا كانت هذه مشكلة).
يمكن استخدام وضع الشكوى لتطوير الملفات الشخصية بشكل تدريجي أثناء تشغيل التطبيق. يمكن إضافة عمليات الوصول المسجلة إلى الملف الشخصي، ثم يمكن تشغيل التطبيق بشكل أكبر لاكتشاف المزيد من الإضافات المطلوبة. نظرًا لأن AppArmor يسمح بعمليات الوصول، فسيتصرف التطبيق كما لو لم يكن AppArmor يقوم بتقييده.
تحذير: لا يوفر وضع الشكوى أي أمان، بل فقط التدقيق، أثناء تمكينه. لا ينبغي استخدامه في بيئة معادية وإلا فقد يتم تسجيل السلوكيات السيئة وإضافتها إلى الملف الشخصي كما لو كانت عمليات وصول للموارد يجب أن يستخدمها التطبيق.
ملاحظة: يمكن أن يكون وضع الشكوى مزعجًا للغاية مع الملفات الشخصية الجديدة أو الفارغة، ولكن مع الملفات الشخصية التي تم تطويرها، قد لا يسجل أي شيء إذا كان الملف الشخصي يغطي سلوك التطبيق جيدًا. راجع الحد من معدل التدقيق إذا كان وضع الشكوى يولد الكثير من رسائل السجل.
لتعيين ملف تعريف وأي ملفات تعريف فرعية أو ملفات تعريف "قبعة" قد يحتوي عليها الملف الشخصي في وضع الشكوى، استخدم:
aa-complain /etc/apparmor.d/<اسم-التطبيق>
لتعيين ملف تعريف معين يدويًا في وضع الشكوى، أضف علامة "complain"، ثم أعد تحميل الملف الشخصي يدويًا:
profile foo flags=(complain) { ... }
لاحظ أنه يجب أيضًا إضافة علامة "complain" يدويًا إلى أي ملفات تعريف "قبعة" أو ملفات تعريف فرعية للملف الشخصي وإلا فسيستمر في استخدام الوضع السابق.
لتمكين وضع الشكوى على مستوى النظام، قم بتشغيل:
echo -n complain > /sys/module/apparmor/parameters/mode
أو لتعيينه عند بدء التشغيل، أضف:
apparmor.mode=complain
كـ معلمة لتهيئة النواة.
تحذير: يؤدي تعيين وضع الشكوى على مستوى النظام إلى تعطيل جميع حماية أمان AppArmor. يمكن أن يكون مفيدًا أثناء التصحيح أو تطوير الملف الشخصي، ولكن تعيينه بشكل انتقائي لكل ملف شخصي هو أكثر أمانًا.
الأخطاء
عندما يحاول برنامج مقيد الوصول إلى ملف ليس لديه إذن للوصول إليه، ستقوم النواة بالإبلاغ عن رسالة عبر التدقيق، على غرار:
audit(1386511672.612:238): apparmor="DENIED" operation="exec"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="x" denied_mask="x" fsuid=0 ouid=0
audit(1386511672.613:239): apparmor="DENIED" operation="open"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
audit(1386511772.804:246): apparmor="DENIED" operation="capable"
parent=7246 profile="/tmp/sh" pid=7589 comm="sh" pid=7589
comm="sh" capability=2 capname="dac_override"
تُصف الأذونات التي يطلبها البرنامج في operation= و denied_mask= (بالنسبة للملفات، تستخدم القدرات تنسيق سجل مختلف قليلاً). يتم الإبلاغ عن "الاسم" ومعرف العملية للبرنامج قيد التشغيل، بالإضافة إلى اسم الملف الشخصي بما في ذلك أي "قبعة" قد تكون نشطة، مفصولة بـ "//". ("الاسم" موجود داخل علامات اقتباس، لأن اسم العملية يقتصر على 15 بايت؛ وهو نفس ما يتم الإبلاغ عنه من خلال حساب عملية Berkeley).
بالنسبة للعمليات المحصورة التي تعمل ضمن ملف تعريف تم تحميله في وضع "التسجيل" (complain mode)، فلن يتم تطبيق آليات الحماية، وستكون رسائل السجل التي يتم إرسالها إلى التدقيق على النحو التالي:
audit(1386512577.017:275): apparmor="ALLOWED" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
audit(1386512577.017:276): apparmor="ALLOWED" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
إذا لم يكن برنامج التدقيق auditd يعمل على مستوى المستخدم، فسيرسل النواة أحداث التدقيق إلى klogd؛ وسيرسل klogd الرسائل إلى syslog، والذي سيسجل الرسائل باستخدام منشأة KERN. وبالتالي، قد تذهب رسائل "الرفض" و "السماح" إما إلى /var/log/audit/audit.log أو /var/log/messages، اعتمادًا على التكوين المحلي.
تصحيح الأخطاء
يوفر AppArmor بعض الأدوات لتسجيل المزيد من المعلومات، والتي يمكن أن تساعد في تصحيح أخطاء الملفات التعريفية.
تفعيل وضع التصحيح
عند تفعيل وضع التصحيح، سيسجل AppArmor بعض الرسائل الإضافية إلى dmesg (وليس عبر نظام التدقيق). على سبيل المثال، ستخبر السجلات ما إذا تم تطبيق تنظيف البيئة.
لتفعيل وضع التصحيح، قم بتشغيل:
echo 1 > /sys/module/apparmor/parameters/debug
أو لتعيينه عند الإقلاع، أضف:
apparmor.debug=1
كـ مُعامل إقلاع للنواة.
إيقاف كتم رسائل التدقيق الخاصة بالرفض
افتراضيًا، لا يتم تسجيل العمليات التي تؤدي إلى قواعد "الرفض". يُعرف هذا باسم كتم رسائل التدقيق الخاصة بالرفض.
لإيقاف كتم رسائل التدقيق الخاصة بالرفض، قم بتشغيل:
echo -n noquiet >/sys/module/apparmor/parameters/audit
أو لتعيينه عند الإقلاع، أضف:
apparmor.audit=noquiet
كمُعامل إقلاع للنواة.
فرض وضع التدقيق
يمكن لـ AppArmor تسجيل رسالة لكل عملية تؤدي إلى قاعدة مُكوَّنة في السياسة. يُعرف هذا باسم فرض وضع التدقيق.
تحذير! يمكن أن يكون وضع التدقيق الإجباري مزعجًا للغاية حتى بالنسبة لملف تعريف واحد، ناهيك عن تفعيله على مستوى العالم.
لتعيين ملف تعريف معين في وضع التدقيق الإجباري، أضف العلامة "audit":
profile foo flags=(audit) { ... }
لتفعيل وضع التدقيق الإجباري على مستوى العالم، قم بتشغيل:
echo -n all > /sys/module/apparmor/parameters/audit
أو لتعيينه عند الإقلاع، أضف:
apparmor.audit=all
كمُعامل إقلاع للنواة.
تحديد معدل رسائل التدقيق
إذا لم يكن برنامج auditd يعمل، لتجنب فقدان الكثير من رسائل السجل الإضافية، فمن المحتمل أن تحتاج إلى إيقاف تحديد المعدل عن طريق القيام بما يلي:
echo 0 > /proc/sys/kernel/printk_ratelimit
ولكن حتى مع ذلك، قد يفيض مخزن النواة الحلقي وقد تفقد بعض الرسائل.
وإلا، إذا كان auditd يعمل، فراجع auditd(8) و auditd.conf(5).
الملفات
/etc/apparmor.d/
/var/cache/apparmor/
/var/log/audit/audit.log
/var/log/messages
انظر أيضًا
apparmor_parser(8)، aa_change_hat(2)، apparmor.d(5)، aa-autodep(1)، clean(1)، auditd(8)، aa-unconfined(8)، aa-enforce(1)، aa-complain(1)، و [https://wiki.apparmor.net].