اذهب إلى المحتوى

كيفية تأمين الحاويات عن طريق سي لينكس SELinux


Naser Dakhel

يعطّل معظم الأشخاص التأمين المُعزَّز في لينكس Security-Enhanced Linux -أو اختصارًا سي لينوكس SELinux- إذا واجهتهم أي مشكلة خلال عملهم على بيئة لينكس، إذ يبدو أن تعطيلها يحل المشاكل بصورةٍ مفاجئة، لكن هذا يتسبب بخسارتهم لأداة حماية فائقة القوّة والأهميّة.

تتزايد التهديدات الأمنية مع تزايد استخدام الحاويات Containers والخدمات المصغرة Microservices ومعمارية الحوسبة الموزّعة Distributed Architecture، وذلك بسبب مشكلة قديمة ومعروفة جيّدًا، ألا وهي: التسارع velocity؛ إذ تتميز الحاويات بمنحك القدرة على التحرك بسرعة وإنجاز المزيد والتغير بسرعة أيضًا. وهذا يعني أن تطبيق الحاويات انتشر بصورةٍ كبيرة، ولكن سرعة تطبيقها محدودة. وستواجهك الكثير من المشاكل ونقاط الضعف خلال استخدامها؛ فهذا أمرٌ طبيعي عندما تسعى لإنجاز الأمور على نحوٍ أسرع.

كيف تخفف من التهديدات؟

يقول سن تزو: "المحارب الحكيم يتفادى المعركة". ينطبق هذا الاقتباس على عملية حماية الحاويات بصورةٍ مثالية؛ إذ لتفادي المشكلات (المعارك)، عليك التأكد أن مضيف الحاوية آمن ويستخدَم سي لينكس مثل خط دفاعٍ أوّل.

أُطلِق سي لينكس على أنه مشروعٌ مفتوح المصدر في عام 2000، ودُمج مع نواة لينكس في عام 2003. ووفقًا لموقع Red Hat's explainer، فإن سي لينكس هو معماريّة أمان لأنظمة لينكس، تسمح لمسؤولي النظام بالتحكم بمن لديه صلاحية الولوج للنظام، وقد طوِّرت البرمجية من قبل وكالة الأمن القومي United States National Security Agency -أو اختصارًا NSA-، بكونها سلسلةً ضمن مجموعةٍ من الرُقع Patches لـ نواة لينكس باستخدام وحدات أمن لينكس Linux Security Modules -أو اختصارًا LSM".

البداية

عندما تسمع كلمة حاويات، سيتبادر لذهنك أولًا دوكر Docker، فقد بدأ دوكر بثورةٍ ساهمت بتبنٍ واسعٍ لتقنية الحاويات بعد ظهوره في عام 2013؛ فهو من أبرز الأسباب التي ساهمت بانتشار شعبية الحاويات. وكما ذكرنا سابقًا، ساهم تزايد معدل تبنّي هذه التقنية بتزايد معدل الثغرات الأمنية.

قبل البدء بعملية تأمين حاويات دوكر باستخدام سي لينكس، عليك تجهيز بعض الأشياء.

المتطلبات

  • نظام تشغيل سينت أو إس CentOS إصدار 8/RHEL مُثبت ومهيّأ.
  • دوكر Docker CE مُثبَّت ومهيّأ.
  • حسابين مستخدم، إحداها بصلاحيات الجذر root والآخر بدون؛ وهو موجود باسم mcalizo في الأمثلة ضمن هذه المقالة.

يمكنك اتباع التعليمات، إذا أردت تثبيت دوكر على خادم CentOS RHEL/8؛ وإذا كنت تعمل على RHEL 8، فعليك إزالة الحزمتين المثبّتتين تلقائيًّا Podman وrunc قبل البدء.

دعنا نتأكد أوّلًا من أن سي لينكس يعمل:

mcalizo@Rhel82 ~]$ sestatus]
SELinux status:                           enabled
SELinuxfs mount:                        /sys/fs/selinux
SELinux root directory:                /etc/selinux
Loaded policy name:                   targeted
Current mode:                           enforcing
Mode from config file:                enforcing
Policy MLS status:                     enabled
Policy deny_unknown status:    allowed
(Memory protection checking:    actual (secure
Max kernel policy version:         31
 $ [ ~ mcalizo@Rhel82]

من ثم، تأكد أن إصدار نظام التشغيل الخاص بك ودوكر يعملان. سجّل الدخول مثل مستخدمٍ بصلاحيات الجذر، ونفّذ التعليمات التالية:

root@rhel82 ~]#  cat /etc/redhat-release]
(Red Hat Enterprise Linux release 8.2 (Ootpa
[root@rhel82 ~]#

root@rhel82 ~]# systemctl status docker]
  docker.service - Docker Application Container Engine 
   (Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled
   Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
     Docs: https://docs.docker.com
 (Main PID: 30768 (dockerd
    Tasks: 8
   Memory: 39.0M
   CGroup: /system.slice/docker.service
     └─ 30768  /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine

تحقق من إصدار دوكر لديك:

root@rhel82 ~]# docker --version]
Docker version 19.03.13, build 4484c46d9d

اخترق المضيف

أفضل الطرق للتعلم هي خوض التجربة، لذلك سنبيّن في هذه الفقرة سهولة اختراق مضيف دوكر باستخدام شيفرة حقن Injection خبيثة، إذا لم يكن أمن الحاوية مُعدًّا على النحو الصحيح.

لكي تكون قادرًا على إجراء هجومٍ ما على المضيف، يجب أن يكون المستخدم الخبيث الذي لا يملك صلاحيات الجذر (باسم mcalizo في أمثلتنا) منتميًا للمجموعة التي أنشأت حاويات دوكر. وللتأكد من ذلك، نتفقّد المجموعة التي ينتمي إليها الحساب mcalizo عن طريق:

root@Rhel82 ~]# groups mcalizo]
mcalizo : mcalizo

تُظهِر رسالة الخَرج أن الحساب mcalizo ينتمي لمجموعته الخاصة، وهذا يعني أنه لا يمكنه إنشاء حاوية دوكر. وإذا حاولت إنشاء حاوية دوكر باستخدام الحساب سيظهر الخطأ التالي:

mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh]
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

للسماح لحساب mcalizo بإنشاء الحاوية، أضِف المستخدم لمجموعة docker:

root@Rhel82 ~]# usermod -G docker -a mcalizo]
root@Rhel82 ~]# groups mcalizo]
mcalizo : mcalizo docker

ثم أنشئ حاويةً من نوع fedora:latest وادخل إليها لتكتشفها:

mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh]
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
(Fedora release 33 (Thirty Three

ستُسجَّل مثل مستخدم بصلاحيات الجذر تلقائيًّا، عندما تسجل الدخول لحاوية منشأة جديدًا:

sh-5.0# whoami
root
sh-5.0#

تستطيع فعل أي شيء بداخل الحاوية بصفتك مستخدمًا بصلاحيات الجذر؛ وهذا يعني أنك تستطيع إساءة استخدام مضيف الحاوية وتتسبّب بكثيرٍ من الضرر. تعني قدرتك على إنشاء الحاويات أنّك تستطيع فعل أي شيء للمضيف، حتى إن لم تكن جزءًا من المستخدمين بصلاحيات الجذر على الجهاز المضيف.

لتوضيح الثغرة الأمنية هذه، أُخرج من الحاوية التي أنشأتها وأنشئ حاويةً جديدة:

mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash]
  #[root@131043f2e306 /]

ينقل الخيار ‎-v مسار المضيف الرئيس الخاص بدوكر / إلى مسار الحاوية المدعوّ exploit/:

/root@131043f2e306 /]#ls exploit]
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

بسبب عملية النقل هذه، تستطيع فعل أي شيء على جهاز دوكر المضيف؛ إذ يمكنك مثلًا حذف الملفات، أو تعديل ملفات الضبط بهدف إلحاق الضرر بالنظام، أو تثبيت تطبيق حصان طروادة أو برمجيات خبيثة مشابهة لسرقة البيانات المهمة.

سبب هذه الثغرة

لعلك تتسائل عن سبب حدوث ذلك بالرغم من أن سي لينكس مفعّل، إذ نستطيع فهم ما السبب بالتحديد، من خلال النظر الدقيق لكيفية عمل سي لينكس.

تأكد من أن سي لينكس يحتوي على سياق دوكر Docker Context:

mcalizo@Rhel82 ~]$ ps -eZ | grep docker]
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
$[~ mcalizo@Rhel82]

يحتوي سي لينكس على السياق كما توقعنا؛ وهذا يعني أن سي لينكس مسؤولٌ عن إدارة عفريت دوكر Docker daemon. افحص عفريت دوكر للتحقُّق مما إذا كان سي لينكس مفعّلًا تلقائيًا:

mcalizo@Rhel82 ~]$ docker info | grep Security -A3]
 :Security Options
  seccomp
    Profile: default  
 Kernel Version: 4.18.0-193.el8.x86_64

كما نلاحظ، سي لينكس غير مفعَّل تلقائيًا، بالتالي لقد وجدنا المشكلة، وكل ما علينا فعله هو تفعيل سي لينكس لسد الثغرة؛ بحيث يتحكّم ويدير دوكر. ولتفعيل سي لينكس، أنشئ ملفًّا في المسار etc/docker/daemon.json كما هو موضح هنا، ولكن يجب أن تمتلك صلاحيات الجذر لتفعيله:

root@Rhel82 ~]# cat /etc/docker/daemon.json]
{
  "selinux-enabled": true
}
 #[~ root@Rhel82]
root@Rhel82 ~]# systemctl restart docker]

بعد إنشائك للملف أو تحديثه، وإعادة تشغيل دوكر؛ يجب أن ترى أن سي لينكس مفعّل في عفريت دوكر:

root@Rhel82 ~]# systemctl restart docker]
mcalizo@Rhel82 root]$ docker info | grep Security -A3]
 :Security Options
  seccomp
    Profile: default
      selinux
[mcalizo@Rhel82 root]$

على الرغم من أنّ وصل مسارات ملفات filesystem معيّنة لمضيف دوكر داخل حاوية دوكر ما زال ممكنًا، إلّا أنّ تحديث الملفات أو الوصول إليها أصبح غير متاحًا الآن:

mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash]
root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh]
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
#[/ root@ecb5836da1f6]

تعتمد درجة أمان حاويتك على قوة أمان نظام تشغيل مضيف الحاوية. وهناك كثيرٌ من الوسائل لتأمين نظام لينكس، والعديد منها متاحٌ بهدف زيادة أمان نظامك.

يتواجد سي لينكس افتراضيًا مع توزيعات لينكس ليضيف طبقةً إضافية من الحماية؛ فتأكد من تفعيله وعمله صحيحًا للاستفادة منه ومن الحماية التي يقدمها لنظامك.

ترجمة -وبتصرف- للمقال Secure your containers with SELinux لصاحبه Mike Calizo.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...