أساسيات إدارة الأذونات في لينكس، وكيفية استخدام Umask


طريف

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

linux-permissions-basics-umask.thumb.png

فئات المستخدمين

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

فئة المالك

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

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
. . .

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

فئة المجموعة المالكة

إضافة إلى فئة المالكين يمكن إسناد الأذونات إلى "مجموعة المالك" لملف أو مجلّد معيّن، وكما ذكرنا مع فئة المالك، لا يمكن أن تعود ملكية الملف سوى لمجموعة واحدة فقط، بينما يمكن لأي مستخدم أن ينضم لأكثر من مجموعة، وأن تضم كل مجموعة عدّة أعضاء أو مستخدمين. 

لمعرفة المجموعات التي ينتمي لها مستخدمك الحالي، اطبع الأمر: 

groups 

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

cat /etc/group 
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .

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

فئة الآخرين

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

أنواع الأذونات

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

أما فيما يتعلق بالمجلدات، تمنح صلاحية القراءة إمكانية الاستعلام ls عن محتويات المجلد (من ملفات ومجلدات)، أما صلاحية الكتابة فتسمح بتعديل محتوياته، وصلاحية التنفيذ تسمح بالدخول إلى المجلد cd والتعديل عليه. تُمثّل الصلاحيات في لينكس بطريقتين، تدعى الأولى بالترميز الأبجدي ويستخدم فيها الأحرف، بينما تسمى الأخرى بالترميز العددي (الثُماني) وتستخدم فيها الأرقام.

الترميز الأبجدي

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

  • صلاحية القراءة تأخذ الحرف r.
  • صلاحية الكتابة تأخذ الحرف w.
  • صلاحية التنفيذ تأخذ الحرف x.

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

يُرجع الأمر ls مع الخيار l- قائمة بمحتويات المجلد الحالي مزودةً بعمود يعرض صلاحيات كل منها بالأسلوب الأبجدي:

cd /etc 
ls -l 
drwxr-xr-x 3 root root    4096 Apr 26  2012 acpi
-rw-r--r-- 1 root root    2981 Apr 26  2012 adduser.conf
drwxr-xr-x 2 root root    4096 Jul  5 20:53 alternatives
-rw-r--r-- 1 root root     395 Jun 20  2010 anacrontab
drwxr-xr-x 3 root root    4096 Apr 26  2012 apm
drwxr-xr-x 3 root root    4096 Apr 26  2012 apparmor
drwxr-xr-x 5 root root    4096 Jul  5 20:52 apparmor.d
drwxr-xr-x 6 root root    4096 Apr 26  2012 apt
…

وكما نرى فإن العمود الأول من اليسار يعرض أذونات الملفات والمجلدات بالترميز الأبجدي ضمن خانة مؤلفة من عشرة محارف، يحدّد الأوّل منها نوع الملف حيث يعطي الشرطة (-) للملفات، حرف (d) للمجلدات، وحرف (l) للروابط... الخ، بينما تُحدّد المحارف التسعة المتبقية صلاحيات الفئات الثلاث (المالك، المجموعة المالكة، والآخرين) من إمكانية قراءة، كتابة، وتنفيذ. 

لنقرأ أذونات السطر الأول من الخرج السابق مجددًا، الحرف d يرمز إلى أن acpi هو مجلد وليس ملف، يمنح مالكه الصلاحيات الثلاث (قراءة، كتابة، وتنفيذ)، في حين تمنح كلا من المجموعة المالكة وفئة الآخرين صلاحيتا القراءة والتنفيذ فقط. بينما تحدّد الشرطة (-) من أذونات السطر الرابع أن anacrontab هو ملف وليس مجلد، يمنح لمالكه صلاحيات القراءة والكتابة، أما المجموعة المالكة وفئة الآخرين فتمنح صلاحية القراءة فقط.

الترميز العددي (الثماني)

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

  • صلاحية القراءة تأخذ الرقم 4.
  • صلاحية الكتابة تأخذ الرقم 2.
  • صلاحية التنفيذ تأخذ الرقم 1.

وهكذا يجب علينا جمع هذه الأرقام ثلاث مرات منفصلة (مرة لكل فئة) للحصول على الترميز المطلوب لملف ما، حيث يتم إعطاء الرقم 7 للفئة التي نريد إسناد صلاحيات القراءة والكتابة والتنفيذ لها (4+2+1) بينما تحصل الفئة التي نرغب بمنعها من كافة الصلاحيات على الرقم (0). 

لنعود مجددًا إلى مجلد acpi السابق كمثال، وباعتبار أن مالكه يجمع الصلاحيات الثلاث معًا فهو يأخذ الرقم 7، بينما تأخذ كل من المجموعة المالكة وفئة الآخرين الرقم (5)، ليكون الترميز الكامل للمجلد على الشكل 755. وكما في الترميز الأبجدي، يمكن للترميز العددي أن يضم بادئة تعبّر عن نوع الملف، وهذا يتبع لصلاحيات المالك، والمجموعة المالكة، وفئة الآخرين على الترتيب.

استخدام الأمر chmod

يعتبر الأمر chmod الطريقة الأكثر انتشارًا لتعديل صلاحيات ملف ما باستخدام الترميز العددي (الثماني)، لنأخذ مثالًا عمليًا على الفور:  

سوف ننشئ في مجلد المنزل ملفًا فارغًا باسم testfile لذلك: 

cd 
touch testfile 

ولنستعرض الآن الصلاحيات التي تعطى للملف بشكل افتراضي عند إنشاءه:

ls -l testfile
 -rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile

وكما هو واضح فإن كلًا من مالك الملف والمجموعة المالكة له تملك أذونات القراءة والكتابة، بينما لا تملك فئة الآخرين سوى صلاحية القراءة. عند تحويل الترميز الأبجدي السابق إلى ترميز عددي، سيحصل كل من المالك والمجموعة المالكة على القيمة (6) (4 للقراءة و 2 للكتابة)، بينما تحصل فئة الآخرين على القيمة (4) فقط (للقراءة)، وهكذا يمكن تمثيل صلاحيات الملف testfile وفق الترميز العددي بالقيمة (664). 

لنفترض مثلًا أن الملف السابق يضم نصّ تنفيذي script، ونريد أن نضيف صلاحيات التنفيذ للمالك فقط، إضافةً لسحب صلاحيات التعديل عن المجموعة المالكة، بينما لا نعطى فئة الآخرين أيّة صلاحيات على الإطلاق. يمكن تمثيل الصلاحيات الجديدة بعد التعديل وفق الترميز الأبجدي كما يلي -rwxr-----، بينما تأخذ القيمة (740) في التمثيل العددي، لنستخدم الأمر chmod للتعديل على أذونات الملف: 

chmod 740 testfile 
ls -l testfile 
-rwxr----- 1 demouser demouser 0 Jul 10 17:23 testfile 

وهكذا نتأكد أن حسابنا صحيح، وقد أسند للملف صلاحياته الجديدة، وبذات الطريقة يمكن إعادة ضبط الأذونات على ما كانت عليه: 

chmod 664 testfile 
ls -l testfile 
-rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile

ضبط الأذونات الافتراضية باستخدام Umask

تتحكّم الأداة umask بالأذونات المبدئية للملفات والمجلدات عند إنشائها بناء على صلاحيات الأساس "base"، حيث تعطى الصلاحية ذات القيمة (666) للملفات فور إنشائها، والتي تشمل أذونات القراءة والكتابة لفئات المستخدمين الثلاث (المالك، المجموعة المالكة، والآخرين)، ولا تشمل الأذونات الافتراضية صلاحية التنفيذ لأيّ من الملفات المنشأة، باعتبار أن معظمها لا يضم نصوصًا تنفيذية، كما أن إعطاء صلاحية التنفيذ بشكل افتراضي يفتح الباب أمام بعض المخاوف الأمنية. أما المجلدات فتعطى الصلاحية ذات القيمة (777) أي القراءة والكتابة والتنفيذ لجميع المستخدمين. 

يسمى الأسلوب الذي تعمل به الأداة umask بقناع الطرح subtractive mask، فطالما أن صلاحية التنفيذ لا يمكن أن تعطى بشكل افتراضي، فهذا يعني أن umask يعطي افتراضيًا أعلى الأذونات الممكنة، وهكذا فالتعديل الوحيد الممكن على قيمه الافتراضية هو بتقليل تلك الأذونات، وبعبارة أخرى إنشاء طبقة (أو قناع) تطرح بعض الأذونات المبدئية من صلاحيات الأساس. فعلى سبيل المثال، لو رغبنا بطرح صلاحية الكتابة من فئة الآخرين للمجلدات المنشأة (بحيث تبقى للمالك والمجموعة المالكة فقط)، فهذا يعني أن الأذونات الافتراضية يجب أن تصبح برقم (755)، ولإدخال التعديلات باستخدام الأداة umask نطرح الأذونات الأساسية من الأذونات المطلوبة لنحصل على قناع الطرح لحالتنا هذه:

  777
- 775
------
  002

الناتج (002) هو القيمة التي سنمررها إلى umask لإدخال التعديلات المرغوبة، وفي الحقيقة يصادف أحيانًا أن تكون هذه هي القيمة الافتراضية لبعض الأنظمة كما مرّ معنا سابقًا عندما أنشأنا ملف جديد باستخدام الأمر touch، لنعيد المثال مرّة أخرى:

touch test2 
ls -l test2
-rw-rw-r-- 1 demouser demouser 0 Jul 10 18:30 test2 

وإذا أردنا تأمين حماية أفضل لنظام تشغيلنا، فيمكن تعديل الأذونات المبدئية للملفات المنشأة بحيث لا تتيح لغير المالك أية صلاحيات على الإطلاق، عبر تمرير قناع الطرح (077) للأداة umask لتصبح صلاحيات الأساس الجديدة (600):

umask 077 
touch restricted 
ls -l restricted 
-rw------- 1 demouser demouser 0 Jul 10 18:33 restricted 

ولقلب العملية، أي لإعطاء كامل الصلاحيات لكافة فئات المستخدمين للملفات والمجلدات المنشأة فإننا نستخدم قناع الطرح (000):

umask 000 
touch openfile 
ls -l openfile 
-rw-rw-rw- 1 demouser demouser 0 Jul 10 18:36 openfile 

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

cd 
nano .bashrc

تأكد أولًا فيما إذا كان هناك سطر يحدّد قيمة قناع الطرح umask، في هذه الحالة أدخل التعديل على القيمة المسندة له فقط، في غير ذلك أضف السطر التالي إلى نهاية الملف بالقيم التي تريد:

umask 022 

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

إشعار تحذير

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

أمرٌ آخر أودّ الإشارة إليه هنا، لأولئك الذين يقومون بضبط البرامج بشكل يدوي، وهي أهمية محاولة تمرير أقل صلاحيات ممكنة للبرنامج مع مراعاة ألّا يؤثر ذلك بالطبع على وظائفه. وفيما إذا كنتَ المستخدم الوحيد لجهازك (مدير خادوم مثلًا) فأنت تحتاج إلى صلاحيات مطلقة على الملفات، لكن إسناد أية صلاحيات لفئة الآخرين (كالكتابة أو حتى القراءة) لا داعي له سوى جلب المخاطر الأمنية، لا سيما في حال كانت كلمة المرور خاصتك مخزنة في ملف نصيّ غير مشفّر plain-text. وبالاستفادة من فئة (المجموعة المالكة) وإسناد الأذونات المناسبة لها، ومن ثم إضافة الأشخاص اللازمين من فريق العمل إليها، يمكن تحقيق أفضل منفعة ممكنة من إدارة الصلاحيات في لينكس، إضافةً إلى إلغاء صلاحيات "الآخرين" فيما لو لم يكن هناك حاجةٌ إليها، مما يحقق مستوىً عالٍ من الأمان.

* الأذونات أو Permissions: هي مجموعة من القواعد تحدّد أولئك الذين يحق لهم أو لا يحق لهم امتلاك إمكانية القراءة، الكتابة، أو التعديل، على الملفات والمجلدات، وقد استخدمنا لها عدّة ترجمات في هذا الدليل؛ الأذونات، الصلاحيات، التصاريح.

ترجمة -وبتصرّف- للمقال Linux Permissions Basics and How to Use Umask on a VPS.





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


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



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن