دسترسی ها (permissions):

در FreeBSD همه فایل‌ها و دایرکتوری ها شامل یک سری بیت کنترل دسترسی می باشند که توسط ابزارهای مختلفی قابل ویرایش و مشاهده هستند. درک کردن دسترسی ها مبنی بر این است که کاربر بتواند به فایل‌ها و دایرکتوری های متعلق به خودش دسترسی کامل داشته باشد و در عین حال همان کاربر نتواند به فایل‌های سیستمی متعلق به سرویس ها و سیستم عامل و همچنین کاربران دیگر دسترسی داشته باشد.

در این نوشتار ما به معرفی دسترسی های سنتی یونکس می پردازیم. البته متد های دیگری هم برای تعیین سطح دسترسی وجود دارد که در نوشتارهای جداگانه بطور مفصل به آن‌ها خواهیم پرداخت. مانند: File System Access Control و MAC و … .

سطح دسترسی هایی که بطور سنتی در یونیکس به فایل‌ها و دایرکتوری ها داده می‌شود شامل سه نوع می باشد: خواندن, نوشتن و اجرا کردن (read, write and execute). این سطح دسترسی ها تعیین می کنند که یک فایل در چه سطحی از دسترسی در اختیار صاحب فایل, گروهی که فایل به آن تعلق دارد و دیگران (هرکس دیگری بجز صاحب فایل) قرار گیرد. سطح دسترسی های خواندن, نوشتن و اجرا کردن را به اختصار و به ترتیب با سه حرف r و w و x نمایش می دهند. همچنین می توان آن‌ها را به صورت باینری نمایش داد که به ترتیب برای خواندن عدد ۴, برای نوشتن عدد ۲ و برای اجرا کردن عدد ۱ را در نظر می گیریم که اگر آن‌ها را جمع کنیم عدد ۷ را که می شود یک بایت به ما می دهد.

در جدول زیر سطح دسترسی ها و همچنین معنی آن‌ها در حالت باینری را آورده ایم.

Directory Listing

Permission

Value

No read, no write, no execute

۰

–x

No read, no write, execute

۱

-w-

No read, write, no execute

۲

-wx

No read, write, execute

۳

r–

Read, no write, no execute

۴

r-x

Read, no write, execute

۵

rw-

Read, write, no execute

۶

rwx

Read, write, execute

۷

برای دیدن سطح دسترسی مربوط به هر فایل از دستور ls به همراه آپشن l استفاده می کنیم. نمونه‌ای از خروجی دستور ls در زیر آمده است.

%ls -l
total 530
-rw-r--r--  1 root 
wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root 
wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root 
wheel    7680 Sep  5 12:31 email.txt

در خروجی بالا اولین ستون نشان می دهد که فایل‌هایی که لیست شده‌اند یک فایل, یک دایرکتوری, یک کاراکتر ویژه دستگاه و یا یک سوکت است. در خروجی بالا که برای ستون اول کاراکتر – آمده است نشان دهنده این است که ما با یک فایل سر و کار داریم. به ترتیب سه ستون بعدی rw- نشان دهنده سطح دسترسی صاحب فایل ( در اینجا خواندن و نوشتن) است. سه ستون بعدی r– نشان دهنده سطح دسترسی گروهی که فایل به آن تعلق دارد ( در اینجا فقط خواندن) است و سه ستون آخری هم نشان دهنده سطح دسترسی دیگران بر روی فایل ( در اینجا فقط خواندن) است. با مراجعه به جدول بالا می توانیم سطح دسترسی این فایل به صاحب فایل, گروهی که فایل به آن تعلق دارد و دیگران را به باینری به صورت ۶۴۴ بنویسیم.

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

توجه: FreeBSD برای کنترل سطح دسترسی به deviceها آن‌ها را به مانند یک فایل در نظر گرفته و با استفاده از یک کاراکتر ویژه (کاراکتر c ) آن‌ها را تشخیص می دهد و برنامه‌ها دسترسی برای خواندن و نوشتن و اجرا کردن این فایل‌ها که در /dev قرار دارند را دارند.

در FreeBSD با دایرکتوری ها هم مانند فایل‌ها رفتار می‌شود و سطح دسترسی آن‌ها هم به مانند فایل‌ها می باشد فقط با کاراکتر ویژه d مشخص می‌شود که دایرکتوری هستند.

کاراکترهای نمادین(Symbolic character):

در حالت کاراکترهای نمادین برای هر بایت سطح دسترسی که در بالا درباره ی آن صحبت کردیم از کاراکتر ویژه ای برای اختصاص سطح دسترسی استفاده می‌کنیم. کاراکترهای نمادین از ساختار چه کسی چه عملی و چه سطح دسترسی (who, action, permission ) استفاده می کنند.

برای درک بهتر موضوع به جدول زیر دقت کنید.

Represents

Letter

Option

User

u

(who)

Group owner

g

(who)

Other

o

(who)

All (“word”)

a

(who)

Adding permission

+

(action)

Removing permission

(action)

Explicitly set permission

=

(action)

Read

r

(permission)

Write

w

(permission)

Execute

x

(permission)

Sticky bit

t

(permission)

Set UID or GID

s

(permission)

مقادیر آورده شده در جدول بالا به وسیله دستور chmod استفاده می شود. برای مثال اگر بخواهیم دسترسی به فایلی را برای دیگران (other ) ببندیم به صورت زیر عمل می کنیم:

%chmod go= FILE

یا اگر بخواهیم دسترسی خواندن را از دیگران بگیریم و دسترسی اجرا کردن به همه بدهیم به صورت زیر عمل می‌کنیم :

%chmod go-w,a+x FILE

پرچم های فایل(FreeBSD File Flags):

یک نوع سطح دسترسی اضافه می باشند که FreeBSD برای کنترل فایل‌ها آن‌ را پیاده‌سازی کرده است و فقط توسط کاربر ریشه می توان آن‌ها را set و یا unset کرد.

برای ست کردن یک پرچم روی فایل‌ها از دستور chflags استفاده می کنیم.

برای مثال اگر بخواهیم یک فایل را به صورت غیر قایل پاک کردن درآوریم به صورت زیر عمل می کنیم.

#chflags sunlink file1

و برای غیر فعال کردن آن پرچم عبارت no را به اول آن اضافه می کنیم.

#chflags nosunlink file1

همچنین برای دیدن پرچم های ست شده بر روی فایل‌ها از دستور ls به همراه آپشن lo استفاده می کنیم.

#ls -lo file1
-rw-r--r--  1 trhodes trhodes  sunlnk 0 Mar  1 05:54 file1

سطوح دسترسی setuid ,setgid و sticky:

سطح دسترسی بعدی که درباره آن بحث می کنیم سه سطح دسترسی ویژه است به نام های setuid ,setgid و sticky که هر مدیر سیستم باید در رابطه با آن‌ها اطلاعات داشته باشد.

این تنظیمات برای بعضی از کارهای سیستم که بر روی فایل‌هایی بدون صاحب نرمال ایجاد و انجام می‌شود لازم است. برای درک بهتر باید تفاوت بین شناسه کاربر واقعی و شناسه کاربر موثر را بدانیم.(‌real user ID و effective user ID)

در real user ID می دانیم چه کسی صاحب و شروع کننده پروسه است. Effective user ID پروسه‌ای در حال اجرا است. برای مثال زمانی که شما می خواهید کلمه عبور خود را با دستور passwd تغییر دهید باید قابلیت خواندن و نوشتن بر روی فایل /etc/passwd و /etc/shadow را داشته باشید ولی در‌واقع شما این سطح دسترسی را ندارید اما با effective user ID می توانید بدون گرفتن خطای سطح دسترسی به راحتی کلمه عبور خود را تغییر دهید.

برای مثال جهت ست کردن سطح دسترسی setuid شما باید عدد ۴ را به صورت پیشوند به سطح دسترسی اضافه کنید. به مثال زیر و خروجی دستور ls -l توجه کنید.

#chmod 4755 suidexample.sh
-rwsr-xr-x   1 trhodes trhodes    63 Aug 29 06:36 suidexample.sh

همان طور که می بنید قسمت مربوط به سطح دسترسی اجرایی به عبارت sr تبدیل شده است که به معنی حق اجرای این فایل بوسیله سطح دسترسی root می باشد.

همچنین می توانیم برای سطح دسترسی setgid از عدد ۲ در پیشوند استفاده کنیم. به مثال زیر و همچنین خروجی دستور ls -l توجه کنید.

#chmod 2755 sgidexample.sh
-rwxr-sr-x   1 trhodes trhodes    44 Aug 31 01:49 sgidexample.sh

همان طور که باز می بینید در قسمت مربوط به سطح دسترسی، گروه قسمت مربوط به اجرا به صورت sr در آمده است که این به معنی اجازه اجرای فایل توسط گروه در سطح دسترسی root می باشد.

در سطح دسترسی های setuid و setgid بدلیل اینکه ما قابلیت اجرا توسط سطح دسترسی root را به طیف وسیعی از کاربران و در‌واقع همه می دهیم سطح امنیت سیستم را دچار مشکل می کنیم اما در سومین سطح دسترسی از این نوع یعنی بیت‌های چسبنده (sticky bit) تا حدود زیادی سطح امنیت بدون مشکل باقی خواهد ماند.

زمانی که ما sticky bit را بر روی یک دایرکتوری تنظیم می کنیم درواقع به آن دایرکتوری اجازه می دهیم که هر چه درون آن قرار دارد را فقط به صاحبش اختصاص دهد. برای مثال یک فایل که درون دایرکتوری ایجاد می شود فقط توسط صاحبش قابلیت پاک شدن داشته باشد. این قابلیت در دایرکتوری های عمومی مانند /tmp بسیار کاربردی است و اجازه پاک شدن فایل‌ها توسط افرادی که صاحب آن نیستند را نمی دهد.

برای ست کردن sticky bit ها عدد ۱ را به صورت پیشوندی به سطح دسترسی های آن فایل یا دایرکتوری اضافه می کنیم.

به مثال زیر توجه کنید:

#chmod 1777 /tmp

همچنین به خروجی دستور ls توجه کنید:

#ls -al / | grep tmp
drwxrwxrwt  10 root wheel         512 Aug 31 01:49 tmp