فهم الإمكانيات في برمجة نظام Linux

تسمح الإمكانيات (Capabilities) بتقييم بعض امتيازات النظام المُهمة في سلسلة مُنفصلة ومُختلفة عن العملية الحالية. بهذه الطريقة ، لن تحتاج إلى تشغيل تطبيق كـ Root للوصول إلى أجزاء مُعينة من النظام.

كحل ناشئ عن الاحتياجات ، يتعلق القسم 25 من POSIX.1e بهذه المشكلة. تم الانتهاء من تطوير الامتيازات المُحددة في هذا القسم والمزيد مع وصول نواة Linux الإصدار 2.6.26. إليك كل ما تحتاج لمعرفته حول الإمكانات في نواة Linux.

فهم الإمكانيات في برمجة نظام Linux - لينكس

فهم منطق واجهة برمجة تطبيقات الإمكانيات

يتكون التحكم في الامتيازات في الأنظمة المُستندة إلى Unix من خطوتين:

  • إذا كان المالك الحالي (مُعرِّف المستخدم الفعَّال ، EUID) للتطبيق قيد التشغيل صفرًا ، فلن يتحقق النظام من التفويض.
  • إذا كانت قيمة EUID مُختلفة عن الصفر ، فسيقوم النظام بتنفيذ عملية التحكم بما يتماشى مع تصاريح المُستخدم الفعّال ومجموعة التطبيق ذي الصلة.

تحتاج بعض التطبيقات إلى امتيازات أوسع (SUID ، SGIT) أثناء التشغيل. كمثال نموذجي ، يُمكنك التفكير في تطبيق passwd. باستخدامه ، يُمكن للمستخدمين في النظام تغيير كلمات المرور الخاصة بهم. ومع ذلك ، للكتابة إلى ملف  etc/shadow ، أين يتم الاحتفاظ بكلمات المرور المُشفرة ، من الضروري العمل مع حقوق المستخدم Root (أي معرف المُستخدم = 0).

لحل هذه المشكلة ، يحتوي تطبيق passwd على بت SUID. أيًا كان المستخدم الذي يقوم بتشغيل هذا التطبيق ، فسيظل المالك النشط (EUID) دائمًا هو Root:

ls -l /usr/bin/passwd

# Output

-rwsr-xr-x. 1 root root 32552 Jul 23 2021 /usr/bin/passwd

يبدو أنَّ القدرة على تشغيل تطبيقات SUID في نموذج مُصادقة Unix التقليدي قد حل المشكلة. ومع ذلك ، فإنَّ الأخطاء الجسيمة في التطبيقات التي تحتوي على وحدات بت SUID تفتح الباب أمام تشغيل التعليمات البرمجية غير المرغوب فيها للمُستخدمين الذين يتمتعون بالتحكم الكامل في النظام. يجب أن يكون التطبيق المثالي قادرًا على التشغيل دون الحاجة إلى حقوق المستخدم Root إن أمكن.

لا تنتهي المشكلة مع بت SUID فقط. يجب أن يكون لديك أيضًا حقوق المُستخدم Root عندما تُريد الاستماع على منفذ TCP أو UDP ذي امتيازات أقل من 1024 على الأنظمة المُستندة إلى Unix. على سبيل المثال ، لتتمكن من الاستماع إلى منفذ TCP 80 لخادم الويب ، يجب عليك تشغيل التطبيق كمُستخدم أساسي.

على مر السنين ، كان من المفهوم كم هو مُدمر تشغيل التطبيقات التي تُوفر خدمة لبيئة الشبكة مع حساب مستخدم مُرخص بالكامل. كحل مؤقت ، تم تبني أنَّ جزءًا مُعينًا وأصغر من التطبيق فقط يستمع إلى المنفذ المُميز كـ Root ، ثم يُغير مُعرِّف المستخدم النشط إلى مستخدم آخر للعمليات اللاحقة (على سبيل المثال ، المستخدم الذي لا يمتلك إمتيازات مُقيدة) .

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

شرح نموذج إمكانيات Linux!

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

على سبيل المثال ، لكي يعمل تطبيق Ping ، يجب أن يكون قادرًا على فتح مآخذ RAW ، والتي تكون محجوزة بشكل عام لمستخدمي Root فقط. في توزيعات Linux القديمة ، تكمن المشكلة في إعطاء بت SUID للتطبيق حتى يتمكن المستخدمون العاديون من استخدامه. في هذه الإصدارات ، عند إزالة بت SUID من التطبيق ومحاولة تشغيل التطبيق كمُستخدم عادي ، تحصل على الخطأ التالي:

ping 8.8.8.8

# Output

ping: icmp open socket: Operation not permitted

بينما في توزيعات Linux الحديثة ، ربما لا يحتوي تطبيق ping على بت SUID:

ls -l /bin/ping

# Output

-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping

ومع ذلك ، يُمكنك تشغيل التطبيق بنجاح كمستخدم عادي. الآلية التي تجعل هذا مُمكنًا هي أنَّ تطبيق Ping لديه الإمكانية الخاصة CAP_NET_RAW.

يُمكنك معرفة الإمكانيات الإضافية للتطبيق باستخدام الأمر getcap كما يلي:

sudo getcap /bin/ping

# Output

/bin/ping cap_net_raw=ep

إذا أرجع الأمر getcap استجابة فارغة ، فيُمكنك تعيين هذه القيمة يدويًا باستخدام:

sudo setcap cap_net_raw+ep /bin/ping

نموذج إمكانيات العملية

في تطبيق Linux ، يتم تجميع إمكانيات كل عملية ضمن ثلاثة عناوين:

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

يتم عرض قائمة الإمكانيات المسموح بها والفعَّالة والقابلة للتوريث لتشغيل العمليات في أي وقت كقناع بت على الأسطر CapPrm و CapEff و CapInh في الملف /proc/<PID>/status. بالإضافة إلى ذلك ، يحتوي سطر CapBnd على قناع البت المُستخدم في عملية التحكم في حدود الإمكانية.

على سبيل المثال ، حاول قراءة قيم تطبيق shell قيد التشغيل من ملف /proc/self/status:

cat /proc/self/status | grep Cap

# Output

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: 000001ffffffffff

CapAmb: 0000000000000000

نموذج إمكانية الملفات في Linux

يعتمد تشغيل نظام الإمكانيات للملفات على المتطلبات الأساسية التي يُمكن من خلالها تخزين هذه الخصائص في طبقة نظام الملفات الافتراضية (VFS). على غرار نموذج العملية ، تندرج إمكانيات الملفات تحت ثلاثة عناوين:

1. مسموح:

يُحدد النظام الإمكانيات المسموح بها للعملية عند تشغيل الملف التنفيذي المُقابل في هذه المجموعة.

2. فعّال

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

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

قد تعتقد أنَّ التطبيقات المكتوبة بشكل أفضل لن تستخدم الإمكانيات إلا عند الحاجة. إذا كان البت نشطًا ، فإنَّ جميع الإمكانيات الموجودة في القائمة المسموح بها تُصبح نشطة عند بدء تشغيل التطبيق.

3. قابل للتوريث

كما هو الحال في نموذج العملية ، يتم تشغيل الملف ذي الصلة وتحدث العملية. إذا تم تشغيل تطبيق آخر من داخل العملية بعد ذلك ، فسيتم إدراجه في القائمة المسموح بها للعملية الجديدة. وخلاصة القول ، إنه يشير إلى قائمة من الإمكانيات  الموروثة. تحقق من التطبيقات الأكثر أهمية والتي يجب امتلاكها لمستخدمي Linux.

دور الإمكانيات في نظام Linux

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

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

تُعد إمكانيات Linux مجرد واحدة من المشكلات التي يجب التفكير فيها للقيام بأساليب فعَّالة للغاية مثل تقسيم أذونات المستخدم Root ، وتعيين أذونات مEختلفة للمستخدمين غير المتميزين ، واتخاذ احتياطات مختلفة حول المنافذ المفتوحة في خدمات الإنترنت مع خوادم Linux. يُمكنك الإطلاع الآن على كيفية إنشاء خادم الويب على Linux باستخدام كمبيوتر قديم.

زر الذهاب إلى الأعلى