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– ۱ root wheel ۵۱۲ Sep ۵ ۱۲:۳۱ myfile
-rw-r–r– ۱ root wheel ۵۱۲ Sep ۵ ۱۲:۳۱ otherfile
-rw-r–r– ۱ root wheel ۷۶۸۰ Sep ۵ ۱۲:۳۱ email.txt
در خروجی بالا اولین ستون نشان میدهد که فایلهایی که لیست شدهاند یک فایل ,یک دایرکتوری ,یک کارتکتر ویزه دستگاه و یا یک سوکت است. در خروجی بالا که برای ستون اول کارکتر – آمده است نشان دهنده این است که ما با یک فایل سر و کار داریم. به ترتیب س ستون بعدی rw- نشان دهنده سطح دسترسی صاحب فایل ( در اینجا خواندن و نوشتن) است . سه ستون بعدی r– نشان دهنده سطح دسترسی گروهی که فایل به آن تعلق دارد ( در اینجا فقط خواندن) است و سه ستون آخری هم نشان دهنده سطح دستزسی دیگران بر روی فایل ( در اینجا فقط خواندن) است. با مراجعه به جدول بالا میتوانیم سطح دسترسی این فایل به صاحب فایل , گروهی که فایل به آن تعلق دارد و دیگران را به باینری به صورت ۶۴۴ بنویسیم.
توجه داشته باشید که کارکتر – یعنی اینکه آن سطح دسترسی غیرفعال است و به آن کس تعلق نگرفته است.
توجه: FreeBSD برای کنترل سطح دسترسی به divice ها آنها را به مانند یک فایل در نظر گرفته و با استفاده از یک کاراکتر ویژه (کاراکتر 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– ۱ trhodes trhodes sunlnk 0 Mar ۱ ۰۵:۵۴ 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 ۱ trhodes trhodes ۶۳ Aug 29 06:36 suidexample.sh
همانطور که میبنید قسمت مربوط به سطح دسترسی اجرایی به عبارت sr تبدیل شده است که به معنی حق اجرای این فایل بوسیله سزح دسترسی root میباشد.
همچنیم میتوانیم برای سطح دسترسی setgid از عدد ۲ در پیشوند استفاده کنیم . به مثال زیر و همچنین خروجی دستور ls -l توجه کنید.
# chmod 2755 sgidexample.sh
-rwxr-sr-x ۱ trhodes trhodes ۴۴ 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 ۱۰ root wheel ۵۱۲ Aug 31 01:49 tmp