فصل ۹ – مجوزها


مقدمه

یکی از پایه‌ای‌ترین تفاوت‌های سیستم‌عامل‌های شبه‌یونیکس با پلتفرم‌های دسکتاپ خانگی، مدل دقیق کنترل دسترسی آن‌ها است.
هر فایل، پوشه و فرایند دارای مالکیت و مجوزهایی است که تعیین می‌کند چه کسانی می‌توانند آن را بخوانند، تغییر دهند یا اجرا کنند.
بدون شناخت این مفاهیم نه‌تنها امکان مدیریت سامانه‌های چندکاربره دشوار می‌شود، بلکه ممکن است ناخواسته به امنیت خود آسیب بزنیم.

در این فصل می‌آموزیم:


مالکیت فایل‌ها

هر شیء در سیستم‌فایل دو نوع مالک دارد: «مالک کاربر» و «مالک گروه».
کاربر مالک معمولاً شخصی است که فایل را ایجاد کرده است، در حالی که گروه مالک به مجموعه‌ای از کاربران اشاره دارد که می‌توانند مجوزهای مشترک داشته باشند.

برای مشاهدهٔ مالکیت و مجوزها از ls -l استفاده کنید:

ls -l /etc/passwd

خروجی نمونه:

-rw-r--r-- 1 root root 2761 Jan 13 09:32 /etc/passwd

ستون چهارم و پنجم نام کاربر و گروه مالک را نشان می‌دهند (در این مثال هر دو root).
اولین مجموعه از کاراکترها (-rw-r--r--) نمایانگر نوع فایل و مجوزها است که در ادامه بررسی می‌کنیم.

تغییر مالکیت

فقط کاربر ریشه یا مالک فایل (در برخی شرایط) می‌تواند مالکیت را تغییر دهد.
برای تغییر مالک از chown استفاده می‌کنیم:

sudo chown ali document.txt      # انتقال مالکیت فایل به کاربر «ali»
sudo chown ali:users document.txt # تغییر مالک کاربر و گروه به‌طور هم‌زمان

اگر فقط بخواهیم گروه را عوض کنیم، دستور chgrp مناسب است:

sudo chgrp developers project/

در مثال بالا، گروه مالک پوشهٔ project/ به developers تغییر می‌کند.
به یاد داشته باشید که تغییر مالکیت روی پوشه‌ها می‌تواند دسترسی به محتویات را نیز تحت تأثیر قرار دهد.


مجوزهای دسترسی

مجوزهای کلاسیک یونیکس سه نوع‌اند: خواندن (r)، نوشتن (w) و اجرا (x).
این مجوزها برای سه دستهٔ کاربر تعیین می‌شوند:

  1. مالک (user)
  2. گروه (group)
  3. سایرین (others)

در رشتهٔ مجوزها مانند -rwxr-xr--، کاراکتر نخست نوع فایل است (- برای فایل معمولی، d برای دایرکتوری، l برای پیوند نمادین و ...)، سه کاراکتر بعدی مجوزهای مالک، سپس سه کاراکتر بعدی مجوزهای گروه و در نهایت سه کاراکتر پایانی مجوزهای سایر کاربران هستند.

معنای مجوزها برای فایل‌ها و پوشه‌ها

اگر دایرکتوری مجوز خواندن نداشته باشد اما x داشته باشد، می‌توانیم به فایل‌های آن دسترسی داشته باشیم به شرطی که نام دقیق‌شان را بدانیم.

بیت‌های ویژه

علاوه بر rwx، سه پرچم خاص نیز وجود دارد:

برای نمایش عددی این بیت‌ها از یک رقم اضافی در سمت چپ استفاده می‌شود (۰ تا ۷).


تغییر مجوزها با chmod

دستور chmod دو روش اصلی برای تعیین مجوز دارد: نمادین و عددی.

حالت نمادین

در این نگارش از حروف u, g, o, a برای اشاره به مالک، گروه، سایرین و همه استفاده می‌شود.
عملگرهای +, -, = نیز برای افزودن، حذف یا تعیین دقیق مجوزها به کار می‌روند.

مثال‌ها:

chmod u+x script.sh        # افزودن مجوز اجرا برای مالک
chmod go-w report.txt      # حذف مجوز نوشتن از گروه و سایرین
chmod a=r file.txt         # تنظیم مجوز خواندن برای همه و حذف سایر مجوزها
chmod u+s /usr/local/bin/app  # فعال کردن بیت setuid

می‌توان دستورات را با کاما ترکیب کرد:

chmod u=rw,go=r shared.conf

حالت عددی

در روش عددی هر مجموعهٔ مجوز به صورت یک عدد پایهٔ ۸ بیان می‌شود.
ارزش‌های پایه عبارت‌اند از: خواندن = ۴، نوشتن = ۲، اجرا = ۱.

برای نمونه، rwx برابر ۷ (۴+۲+۱)، rw- برابر ۶ (۴+۲)، و r-x برابر ۵ (۴+۱) است.

دستور زیر مجوزهای فایل را به -rwxr-x--- تغییر می‌دهد:

chmod 750 script.sh

اگر بخواهیم بیت‌های ویژه را هم تنظیم کنیم، عدد چهارمی در ابتدای توالی اضافه می‌کنیم:

مثلاً chmod 4755 program بیت setuid را همراه با مجوز 755 فعال می‌کند.


مجوزهای پیش‌فرض و umask

هنگامی که برنامه‌ای فایل جدیدی می‌سازد، مجوزهای پیش‌فرض بر اساس «ماسک کاربر» یا umask تعیین می‌شود.
umask بیت‌هایی را مشخص می‌کند که باید از مجوزهای پیشنهادی حذف شوند.

برای مشاهدهٔ مقدار فعلی:

umask

به طور معمول مقدار 022 یا 002 دیده می‌شود.
سیستم فایل معمولاً فایل‌های جدید را با مجوز پایهٔ 666 (rw برای همه) و دایرکتوری‌های جدید را با 777 (rwx برای همه) پیشنهاد می‌دهد.
umask این مقادیر را کاهیده و نتیجهٔ نهایی را تعیین می‌کند.

مثلاً اگر umask برابر 022 باشد:

برای تغییر موقتی umask در نشست فعلی:

umask 027

برای اعمال دائم آن را در فایل پیکربندی شل مانند ~/.bashrc یا /etc/profile قرار دهید.


کار با امتیازات ریشه: su و sudo

بسیاری از عملیات مدیریتی نیاز به امتیازهای بالاتر از کاربر معمولی دارند.
در لینوکس دو ابزار اصلی برای این منظور استفاده می‌شود: su و sudo.

su

دستور su (switch user) پوسته‌ای جدید با هویت کاربر دیگر – معمولاً ریشه – باز می‌کند.

su -

گزینهٔ - باعث می‌شود پوستهٔ جدید محیط ورود کامل کاربر هدف را بارگذاری کند.
برای خروج از نشست su کافی است exit بزنید.

sudo

sudo اجازه می‌دهد یک دستور منفرد را با امتیاز کاربر دیگری اجرا کنیم، بدون آن‌که وارد پوستهٔ او شویم.
اغلب سیستم‌ها sudo را برای کاربران مجاز پیکربندی می‌کنند تا پس از وارد کردن رمز عبور خود بتوانند عملیات مدیریتی انجام دهند.

sudo apt update
sudo systemctl restart nginx

قوانین sudo در فایل /etc/sudoers و دایرکتوری /etc/sudoers.d/ تعریف می‌شوند و باید فقط با دستور visudo ویرایش شوند تا خطاهای نحوی جلوگیری شود.

برای مشاهدهٔ دستورات مجاز، از sudo -l استفاده کنید.

بهترین شیوه‌ها


نمونهٔ عملی: مدیریت پوشهٔ اشتراکی

فرض کنید باید پوشه‌ای مشترک برای تیم توسعه ایجاد کنیم تا اعضا بتوانند فایل‌های پروژه را تبادل کنند.
می‌خواهیم:

  1. گروهی به نام devteam بسازیم.
  2. مالکیت پوشهٔ /srv/devshare را به کاربر مسئول و گروه devteam بدهیم.
  3. تضمین کنیم هر فایل جدیدی که در پوشه ایجاد می‌شود به طور خودکار به گروه devteam تعلق داشته باشد و سایر اعضا بتوانند آن را بخوانند و بنویسند.

مراحل:

sudo groupadd devteam
sudo mkdir -p /srv/devshare
sudo chown lead:devteam /srv/devshare
sudo chmod 2775 /srv/devshare

مجوز 2775 چه معنایی دارد؟

اگر می‌خواهیم کاربران نتوانند فایل‌های یکدیگر را حذف کنند، می‌توانیم بیت sticky را نیز فعال کنیم:

sudo chmod 3775 /srv/devshare

جمع‌بندی

مدل مجوزهای لینوکس ابزار قدرتمندی برای حفظ امنیت و سازمان‌دهی فایل‌ها است.
با درک مالکیت، بیت‌های ویژه و مجوزهای پیش‌فرض می‌توانیم دسترسی کاربران را دقیقاً مطابق نیاز تنظیم کنیم.
یادگیری استفادهٔ صحیح از sudo و su نیز به ما اجازه می‌دهد کارهای مدیریتی را بدون به خطر انداختن کل سیستم انجام دهیم.

در فصل بعد (فرایندها) خواهیم دید چگونه سیستم یونیکس اجرای برنامه‌ها را مدیریت می‌کند و چگونه کاربران می‌توانند آن‌ها را کنترل کنند.