سطح دسترسی فایل ها در لینوکس ( Linux File Permissions )

سیستم عامل لینوکس به عنوان یکی از پایدار ترین و امن ترین پلتفرم های موجود، کنترل دقیقی روی سطح دسترسی ( file permision ) فایل ها و دایرکتوری ها ارائه می دهد. این کنترل از طریق یک مدل مجوز دهی قدرتمند انجام می شود که شامل تعیین دسترسی برای کاربران، گروه ها و سایرین است.
سطح دسترسی ( file permision ) فایل ها در لینوکس
در این مقاله، به صورت جامع به بررسی این سطوح دسترسی ( file permision )، انواع آن، اعداد باینری مرتبط با مجو ها، و کاربرد هایشان در فایل ها، دایرکتوری ها، لینک ها و سایر اشیای این سیستم می پردازیم.
بخش اول : مفاهیم پایه
در بخش اول به مفاهیم پایه مانند انواع مالکیت فایل و انواع مجوز ها می پردازیم .
مالکیت فایل ها
در لینوکس هر فایل یا دایرکتوری دارای سه نوع دسترسی است:
- User (مالک یا صاحب فایل) : کاربری که فایل را ایجاد کرده و مالک آن محسوب می شود.
- Group (گروه) : گروهی که فایل به آن تعلق دارد و مجموعه ای از کاربران عضو آن هستند.
- Others (دیگران) : کاربرانی که نه مالک فایل هستند و نه عضو گروه آن.
مجوز های پایه
هر فایل یا دایرکتوری دارای سه نوع سطح دسترسی ( file permision ) است:
- Read (r) : اجازه خواندن محتوای فایل یا لیست محتویات یک دایرکتوری.
- Write (w) : اجازه نوشتن یا تغییر محتوا در فایل و ایجاد و حذف فایل در یک دایرکتوری.
- Execute (x) : اجازه اجرای یک فایل اجرایی، یا ورود به یک دایرکتوری.
هر یک از این مجوز ها می توانند برای user، group و others به صورت مستقل تعریف شوند. مجموع این مجوز ها نمایان گر امنیت فایل است.
بخش دوم : ساختار نمایش مجوز ها
مجوز ها در لینوکس معمولاً با دستور ls -l
قابل مشاهده هستند. مثلاً:
-rwxr-xr-- 1 user group 1234 Jun 1 10:00 script.sh
اطلاعات داده شده در این خط نشانگر موارد زیر است :
-
مشخص می کند که این یک فایل معمولی است. برای دایرکتوری ها d
، برای لینک ها l
استفاده می شود.
rwx
برای مالک : اجازه خواندن، نوشتن و اجرا دارد.
r-x
برای گروه : فقط اجازه خواندن و اجرا دارد.
r--
برای دیگران : فقط اجازه خواندن دارد.
بخش سوم : تفاوت مجوز ها در انواع فایل ها
در این قسمت تفاوت میان مجوز در انواع نوع فایل ها را بررسی می کنیم .
فایل های معمولی ( Regular Files ) :
r
: اجازه خواندن محتوا (مثلاً یک فایل متنی).w
: اجازه تغییر محتوای فایل.x
: اجازه اجرا در صورت اجرایی بودن فایل (برای مثال اسکریپت ها و فایل های باینری ).
دایرکتوری ها ( Directories ) :
r
: اجازه دیدن لیست فایل ها داخل دایرکتوری.w
: اجازه ایجاد یا حذف فایل در دایرکتوری.x
: اجازه ورود به دایرکتوری و دسترسی به محتویات آن ( این مورد برای استفاده از دستور cd و ورود به مسیر ضروری است ).
سیم لینک ها ( Symbolic Links ) :
سیم لینک ها همیشه دارای سطح دسترسی rwxrwxrwx
هستند ولی سطح دسترسی واقعی توسط فایل مقصد تعیین میشود. بنابراین، کنترل دسترسی روی خود لینک بی اثر است و باید به فایل مقصد توجه شود.
فایل های دستگاه ( Device Files ) :
سطح دسترسی در این نوع فایل ها اهمیت بالایی دارد چون می توان گفت ارتباط مستفیم با سخت افزار سیستم دارد . مثلاً /dev/sda
یا /dev/null
. این فایل ها معمولاً فقط برای کاربر root یا اعضای گروه های خاص (مثل disk
یا audio
) قابل دسترسی هستند.
فایل های خاص ( FIFO, Socket ) :
FIFO ها (یا named pipes) و sockets نیز نوع خاصی از فایل هستند که برای ارتباط بین پردازه ای ( IPC ) استفاده می شوند. تنظیم صحیح مجوز روی این فایل ها اهمیت زیادی در برنامه های شبکه ای دارد.
بخش چهارم : تنظیم سطح دسترسی
در این بخش به نحوه تعیین سطح دسترسی ( file permision ) برای فایل ها و دایرکتوری ها می پردازیم .
استفاده از دستور chmod
chmod u+x file.sh
: به مالک اجازه اجرا می دهد.
chmod g-w file.txt
: از گروه اجازه نوشتن را می گیرد.
chmod 755 file.sh
: مجوز ها به صورت عددی تنظیم می شوند.
در این قسمت باید ارزش عددی هر کدام از مجوز های r ، w و x را بدانیم :
در سیستم لینوکس مجوز r ارزش 4 را دارد . مجوز w ارزش 2 را دارد و مجوز x ارزش 1 را دارد که انواع ترکیب های آن ها را به صورت زیر می توان استفاده کرد
7 = rwx (4+2+1)
6 = rw- (4+2+0)
5 = r-x (4+0+1)
4 = r– (4+0+0)
3 = -wx (0+2+1)
2 = -w- (0+2+0)
1 = –x (0+0+1)
0 = — –
استفاده از دستور chown
chown root file.txt
: تغییر مالک فایل.
chown root:devs file.txt
: تغییر مالک و گروه فایل.
استفاده از دستور chgrp
chgrp devs file.txt
: فقط گروه فایل را تغییر می دهد.
بخش پنجم : سطح دسترسی پیشرفته
در این بخش به سطح دسترسی پیشرفته فایل ها و دایرکتوری ها و دستور های آن می پردازیم که معمولا به صورت زیر استفاده می شود.
دستور Setuid :
اگر این مورد روی فایل اجرایی ( executable ) تنظیم شود، برنامه با دسترسی مالک اجرا می شود نه با دسترسی کاربر فعلی . مثال: /usr/
bin/passwd
دستور Setgid :
این دستور در حالت کلی فقط برای دو نوع فایل قابل اجرا است ، فایل های اجرایی ( executable files ) و دایرکتوری ها ( directory`s ):
در فایل اجرایی : مانند setuid عمل می کند اما این دستور برای دسترسی گروه کار می کند .
در دایرکتوری : فایل های جدیدی که در دایرکتوری ساخته می شوند، به صورت خودکار عضو همان گروه خواهند بود.
دستور Sticky Bit:
این دستور به این شکل عمل می کند که نمی گذارد هیچ کاربری به جز کاربر root و خود کاربر مالک فایل ، فایل مورد نظر را حذف کند .
بیشتر برای دایرکتوری هایی مانند /tmp
استفاده می شود.
فقط مالک فایل یا root می تواند فایل را حذف کند حتی اگر دیگران مجوز نوشتن داشته باشند.
بخش ششم : نقش کاربران، گروه ها و دیگران
User (مالک):
مالک معمولاً کسی است که فایل را ایجاد کرده. او بیشترین سطح کنترل را دارد. اگر دسترسی اجرای (دسترسی x ) فایل به مالک داده شود ولی نه به گروه یا دیگران، فقط مالک قادر به اجرای آن خواهد بود.
Group (گروه):
گروه برای اشتراک گذاری فایل ها بین کاربران مفید است. با تنظیم سطح دسترسی گروه می توان چند کاربر را بدون دادن دسترسی به دیگران، به یک پروژه یا دایرکتوری خاص محدود کرد.
Others (دیگران):
کاربرانی که نه مالک اند و نه عضو گروه. دسترسی این بخش باید به شدت کنترل شود، به ویژه در محیط های هاستینگ که کاربران مختلف روی یک سرور مشترک کار می کنند.
بخش هفتم: درک اعداد سطح دسترسی (Permission Numbers)
همان طور که در بالاتر هم اشاره شد در سیستم لینوکس سطح دسترسی ها ( file permisions ) با اعداد نیز قابل کنترل است ، در این بخش با توضیحات بیشتر و کامل تری این اعداد را شرح می دهیم .
در لینوکس، مجوز ها را می توان به صورت عددی نیز تنظیم کرد. هر مجوز با یک مقدار مشخص در مبنای ۲ نمایش داده می شود:
r
= 4
w
= 2
x
= 1
ترکیب این اعداد برای هر نقش (user, group, others) صورت می گیرد. مثلاً:
chmod 755
:
User: 7 = rwx
Group: 5 = r-x
Others: 5 = r-x
chmod 644
:
User: 6 = 4 (read) + 2 (write) = rw-
Group: 4 = r–
Others: 4 = r–
در مورد فایل ها، مجوز ۶۴۴ معمول ترین انتخاب است، چون فایل ها معمولاً نیازی به مجوز اجرا ندارند، مگر اینکه اسکریپت یا برنامه ای باشند. مجوز ۶۴۴ یعنی مالک می تواند فایل را بخواند و بنویسد، اما سایرین فقط مجاز به خواندن آن هستند. این کار مانع از این می شود که کاربران دیگر بتوانند فایل را تغییر دهند یا کد های مخرب را وارد کنند. در یک محیط میزبانی، این تنظیمات باعث می شود فایل ها و دایرکتوری ها هم قابل استفاده باشند و هم تا حد مناسبی در برابر سوء استفاده ایمن بمانند.
این روش عددی برای اسکریپت ها و تنظیمات سرور بسیار سریع و رایج است.
بخش هشتم : کاربرد file permision در هاستینگ
در این بخش به بررسی سطوح دسترسی فایل ها در زمینه هاستینگ و استفاده چندین کاربره از سرور می پردازیم .
دایرکتوری های عمومی و خصوصی :
/public_html
: این دایرکتوری معمولاً دارای سطح دسترسی 755
است، به طوری که مالک می تواند فایل ها را بخواند، بنویسد و اجرا کند و سایر کاربران فقط اجازه خواندن و اجرا دارند. این تنظیم باعث می شود فایل های داخل public_html
از طریق مرورگر قابل دسترسی باشند، ولی نوشتن در آن برای کاربران دیگر محدود شود.
/private
: دایرکتوری های private
اغلب با سطح دسترسی محدودتر مانند 700
یا 750
تنظیم می شوند. در این حالت تنها مالک (و در صورت لزوم گروه خاصی) می تواند به محتویات آن دسترسی داشته باشد و سایر کاربران یا سرویس های عمومی وب قادر به مشاهده یا دانلود فایل های این پوشه نخواهند بود. این تنظیم برای نگهداری فایل های پیکربندی، پشتیبان گیری یا اطلاعات محرمانه استفاده می شود.
مدیریت دایرکتوری پروژه مشترک :
در این موارد ایجاد گروه مشترک (devs
) در سرور و دادن مالکیت گروهی به دایرکتوری پروژه و در برخی موارد استفاده از setgid برای ارث بری گروه می تواند کار تیم توسعه را به با سرعت و عملکرد بهتری بهبود ببخشد .
جلوگیری از حذف فایلهای کاربران توسط همدیگر:
استفاده از sticky bit در دایرکتوری هایی که نیاز است چند کاربر در آن کار کنند و فایل ایجاد کنند بسیار کاربردی است ، مانند /shared
.
امن سازی اسکریپت ها:
اطمینان از اینکه فایل های اجرایی یا دایرکتوری های حساس دارای مجوز 750 یا 700 هستند و قابل اجرا توسط دیگر کاربران نیستند.
بخش نهم: ابزار های گرافیکی و بررسی امنیت
و در بخش آخر به بررسی ابزار های گرافیکی مربوط به سطوح دسترسی و بحث امنیت در این زمینه و مواردی که باید رعایت کرد می پردازیم .
ابزار های گرافیکی (برای مبتدیان):
توزیع هایی مانند Ubuntu ابزار هایی دارند که در آن می توان با راست کلیک روی فایل و انتخاب Properties > Permissions، سطوح دسترسی را به راحتی و بدون دستور تغییر داد.
بررسی آسیب پذیری ها در سطوح دسترسی فایل ها در لینوکس
سطوح دسترسی ( file permision ) فایل ها و دایرکتوری ها در لینوکس، یکی از ارکان مهم امنیت سیستمعامل محسوب می شود. اگر این سطوح دسترسی به درستی تنظیم نشوند، ممکن است باعث بروز آسیب پذیری هایی شوند که امکان اجرای کد مخرب یا دستکاری فایل های حساس را برای کاربران غیر مجاز فراهم می کنند. یکی از شایع ترین موارد، وجود فایل ها یا دایرکتوری هایی با مجوز نوشتن برای سایر کاربران (others) است. چنین دسترسی هایی میتوانند به سادگی باعث سوء استفاده و دستکاری اطلاعات شوند، به ویژه اگر در مسیر های حیاتی سیستم قرار داشته باشند.
برای بررسی این نوع آسیب پذیری ها، ابزار find
در لینوکس یک راه حل قدرتمند و ساده فراهم می کند. به عنوان مثال، اجرای دستور زیر:
find / -perm -0002 -type d
باعث می شود تمام دایرکتوری هایی که دارای مجوز نوشتن عمومی (world-writable) هستند، لیست شوند. این دستور به طور خاص دایرکتوری هایی را جستجو می کند که هر کاربری (بدون در نظر گرفتن مالکیت) قادر به نوشتن در آن هاست. چنین دایرکتوری هایی در صورتی که محافظت نشده باشند، می توانند به مهاجم اجازه دهند تا فایل های مخرب بارگذاری یا فایل های موجود را تغییر دهد. دایرکتوری هایی مانند /tmp
بهصورت پیش فرض نوشتنی برای همه هستند اما معمولاً با بیت sticky (t
) محافظت می شوند تا فقط مالک فایل بتواند آن را حذف کند. نبود این بیت در چنین مسیر هایی می تواند باعث سوء استفاده کاربران عادی شود.
علاوه بر این، استفاده از دستور ls -alh
در مسیر های مهم سیستم مانند /etc
, /var
, /usr
, /home
و به ویژه دایرکتوری های مربوط به وب سرور مثل /var/www
می تواند اطلاعات دقیقی در مورد مالکیت و سطح دسترسی ( file permision ) فایل ها و دایرکتوری ها نمایش دهد. با مرور خروجی این دستور می توان فایل هایی با مجوز های بیش از حد باز (مثلاً 777 یا حتی 666) را شناسایی و اصلاح کرد.
در سیستم های چند کاربره یا سرور هایی که کاربران متعددی روی آن فعالیت می کنند، بی توجهی به سطوح دسترسی می تواند پیامد های امنیتی گسترده ای به دنبال داشته باشد. بنابراین بررسی منظم مجوز ها و محدود سازی دسترسی ها به حداقل مورد نیاز، بخش مهمی از فرآیند hardening در لینوکس محسوب می شود.
توصیه می شود که مدیران سیستم به طور دوره ای از اسکریپت های امنیتی یا ابزار های audit مانند aide
, tripwire
یا lynis
برای مانیتورینگ سطح دسترسی فایل ها و دایرکتوری ها استفاده کنند تا از تغییرات مشکوک یا دسترسی های ناخواسته جلوگیری شود.
فایل سیستم ها و پشتیبانی از سطوح دسترسی فایل
سطوح دسترسی فایل ها در لینوکس تنها زمانی قابل استفاده هستند که فایل سیستم مورد استفاده، از آن ها پشتیبانی کند. بیشتر فایل سیستم های بومی لینوکس مانند ext2، ext3، ext4، XFS و Btrfs به طور کامل از ساختار مجوز های یونیکس ( شامل مالکیت، گروه و دسترسی های rwx ) پشتیبانی می کنند. این یعنی در هنگام استفاده از این فایل سیستم ها، می توان به درستی مالکیت فایل ها را تعیین و سطح دسترسی ها را محدود یا تنظیم کرد. همچنین این فایل سیستم ها از ویژگی های امنیتی پیشرفته تری مانند ACL (Access Control List) و SELinux نیز پشتیبانی می کنند که کنترل دقیق تری روی دسترسی ها ارائه می دهد.
اما در مقابل، برخی فایل سیستم های خارجی یا قابل استفاده در چند سیستم عامل مانند FAT32 و exFAT که بیشتر در حافظه های فلش یا دیسک های قابل حمل استفاده می شوند، از مجوز های یونیکسی پشتیبانی نمی کنند. در این موارد، تمام فایل ها به صورت پیش فرض قابل خواندن و نوشتن هستند و نمی توان سطح دسترسی جداگانه ای برای فایل ها یا دایرکتوری ها تعریف کرد. همچنین فایل سیستم NTFS، که به طور پیش فرض توسط ویندوز استفاده می شود، به صورت محدود و از طریق ماژول های خاص مانند ntfs-3g در لینوکس قابل استفاده است. این ماژول ها برخی از مجوز های دسترسی را شبیه سازی می کنند اما این شبیه سازی کامل، دقیق و امن نیست و استفاده از NTFS برای محیط های حساس به هیچ وجه توصیه نمی شود.
از سوی دیگر، در محیط های سازمانی و شبکه ای، فایل سیستم های تحت شبکه مانند NFS (Network File System) و CIFS/SMB نیز به طور گسترده استفاده می شوند. در فایل سیستم NFS که بیشتر در محیط های یونیکس و لینوکس کاربرد دارد، سطوح دسترسی مبتنی بر UID و GID کلاینت و سرور کنترل می شود و به درستی از مجوز های یونیکسی پشتیبانی می کند. با این حال، تنظیمات نادرست در سرور NFS مانند no_root_squash می تواند منجر به خطرات امنیتی شود.
در مورد NFS و راه اندازی آن در سیستم های لینوکسی در مقاله ( آموزش نصب و راه اندازی NFS Server در سیستم عامل Ubuntu ) بخوانید .
در مقابل، فایل سیستم SMB/CIFS که معمولاً برای اشتراک فایل میان لینوکس و ویندوز استفاده می شود، ساختار مجوز ها و اعتبار سنجی متفاوتی دارد و از ACL های خاص خود بهره می برد. تعامل لینوکس با این فایل سیستم از طریق بسته هایی مانند cifs-utils انجام می شود، ولی هماهنگی کامل سطوح دسترسی ممکن است نیازمند پیکربندی دقیق باشد.
در نتیجه، آشنایی با قابلیت ها و محدودیت های هر فایل سیستم از نظر پشتیبانی از مجوز ها، برای تضمین امنیت داده ها و پیاده سازی صحیح سیاست های دسترسی، ضروری است. بنابراین هنگام استفاده از دیسک ها و پارتیشن های مختلف در لینوکس، آگاهی از نوع فایل سیستم و قابلیت های آن در زمینهٔ مجوز های دسترسی، اهمیت زیادی دارد
نتیجهگیری:
مدیریت سطح دسترسی فایل ها ( file permision ) در لینوکس نه تنها یک قابلیت کلیدی، بلکه یک نیاز حیاتی در محیط های هاستینگ و سیستم های چند کاربره است. با درک مفاهیم پایه و پیشرفته مانند setuid، setgid، sticky bit و اعداد سطح دسترسی، مدیران سیستم می توانند ساختاری امن، پایدار و منعطف برای کاربران خود فراهم کنند. انتخاب سطح دسترسی مناسب برای فایل ها و دایرکتوری ها نه تنها امنیت را افزایش می دهد، بلکه کارایی تیم های توسعه، پشتیبانی و کاربران نهایی را نیز بهبود می بخشد.
امیدواریم مطالب این مقاله برای شما مفید بوده باشد . در صورتی مشکلی وجود داشت، میتوانید درخواست پشتیبانی ارسال کنید تا همکاران فنی پارس وب سرور، درخواست شما را بررسی و پاسخ دهند (ارسال تیکت)