تأمين الملفات/المجلدات باستخدام قوائم التحكم في الوصول (ACLs) في نظام Linux

كمسؤول نظام، سيكون أولويتنا الأولى هي حماية البيانات وتأمينها من الوصول غير المصرح به. نحن جميعًا على علم بالأذونات التي نقوم بتعيينها باستخدام بعض الأوامر المفيدة في نظام Linux مثل chmod، chown، chgrp… الخ. ومع ذلك، تحتوي مجموعات الأذونات الافتراضية على بعض القيود وأحيانًا قد لا تعمل وفقًا لاحتياجاتنا. على سبيل المثال، لا يمكننا تعيين مجموعات أذونات مختلفة لمستخدمين مختلفين على نفس الدليل أو الملف. وبالتالي، تم تنفيذ قوائم التحكم في الوصول (ACLs).

Linux Access Control Lists

على سبيل المثال، لديك ثلاثة مستخدمين، ‘tecmint1’، ‘tecmint2’ و ‘tecmint3’. كل منهم ينتمي إلى مجموعة مشتركة تسمى ‘acl’. يرغب المستخدم ‘tecmint1’ في أن يكون فقط المستخدم ‘tecmint2’ قادرًا على قراءة و الوصول إلى الملفات التي يمتلكها ‘tecmint1’ ولا ينبغي لأي شخص آخر الوصول إليها.

قوائم التحكم في الوصول (ACLs) تتيح لنا فعل نفس الشيء. تتيح لنا هذه القوائم منح الأذونات لمستخدم، المجموعة وأي مجموعة من المستخدمين الذين ليست في قائمة المجموعة لمستخدم ما.

ملاحظة: وفقًا لوثائق منتج Redhat، يتوفر دعم ACL لنظام ملفات ext3 وأنظمة الملفات المصدرة عبر NFS.

كيفية التحقق من دعم ACL في أنظمة Linux

قبل المضي قدمًا، يجب أن يكون لديك دعم لقوائم التحكم في الوصول على النواة الحالية وأنظمة الملفات المُركّبة.

1. التحقق من دعم النواة لقوائم التحكم في الوصول

قم بتشغيل الأمر التالي للتحقق من دعم ACL لنظام الملفات والخيار POSIX_ACL=Y (إذا كان هناك N بدلاً من Y، فهذا يعني أن النواة لا تدعم ACL ويجب إعادة تجميعها).

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. تحقق من الحزم المطلوبة

قبل البدء في استخدام ACLs تأكد من تثبيت الحزم المطلوبة. أدناه الحزم المطلوبة التي يجب تثبيتها باستخدام yum أو apt-get.

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. تحقق من نظام الملفات المُركب لدعم ACLs

الآن، قم بالتحقق من نظام الملفات المُركب إذا كانت تمتلك خيار ACL أم لا. يمكننا استخدام الأمر ‘mount‘ للتحقق من ذلك كما هو موضح أدناه.

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

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

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

في الناتج أعلاه، يمكنك أن ترى أن خيار التركيب الافتراضي يدعم بالفعل ACL. الخيار الآخر هو إعادة تركيب القسم على النحو الموضَّح أدناه.

[root@linux ~]# mount -o remount,acl /

ثم، قم بإضافة الإدخال التالي إلى ملف ‘‏/etc/fstab‏’‏ لجعله دائمًا.

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

مرة أخرى، قم بإعادة تركيب القسم.

[root@linux ~]# mount -o remount  /

4. بالنسبة لخادم NFS

في خادم NFS، إذا كان نظام الملفات الذي يتم تصديره بواسطة خادم NFS يدعم ACL ويمكن للعملاء NFS قراءة ACLs، يتم استخدام ACLs من قبل نظام العميل.

لتعطيل ACLs على NFS share، يجب عليك إضافة الخيار “no_acl” في ملف “/etc/exportfs” على خادم NFS. لتعطيله على جانب العميل مرة أخرى، استخدم الخيار “no_acl” أثناء وقت التحميل.

كيفية تنفيذ دعم ACL في أنظمة Linux

هناك نوعان من ACLs:

  1. Access ACLs: تُستخدم لمنح الأذونات على أي ملف أو دليل.
  2. Default ACLs: تُستخدم لمنح/ضبط قائمة التحكم في الوصول على دليل معين فقط.

الفرق بين Access ACL و Default ACL:

  1. يمكن استخدام Default ACL على مستوى الدليل فقط.
  2. أي دليل فرعي أو ملف يتم إنشاؤه ضمن هذا الدليل سيورث ACLs من دليله الرئيسي. من ناحية أخرى، يرث الملف ACLs الافتراضية ك ACLs الوصول الخاصة به.
  3. نستخدم “–d” لضبط Default ACLs و Default ACLs اختيارية.
قبل ضبط Default ACLs

لتحديد ACLs الافتراضية لملف أو دليل معين، استخدم أمر ‘getfacl‘. في المثال أدناه، يتم استخدام getfacl للحصول على ACLs الافتراضية لمجلد ‘Music‘.

[root@linux ~]# getfacl Music/

# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
بعد ضبط Default ACLs

لضبط ACLs الافتراضية لملف أو دليل معين، استخدم أمر ‘setfacl‘. في المثال أدناه، سيقوم أمر setfacl بضبط ACLs جديدة (قراءة و تنفيذ) على مجلد ‘Music’.

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

كيفية تعيين صلاحيات التحكم في الوصول الجديدة

استخدم أمر ‘setfacl‘ لتعيين أو تعديل على أي ملف أو دليل. على سبيل المثال، لمنح أذونات القراءة و الكتابة للمستخدم ‘tecmint1’.

# setfacl -m u:tecmint1:rw /tecmint1/example

كيفية عرض صلاحيات التحكم في الوصول

استخدم أمر ‘getfacl‘ لعرض صلاحيات التحكم في الوصول على أي ملف أو دليل. على سبيل المثال، لعرض صلاحيات التحكم في الوصول على ‘/tecmint1/example’ استخدم الأمر التالي.

# getfacl /tecmint1/example

# file: tecmint1/example/
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

كيفية إزالة صلاحيات التحكم في الوصول

لإزالة صلاحيات التحكم في الوصول من أي ملف/دليل، نستخدم الخيارات x و b كما هو موضح أدناه.

# setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

# setfacl -b  file/directory   		#removing all ACL from file/direcoty

لنقم بتطبيق صلاحيات التحكم في الوصول على السيناريو التالي

مستخدمان (tecmint1 و tecmint2)، كلاهما لديهما مجموعة ثانوية مشتركة تسمى ‘acl‘. سنقوم بإنشاء دليل واحد يمتلكه ‘tecmint1’ وسنوفر أذونات القراءة و التنفيذ على ذلك الدليل للمستخدم ‘tecmint2’.

الخطوة 1: إنشاء مستخدمين وإزالة كلمة مرور من كلاهما

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

الخطوة 2: إنشاء مجموعة ومستخدمين للمجموعة الثانوية

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

الخطوة 3: إنشاء دليل /tecmint وتغيير ملكية الدليل إلى tecmint1.

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
# file: tecmint1
# owner: tecmint1
# group: root
user::rwx
group::r-x
other::r-x

الخطوة 4: تسجيل الدخول مع tecmint1 وإنشاء دليل في مجلد /tecmint.

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

الخطوة 5: الآن، ضع سيطرة الوصول باستخدام ‘setfacl’، بحيث يحصل ‘tecmint1’ على كافة أذونات rwx، ‘tecmint2’ سيكون لديه إذن القراءة فقط على مجلد ‘example’ والآخرين لن يمتلكون أي أذونات.

$ setfacl -m u:tecmint1:rwx example/
$ setfacl -m u:tecmint2:r-- example/
$ setfacl -m  other:--- example/
$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

الخطوة 6: الآن، قم بتسجيل الدخول بمستخدم آخر أي ‘tecmint2’ على نافذة أوامر أخرى وانتقل إلى دليل ‘tecmint1’. حاول الآن عرض المحتويات باستخدام الأمر ‘ls’ ومن ثم حاول تغيير الدليل وانظر الفرق كما هو موضح أدناه.

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

الخطوة 7: الآن، قم بإعطاء إذن ‘تنفيذ’ لـ ‘tecmint2’ على مجلد ‘example’ ومن ثم استخدم الأمر ‘cd’ لرؤية التأثير. الآن ‘tecmint2’ لديه أذونات لعرض وتغيير الدليل، ولكن ليس لديه أذونات لكتابة أي شيء.

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

ملاحظة: بعد تطبيق سيطرة الوصولات، ستلاحظ إشارة إضافية ‘+’ في نتيجة ‘ls -l’ كما هو موضح أدناه.

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

روابط المرجع

توثيق ACL

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/