سطح دسترسی خاص(acl) برروی فایل ها و پوشه ها در FreeBSD

FreeBSD ACL

Acl به ایجاد می کند یک سری سطح دسترسی اضافه هم برای شاخه ها و هم برای فایل ها . همان طور که می دانید سطح دسترسی استاندارد در Unix به سه بخش صاحب فایل، گروه فایل و دیگران ( همه) تقسیم می شود، اما ACL دسترسی های بیشتری را به فایل ها و شاخه ها اضافه می کند، در این روش شما می توانید به یک کاربر، گره، کاربران و گروه های خاص دسترسی های خاص بیشتری اعمال کنید. نمونه ای از فرمان ACl به صورت زیر است:

[acl tag : [acl qualifier] : [ Access permissions

بخش acl tag:

محدوده ای است از دسترسی فایل به سایرین، گروه، کاریر خاص، گروه خاص و یا mask که در ادامه با آنها بیشتر آشنا می شوید.

بخش acl qualifier:
این بخش، کاربر یا گروهی که در ACL شریک هستند را توضیخ می هد، این بخش می تواند UID یا GID و یا در بعضی از موارد خالی باشد که معنی خاصی دارد که در ادامه با این حالت بیشتر آشنا می شوید.

بخش Access permissions:
این بخش سطح دسترسی را اجرا می کند. سطح دسترسی ها به صورت اختصار به صورت r یعنی خواندن، w یعنی نوشتن و x یعنی راه اندازی کردن نمایش داده می شود.

فعال سازی ACL:
ACL یک بخشی از فایل سیستم UFS2 که به همراه FreeBSD 5.0 ارایه شده و این فایل سیستم در حالت پیش فرض در نصب FreeBSD5.1 قرار گرفته است . برای چک کردن وجود این فایل سیستم فرمان زیر را اجرا کنید البته در بیشتر موارد این فایل سیستم وجود دارد:

 dumpfs /tmp | head -1 #

magic   ۱۹۵۴۰۱۱۹ (UFS2) time    Fri Aug 15 19:23:30 2003

بعد از این مرحله وجود خط زیر را در فایل اصلی kernel خودتان چک کنید و اگر وجود نداشت باید این خط را به kernel خود اضافه کنید و kernel یا همان هسته را کامپایل و دوباره نصب کنید. این خط که باید در kernel باشد در زیر آورده شده:

options         UFS_ACL            #Support for access control lists

قابلیت ACL به صورت پیش فرض فعال نیست و باید برای فعال سازی ACL فرمانهای زیر را اجرا کنید:

tunefs -a enable /dev/da1s1 #

راه دیگه هم برای چک کردن ACL استفاده از فرمان tunefs به صورت زیر است:

 tunefs -p /dev/da1s1e #
tunefs: ACLs: (-a)                                                                              enabled
tunefs: MAC multilabel: (-l)                                                              disabled
tunefs: soft updates: (-n)                                                                   enabled
tunefs: maximum blocks per file in a cylinder group:                 (-e)  ۲۰۴۸
tunefs: average file size: (-f)                                                            ۱۶۳۸۴
tunefs: average number of files in a directory: (-s)                      ۶۴
tunefs: minimum percentage of free space: (-m)                        ۸%
tunefs: optimization preference: (-o)                                              time
(tunefs: volume label: (-L)

قبل از شروع بهpage man فرمان getfacl یک نگاه بی اندازید، در مثال زیر برای ایجا فایل از فرمان touch استفاده می شود.

 umask 027 %
touch file.txt %
ls -l file.txt v %
-rw-r—–  ۱ acl  wheel  ۰ Aug  ۵ ۲۲:۳۵ file.txt

getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
group::r–other::—

در مرحله اول فایل file.txt فاقد ACL است. حال فرض کنید که ACL به فایل مذکور اضافه شده و برای نمایش اینکه یک فایل حاوی ACL است باید فرمان زیر را اجرا کنید:

 ls -l file.txt%

 rw-rw—-+ 1 acl  wheel  ۰ Aug  ۵ ۲۲:۴۱ file.txt

علامت + در انتهای بخش سطح دسترسی بیان می کند که این فایل شامل ACL است.

 getfacl file.txt %
file:file.txt #
owner:1009 #
group:0 #
user::rw-
user:gregory:rw-
group::r–
mask::rw-
other::—

این فرمان نشان می دهد که صاحب فایل دسترسی خواندن/ نوشتن دارد، گروه فایل دسترسی خواندن و کاربر گرگوری دسترسی خواندن / نوشتن در این فایل را دارند. یک نکته در مورد mask وجود دارد، mask حداکثر مجوز برای کاربر گرگوری را نشان می دهد .

مثال دیگری در مورد mask:

 setfacl -m u::rw,g::r,u:gregory:rw,m::r file.txt%
getfacl file.txt%
file:file.txt#
owner:1009$ #
group:0 #
user::rw-
user:gregory:rw-        # effective: r–
group::r–
mask::r–
other::—

کاربر گرگوری که دسترسی خواندن / نوشتن به فایل file.txt را دارد، اما mask دسترسی مؤثر به فایل را به فقط خواندن کاهش می دهد.
سوئیچ “M” برای تنظیم و تغییر درACL های استفاده می شود. در زیر مثالی در مورد این سوییچ مشاهده می کنید، فایلی به نام acls.txt را به صورت زیر ایجاد کنید این فایل باید شامل خط u:bin:rwx باشد:

 cat acls.txt %
u:bin:rwx

این فایل را می توانید با استفاده از سوئیچ مذکور (M) به فایل مورد نظر اضافه کنید.

 setfacl -M acls.txt file.txt %
getfacl file.txt %
file:file.txt #
owner:1009 #
group:0 #
user::rw-
user:bin:rwx
group::r–
mask::rwx
other::—

در مثال زیر کار مثال بالا بدون استفاده از فایل acls.txt ایجاد می شود و سوئیچ تغییرات هم به m کوچک تغییر می کند.

 setfacl -m u::rw,g::r,u:bin:rw file.txt%
getfacl file.txt %
#file:file.txt #
owner:1009 #
group:0 #
user::rw-
user:bin:rw-
user:gregory:rw-
group::r–
mask::rw-
other::—

گاهی اوقات قصد دارید که بعد از اعمال تغییرات mask دچار تغییر نشود و به اصطلاح recalculate نشود برای انجام این کار از سوئیچ n استفاده کنید البته باید این سوئیچ قبل از سوئیچ m استفاده شود:

setfacl -n -m u::rw,g::r,u:bin:rw file.txt%
getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
user:bin:rw-            # effective: r–
user:gregory:rw-        # effective: r–
group::r–
mask::r–other::—

همان طور که مشاهده می کنید سطح دسترسی برای کابر bin و Gregory فقط خواندن است این امر به خاطر سطح دسترسی خواندن در بخش mask است.
برای پاک کردن یک کاربر خاص از فرمان زیر استفاده کنید:

setfacl -n -x u:bin:rw file.txt%
getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
user:gregory:rw-        # effective: r–
group::r–
mask::r–
other::—

 برای این منظور که mask دوباره recalculate نشود از سوئیچ n استفاده کنید. در این مثال کاربر bin پاک شد و اگر از –n استفاده نمی کردید mask به rw تغییر می کرد.
برای حذف کامل acl از فرمان زیر استفاده کنید:

 setfacl -bn file.txt%
getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
group::r–
other::—
ls -l file.txt%
rw-r—–  ۱ acl  wheel  ۰ Aug  ۵ ۲۳:۰۸ file.txt

 یک مثال جالب از اینکه که ارتباط بین mask و سطح دسترسی گروه رو نمایش می دهد:

 touch file.txt%
ls -l%
total 0
-rw-r—– 1 acl wheel 0 Aug 5 23:24 file.txt
chmod 660 file.txt%
ls -l%
total 0
-rw-rw—- 1 acl wheel 0 Aug 5 23:24 file.txt

 setfacl -m u::rw,g::r,o::r,u:gregory:rw file.txt%
getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
user:gregory:rw-
group::r–
mask::rw-
other::r–

 ls -l%
total 2
rw-rw-r–+ 1 acl wheel 0 Aug 5 23:25 file.txt-

 chmod 644 file.txt%
ls -l%
total 2
rw-r–r–+ 1 acl wheel 0 Aug 5 23:25 file.txt-

getfacl file.txt%
file:file.txt#
owner:1009 #
group:0 #
user::rw-
user:gregory:rw- # effective: r–
group::r–
mask::r–
other::r–

آخرین فرمان setfacl دسترسی زیر رو فعال می کند:

user::rw-
user:gregory:rw-
group::r--
mask::rw-
other::r--

بعد از این مرحله دسترسی معمولی رو با استفاده از فرمان زیر تغییر دادیم:

% chmod 644 file.txt

حال دسترسی به صورت زیر تغییر کرده:

user::rw-
user:gregory:rw-        # effective: r--
group::r--
mask::r--
other::r--

توجه داشته باشید که mask ارتباط نزدیکی با دسترسی گروه دارد و تغییر در این دسترسی می تواند mask را دست خوش تغییر کند.
حال به مثال زیر توجه کنید:

% touch file.txt
% setfacl -m u::rw,g::rw,o::r,u:gregory:rw file.txt
% ls -l file.txt
-rw-rw-r--+ 1 acl  wheel  ۰ Aug  ۶ ۲۰:۱۹ file.txt

% setfacl -m m::r file.txt
% getfacl file.txt
#file:file.txt
#owner:1009
#group:0
user::rw-
user:gregory:rw-        # effective: r–
group::rw-              # effective: r–
mask::r–
other::r–

% ls -l file.txt
-rw-r–r–+ 1 acl  wheel  ۰ Aug  ۶ ۲۰:۲۰ file.txt

همان طور که مشاهده کردید رابطه معکوس تغییر در mask و اعمال آن در سطح دسترسی گروه وجود ندارد.

ایجاد کردن ACL پیش فرض:
Default ACL راهی است برای تکثیر و گسترش دادن ACL به صورت اتوماتیک به فایل ها و شاخه ها، شاخه و فایل های جدید این ACL را از شاخه بالایی خود به ارث می برند، فقط دقت داشته باشید که Default ACL به شاخه اعمال می شود و نه فابل.
مثال:

% umask 027
% mkdir dir
% ls -l
total 2
drwxr-x---  ۲ acl  wheel  ۵۱۲ Aug  ۶ ۱۱:۵۰ dir

% getfacl dir
#file:dir
#owner:1009
#group:0
user::rwx
group::r-x
other::—

قبل از اینکه این کار را برای کابران و گروه های دیگر انجام دهید باید Default ACL را به owner, group, other همان فایل اعمال کنید به صورت زیر:

% setfacl -m u::rwx,m::rwx,g::rx,o::rx dir
% getfacl dir
#file:dir
#owner:1009
#group:0
user::rwx
group::r-x
mask::rwx
other::r-x

ترتیب انجام دادن این کار به صورت زیر است:
در ابتدا ACL پیش فرض را با استفاده از فرمان زیر به شاخه مورد نظر اضافه کنید:

% getfacl -d dir #file:dir #owner:1009 #group:0 user::rwx group::r-x mask::rwx other::r-x

برای مشاهده ACL پیش فرض از فرمان زیر استفاده کنید:

% getfacl -d dir

برای اضافه کردن ACL پیش فرض به کاربر Gregory فرمان زیر را اجرا کنید:

% setfacl -dm u:gregory:rwx,m::rwx dir

برای مشاهده ACL فرمان های زیر را اجرا کنید:

% mkdir dir/subdir
% getfacl -d dir
#file:dir
#owner:1009
#group:0
user::rwx
user:gregory:rwx
group::r-x
mask::rwx
other::r-x

% getfacl -d dir/subdir
#file:dir/subdir
#owner:1009
#group:0
user::rwx
user:gregory:rwx
group::r-x
mask::rwx
other::r-x

همان طور که مشاهده کردید ACL پیش فرض به شاخه جدید به صورت خودکار اضافه می شود. برای اضافه کردن یک کاربر جدید به صورت زیر عمل کنید:

% setfacl -dm u:bin:rwx,m::rwx dir
% getfacl -d dir
#file:dir
#owner:1009
#group:0
user::rwx
user:bin:rwx
user:gregory:rwx
group::r-x
mask::rwx
other::r-x

% getfacl -d dir/subdir
#file:dir/subdir
#owner:1009
#group:0
user::rwx
user:gregory:rwx
group::r-x
mask::rwx
other::r-x

این ACL به شاخه قدیمی اعمال نمی شود و فقط به شاخه های اعمال می شود که از این به بعد ایجاد می شوند. برای پاک کردن ACL پیش فرض از فرمان زیر استفاده کنید:

% setfacl -k dir
% getfacl -d dir
#file:dir
#owner:1009
#group:0

% getfacl dir
#file:dir
#owner:1009
#group:0
user::rwx
group::r-x
other::—

برای اینکه یک کاربر خاص را حذف کنید به صورت زیر عمل کنید:

% mkdir dir
% setfacl -dm u::rwx,m::rwx,g::rx,o::rx dir
% setfacl -dm u:gregory:rwx,u:bin:rwx,m::rwx dir

% getfacl -d dir
#file:dir
#owner:1009
#group:0
user::rwx
user:bin:rwx
user:gregory:rwx
group::r-x
mask::rwx
other::r-x