ACL، ماسک مؤثر و وراثت دسترسی
در این درس ۳ بخش
محیط تمرین: Ubuntu 24.04 LTS در ماشین مجازی، Bash، حساب معمولی با UID غیر از صفر و ۶۵۵۳۴، HOME روی فایلسیستم محلیِ دارای پشتیبانی ACL، و فرمانهای setfacl و getfacl از بستهٔ acl. با command -v وجود ابزارها را بررسی کنید؛ اگر موجود نیستند یا فایلسیستم ACL ندارد، بخش کاغذی را انجام دهید. تغییرها فقط در پوشهٔ تازهٔ تمریناند. مجوز HOME یا پوشهٔ موجود دیگری را برای بازکردن مسیر تغییر نمیدهیم.
umask از درخواستِ ایجاد شروع میشود
در نبود default ACL، مجوز اولیه از حالت درخواستی برنامه و حذف بیتهای umask ساخته میشود؛ محاسبه، تفریق دهدهی نیست. برنامهها معمولاً فایل عادی را با 0666 و پوشه را با 0777 درخواست میکنند. پس umask برابر 027 معمولاً فایل 0640 و پوشه 0750 میسازد؛ بیت اجرا برای فایل از هیچ ایجاد نمیشود. umask روی فایلهای موجود اثری ندارد. آن را در زیرپوسته قرار میدهیم تا پس از تمرین، تنظیم نشست شما تغییر نکند.
command -v setfacl getfacl || exit 1
acl_lab=$(mktemp -d "$HOME/linux2-acl.XXXXXX") || exit 1
setfacl -b -k "$acl_lab"
chmod 700 "$acl_lab"
(
umask 027
touch "$acl_lab/plain.txt"
mkdir "$acl_lab/plain-dir"
)
stat -c '%a %n' "$acl_lab/plain.txt" "$acl_lab/plain-dir"حذف ACL در سطر سوم تنها روی پوشهٔ تازه است تا default ACL احتمالی والد، نتیجه را مبهم نکند. با پیششرطهای گفتهشده، مقدارهای 640 و 750 را میبینید؛ نام مسیر تصادفی است. اگر نتیجه فرق داشت، قبل از تغییر بیشتر، getfacl را بخوانید. ACL دسترسی، مجوز همان شیء را شرح میدهد؛ default ACL فقط روی پوشه وجود دارد و الگوی اولیهٔ فرزندان تازه است، نه اصلاح خودکار فایلهای قدیمی.
Access ACL میتواند برای یک کاربر یا گروه مشخص، ورودی اضافه داشته باشد. ماسکِ ACL سقف مجوز گروه مالک، کاربران نامدار و گروههای نامدار است؛ owner و other زیر این ماسک نیستند. اشتراک ورودی و ماسک، دسترسی مؤثر را میسازد. در ACL توسعهیافته، بیتهای گروهِ نمایش ls -l معمولاً ماسک را منعکس میکنند؛ برای دیدن سهم واقعی هر ورودی، getfacl لازم است. chmod نیز ممکن است ماسک را تغییر دهد؛ خروجی سهتاییِ ساده تمام داستان نیست.
setfacl -m u:65534:rw-,m::r-- "$acl_lab/plain.txt"
getfacl -n "$acl_lab/plain.txt"
setfacl -m m::rw- "$acl_lab/plain.txt"
getfacl -n "$acl_lab/plain.txt"شناسهٔ ۶۵۵۳۴ در اینجا یک هویت عددی برای مشاهدهٔ فراداده است؛ حسابی نمیسازیم و با آن وارد نمیشویم. ابتدا ورودی rw- زیر ماسک r-- فقط خواندن مؤثر دارد و getfacl معمولاً توضیح effective را نشان میدهد؛ سپس نوشتن هم در ماسک مجاز میشود. این آزمایشِ ورود کاربر دوم نیست. شما مالک فایل هستید و ورودی owner پیش از ورودی کاربر نامدار بررسی میشود. setfacl معمولاً ماسک را دوباره محاسبه میکند؛ اینجا ماسک را عمداً صریح نوشتهایم.
وراثت، مسیر و محدودیت برنامه
mkdir "$acl_lab/team"
setfacl -m d:u::rwx,d:u:65534:rwx,d:g::---,d:m::rwx,d:o::--- \
"$acl_lab/team"
(
umask 077
touch "$acl_lab/team/new.txt"
mkdir "$acl_lab/team/sub"
)
getfacl -n "$acl_lab/team/new.txt" "$acl_lab/team/sub"وقتی والد default ACL دارد، همان الگو مبنای دسترسی فرزند است و umask کنار میرود؛ حالت درخواستی برنامه همچنان سقفِ بیتهای مربوط را محدود میکند. بنابراین فایل عادیِ این مثال با درخواست معمول 0666، اجرای مؤثر نمیگیرد، هرچند ورودی موروثی rwx دیده شود؛ پوشه برای پیمایش به x نیاز دارد. زیرپوشهٔ جدید نیز default ACL را به ارث میبرد. تغییر default ACL پوشهٔ team، مجوز فرزندان از قبل موجود را بازنویسی نمیکند.
دسترسی به فایل از تمام اجزای مسیر میگذرد. روی پوشه، r دیدن فهرست نامها و x جستوجو و عبور را ممکن میکند؛ خواندن فایل درون آن مجوز جداگانه دارد. نبود x روی یکی از والدها میتواند فایلِ خواندنی را دستنیافتنی کند. پوشهٔ اصلی این آزمایش عمداً 700 مانده است؛ پس ACL عددیِ داخل آن بهتنهایی دسترسی واقعی از حساب دیگر نمیدهد. در کار تیمی، مسیر والدها را هم بررسی میکنیم، بدون اینکه برای راحتی همهچیز را عمومی کنیم. درخواست دسترسی باید به هویت، عملیات و مسیر مشخص محدود باشد؛ مجوز نوشتن پوشه هم میتواند بر حذف یا تغییر نام ورودیها اثر بگذارد.
تمرین تشخیص و پاسخ
فرض کنید کاربر sara روی report ورودی rw- دارد، ماسک r-- است و همهٔ والدها برای او قابل پیمایشاند. چرا ویرایش شکست میخورد؟ پاسخ: مجوز مؤثر او r-- است. اگر نیاز تأییدشدهٔ سارا نوشتن باشد، ماسک را پس از بررسی همهٔ ورودیهای متأثر به rw- اصلاح میکنیم؛ 777 لازم نیست و میتواند دسترسی نامربوط ایجاد کند. حال اگر ماسک rw- شد ولی یکی از والدها x نداشت، علت تازه در مسیر است. برای پاسخ کامل، ورودی، ماسک، دسترسی مؤثر و حق عبور والدها را جدا بنویسید.
rm -- "$acl_lab/plain.txt" "$acl_lab/team/new.txt"
rmdir -- "$acl_lab/plain-dir" "$acl_lab/team/sub" \
"$acl_lab/team" "$acl_lab"منابع رسمی انگلیسی:
ACL — Linux man-pages: https://man7.org/linux/man-pages/man5/acl.5.html
setfacl — ACL project: https://man7.org/linux/man-pages/man1/setfacl.1.html
getfacl — ACL project: https://man7.org/linux/man-pages/man1/getfacl.1.html
umask — Linux man-pages: https://man7.org/linux/man-pages/man2/umask.2.html
Path resolution — Linux man-pages: https://man7.org/linux/man-pages/man7/path_resolution.7.html
تألیف و مثالهای اختصاصی: تحریریه درسآوند. منابع رسمی انگلیسی برای مطالعهٔ تکمیلی معرفی شدهاند.
متن درسهای عمومی را بدون ورود بخوانید.