معنای drwxr-xr-x و سطوح دسترسی در لینوکس
در این راهنما یاد میگیرید چگونه رشته drwxr-xr-x را به عدد 755 تبدیل کنید. تفاوت مجوزهای خواندن، نوشتن و اجرا را درک کنید و ببینید چرا استفاده از chmod 777 راهکار درستی نیست.
معنای drwxr-xr-x
drwxr-xr-x نشاندهنده دایرکتوری است که مالک آن اجازه تغییر در آن را دارد و سایر کاربران تنها میتوانند محتویات آن را بخوانند و وارد آن شوند، بدون اینکه امکان تغییر چیزی را داشته باشند. در مبنای هشت (octal)، این حالت برابر با 755 است. لینوکس این ده کاراکتر را در ابتدای هر خط از خروجی ls -l چاپ میکند و آنها همیشه در همان ترتیب، معنای یکسانی دارند؛ بنابراین با یادگیری یک رشته، همه آنها را خواهید آموخت.
یک قاعده پیش از سایر موارد قرار میگیرد، زیرا تعیین میکند که آیا تستهای شما نتیجهای در بر دارند یا خیر. کاربر root بیتهای مجوز را نادیده میگیرد. هسته سیستمعامل به root قابلیت CAP_DAC_OVERRIDE (نادیده گرفتن کنترل دسترسی اختیاری) را اعطا میکند، بنابراین root فایلهایی را باز میکند که حالت (mode) آنها دسترسی را منع کرده است. هر مثالی در این صفحه برای کاربر root با موفقیت اجرا میشود، فارغ از اینکه بیتها چه چیزی را نشان دهند. زمانی که میخواهید عملکرد این قوانین را مشاهده کنید، با یک کاربر معمولی وارد سیستم شوید.
ده کاراکتر، یکی پس از دیگری
یک دایرکتوری و یک فایل برای بررسی ایجاد کنید. هیچکدام از دستورات این بخش، تغییری خارج از دایرکتوری جدید ایجاد نمیکنند.
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txtبا umask پیشفرض معمول 022، دو خط مربوط به دایرکتوری با drwxr-xr-x و خط مربوط به فایل با -rw-r--r-- شروع میشوند.
کاراکتر 1 نوع فایل است، نه یک مجوز. d یک دایرکتوری است. - یک فایل معمولی است. l یک symbolic link است. c و b گرههای دستگاه (device nodes) کاراکتری و بلوکی هستند. s یک socket و p یک named pipe است. این کاراکتر خارج از مقدار هشتتایی (octal) قرار دارد، به همین دلیل است که drwxr-xr-x به 755 تبدیل میشود، نه چیزی که با d شروع شود.
نه کاراکتر بعدی، سه گروه سهتایی هستند و ترتیب آنها هرگز تغییر نمیکند.
- کاراکترهای 2 تا 4 سهتایی owner هستند؛ بیتهایی که برای کاربری که مالک فایل است اعمال میشوند.
- کاراکترهای 5 تا 7 سهتایی group هستند؛ بیتهایی که برای گروه فایل اعمال میشوند.
- کاراکترهای 8 تا 10 سهتایی other هستند؛ بیتهایی که برای سایر کاربران اعمال میشوند.
درون هر سهتایی، جایگاهها همیشه r، سپس w و بعد x هستند و خط تیره به معنای غیرفعال بودن آن بیت است. حروف هرگز جای خود را تغییر نمیدهند. r-x به معنای خواندن بدون نوشتن است. -w- به معنای نوشتن بدون خواندن است که قانونی اما نادر است.
بنابراین drwxr-xr-x به این صورت تفکیک میشود: d برای دایرکتوری، سپس rwx برای مالک، سپس r-x برای گروه و در نهایت r-x برای سایرین.
برخی سیستمها کاراکتر یازدهمی را نیز چاپ میکنند. نقطه پایانی، drwxr-xr-x.، به این معناست که فایل دارای یک context از نوع SELinux (امنیت پیشرفته لینوکس) است که توزیعهای SELinux مانند Fedora و Rocky بهطور پیشفرض آن را نمایش میدهند. علامت مثبت پایانی، drwxr-xr-x+، به این معناست که فایل دارای یک POSIX ACL (لیست کنترل دسترسی) است؛ مجموعهای از قوانین اضافی فراتر از این نه بیت. این قوانین اضافی را با دستور getfacl <path> بخوانید.
مجوزهای r، w و x در دایرکتوریها عملکردهای متفاوتی دارند
این اولین قاعدهای است که مبتدیان در درک آن دچار اشتباه میشوند. اگرچه این حروف در فایلها و دایرکتوریها یکسان هستند، اما اختیاراتی که اعطا میکنند متفاوت است.
rروی یک فایل، محتوای آن را میخواند.rروی یک دایرکتوری، نام فایلهای داخل آن را لیست میکند؛ این همان کاری است که دستور سادهٔlsبه آن نیاز دارد.wروی یک فایل، محتوای آن را تغییر میدهد.wروی یک دایرکتوری، امکان افزودن یا حذف ورودیها (فایلها) را فراهم میکند. حذف یک فایل، تغییری در دایرکتوری محسوب میشود، بنابراین مجوز نوشتن روی دایرکتوری تعیینکننده است و مجوز خودِ فایل در این مورد نقشی ندارد.xروی یک فایل، آن را بهعنوان یک برنامه اجرا میکند.xروی یک دایرکتوری، امکان پیمایش (traverse) در آن را میدهد؛ به این معنی که هسته سیستمعامل میتواند در حین جستجوی یک مسیر، نامی را در آن دایرکتوری شناسایی کند.
پیمایش همان بخشی است که کاربران را غافلگیر میکند. x روی یک دایرکتوری هیچ چیزی را اجرا نمیکند. باز کردن فایل /srv/site/index.html نیازمند x روی /، سپس x روی /srv، سپس x روی /srv/site و در نهایت r روی خودِ فایل است. اگر یکی از دایرکتوریهای موجود در این زنجیره فاقد مجوز x برای شما باشد، جستجو در همانجا متوقف میشود و به فراخواننده خطای Permission denied برای کل مسیر گزارش داده میشود، حتی اگر فایل نهایی برای همه قابل خواندن باشد. دستور namei -l /srv/site/index.html هر مرحله از این زنجیره را به همراه حالت (mode) و مالک آن چاپ میکند تا بتوانید ببینید کدام حلقه باعث توقف دسترسی شده است.
دایرکتوری دارای r بدون x، یک وضعیت نیمهکارهٔ عجیب است که باید آن را شناخت. یک کاربر عادی میتواند نام فایلها را لیست کند، زیرا لیست کردن همان کاری است که r اعطا میکند، اما نمیتواند وضعیت (stat) هیچکدام از ورودیها را دریافت کند. بنابراین دستور ls -l ستونهای اندازه و حالت را با علامت سوال پر کرده و برای هر مورد خطای ls: cannot access ...: Permission denied را چاپ میکند.
تبدیل حروف به 755
هر سهتایی (triad) یک عدد سه بیتی است. r برابر با 4، w برابر با 2 و x برابر با 1 است. بیتهای فعال را با هم جمع کنید.
rwxبرابر است با 4 + 2 + 1 = 7rw-برابر است با 4 + 2 = 6r-xبرابر است با 4 + 1 = 5r--برابر است با 4---برابر است با 0
بنابراین drwxr-xr-x برای مالک 7، برای گروه 5 و برای سایرین 5 است: 755. -rw-r--r-- برابر است با 6، 4، 4: 644. drwxrwxr-x برابر است با 7، 7، 5: 775، که همان 755 با افزودن دسترسی نوشتن برای گروه است. شما هرگز نیازی ندارید کاراکترها را بهصورت دستی بشمارید، زیرا stat هر دو فرم را همزمان نمایش میدهد.
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A فرم حرفی، %a فرم اکتال (هشتهشتی)، و %U و %G نام کاربر مالک و گروه مالک را نشان میدهند.
رشتههای مجوز که کاربران جستجو میکنند
اینها حالتهایی (modes) هستند که در یک سرور واقعی با آنها مواجه میشوید، به همراه مقدار هشتتایی (octal) و کاربرد هر یک.
-rw-r--r--برابر با 644 است. فایلهای معمولی که سرویس فقط آنها را میخواند، مانند فایل پیکربندی یا یک صفحه HTML.-rw-------برابر با 600 است. موارد محرمانه: کلید خصوصی SSH یا فایل.envیک برنامه.-rw-rw-r--برابر با 664 است. فایلی در دایرکتوری که توسط یک گروه به اشتراک گذاشته شده و اعضای تیم نیاز به نوشتن در آن دارند.-rwxr-xr-xبرابر با 755 است. اسکریپتها و فایلهای باینری، مانند/usr/local/bin/backup.shو بیشتر محتویات/usr/bin.-rwx------برابر با 700 است. یک اسکریپت خصوصی که فقط مالک آن اجازه اجرای آن را دارد.drwxr-xr-xبرابر با 755 است. تقریباً تمام دایرکتوریهای سیستمی و ریشه اسناد (document root) یک وبسایت.drwx------برابر با 700 است.~/.sshو دایرکتوریهای خانگی در یک سیستم با امنیت بالا.drwxrwxr-xبرابر با 775 است. دایرکتوری که گروهِ مالک، اجازه نوشتن در آن را دارد.drwxrwsr-xبرابر با 2775 است. مشابه مورد قبل، به همراه بیت setgid، تا فایلهای جدید داخل آن، گروهِ دایرکتوری را به ارث ببرند.drwxrwxrwtبرابر با 1777 است./tmp. عددtدر انتها نشاندهنده sticky bit است، بنابراین هر کاربر فقط میتواند فایلهای متعلق به خودش را حذف کند.-rwsr-xr-xبرابر با 4755 است. یک فایل باینری setuid که با دسترسی مالک خود اجرا میشود، مانند/usr/bin/passwdو/usr/bin/sudo.-rw-rw-rw-برابر با 666 وdrwxrwxrwxبرابر با 777 است. قابل نوشتن برای همه (World writable) که در سرور تقریباً همیشه یک اشتباه امنیتی است.lrwxrwxrwxمقداری است که تمام لینکهای نمادین (symbolic links) نشان میدهند. لینوکس بیتهای حالت را روی خودِ لینک نادیده میگیرد و در عوض هدف (target) را بررسی میکند، بنابراین این رشته هیچ معنایی ندارد.
کدام سهگانه برای شما اعمال میشود
این دومین قاعدهای است که مبتدیان در آن دچار اشتباه میشوند. هسته (kernel) دقیقاً یک سهگانه را انتخاب کرده و در همانجا متوقف میشود.
اگر شناسه کاربری شما با مالک فایل مطابقت داشته باشد، سهگانه مالک به شما اختصاص مییابد و بیتهای گروه و سایرین هرگز بررسی نمیشوند. در غیر این صورت، اگر گروه فایل یکی از گروههای شما باشد، سهگانه گروه به شما اختصاص مییابد. در غیر این صورت، سهگانه سایرین (other) اعمال میشود.
دو نتیجه از این موضوع حاصل میشود. سهگانه مالک حتی زمانی که محدودکنندهترین حالت باشد، اعمال میشود. فایلی با حالت 0466 که با -r--rw-rw- نمایش داده میشود، به مالک فقط دسترسی خواندن میدهد در حالی که بقیه میتوانند در آن بنویسند؛ زیرا بررسی مالک ابتدا انجام شده و هیچچیز پس از آن خوانده نمیشود. این وضعیت قانونی است و هر کسی که برای اولین بار با آن مواجه میشود را سردرگم میکند.
سهگانه گروه بر اساس گروه فایل انتخاب میشود، نه بر اساس لیست گروههایی که شما در آنها عضو هستید. ls -l دو نام را در هر خط چاپ میکند: مالک و سپس گروه. فقط همان گروه دوم بر آن فایل حق تصمیمگیری دارد. عضویت در بیست گروه تنها زمانی کمک میکند که فایل یکی از آنها را داشته باشد.
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid کاربر شما و تمام گروههایی که در آنها عضو هستید را چاپ میکند. stat مالک و گروه فایل را چاپ میکند. این دو را با هم مقایسه کنید تا بدانید هسته از کدام سهگانه برای شما استفاده خواهد کرد.
به همین دلیل است که یک دایرکتوری اشتراکی معمولاً یک گروه و بیت setgid دریافت میکند. sudo chmod 2775 /srv/shared به صورت drwxrwsr-x چاپ میشود و فایلهای ایجاد شده در آن، به جای گروه شخصی ایجادکننده، گروه دایرکتوری را به ارث میبرند تا نفر بعدی همچنان بتواند در آنها بنویسد. اختصاص یک حساب کاربری مجزا به هر سرویس، نیمه دیگر این ماجرا است که در یک کاربر لینوکس برای هر سرویس روی یک VPS پوشش داده شده است.
دستور umask حالت (mode) هر فایل جدید را تعیین میکند
یک فایل جدید، حالت خود را از شما نمیگیرد. این حالت از برنامهای که فایل را ایجاد کرده است گرفته میشود، منهای بیتهایی که umask شما پاک میکند. umask در واقع ماسکی از بیتهایی است که باید حذف شوند؛ بنابراین umask بزرگتر، فایلهای خصوصیتری ایجاد میکند.
بیشتر توزیعها با مقدار 022 عرضه میشوند. برنامهای که یک فایل معمولی ایجاد میکند، درخواست 0666 میدهد. برنامهای که یک دایرکتوری ایجاد میکند، درخواست 0777 میدهد. umask مقدار 022 را از هر دو درخواست حذف میکند، بنابراین شما 644 برای فایلها و 755 برای دایرکتوریها دریافت میکنید. این دقیقاً همان جفتی است که در سراسر یک VPS تازه نصبشده مشاهده میکنید.
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S مقدار را به صورت حروف نمایش میدهد که خواندن آن از 0022 آسانتر است. برای داشتن یک پیشفرض سختگیرانهتر، umask 027 را در ~/.profile تنظیم کنید: 640 برای فایلها و 750 برای دایرکتوریها؛ به این ترتیب گروه شما میتواند کارهای شما را بخواند و هیچکس دیگری به آنها دسترسی نخواهد داشت.
دو محدودیت اهمیت دارند. umask فقط میتواند بیتها را حذف کند و هرگز نمیتواند آنها را اضافه کند؛ به همین دلیل است که یک فایل تازه ایجاد شده، فارغ از تنظیمات شما، هرگز قابلاجرا (executable) نیست. همچنین، یک سرویس systemd هرگز پروفایل shell شما را نمیخواند، بنابراین مقدار را در فایل unit تنظیم کنید.
[Service]
UMask=0027چرا مجوز فایلهای وب 644 و دایرکتوریهای وب 755 است
یک وبسرور تحت حساب کاربری مخصوص خود اجرا میشود؛ www-data در Debian و Ubuntu، و nginx در Rocky و Alma. آن پردازش برای ارائه فایلها نیاز به دسترسی خواندن (read) و برای عبور از دایرکتوریهای بالادستی نیاز به دسترسی پیمایش (traverse) دارد. دلیلی برای نوشتن (write) در این فایلها وجود ندارد و یک سایت ایستا هرگز نباید چنین اجازهای بدهد.
مجوز 644 روی یک فایل، دسترسی نوشتن را به مالک و دسترسی خواندن را به همه میدهد؛ بنابراین کاربر deploy میتواند فایلها را منتشر کند و کاربر وب میتواند آنها را ارائه دهد. مجوز 755 روی یک دایرکتوری، دسترسی نوشتن را به مالک و دسترسی پیمایش را به همه میدهد؛ بنابراین کاربر وب میتواند مسیر را طی کند بدون آنکه قادر به افزودن یا حذف چیزی باشد. در این صورت، یک باگ در برنامه نمیتواند صفحاتی را که ارائه میدهد، بازنویسی کند.
قانون پیمایش دقیقاً در همینجا اهمیت پیدا میکند. اگر سایت در /home/deploy/site قرار داشته باشد و /home/deploy دارای مجوز 750 باشد، کاربر وب اصلاً نمیتواند وارد دایرکتوری home شود و درخواست با خطای HTTP 403 و خطی مشابه زیر در /var/log/nginx/error.log پایان مییابد:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5عدد 13 در اینجا همان EACCES است، یعنی امتناع هسته از دسترسی. هیچ مشکلی در شبکه وجود ندارد: پورت در حال گوش دادن است و درخواست رسیده است؛ همین موضوع باعث میشود در حالی که هنوز در حال یادگیری نحوه عملکرد پورتهای در حال گوش دادن در لینوکس هستید، این خطا گیجکننده باشد. دستور namei -l /home/deploy/site/index.html را اجرا کنید و زنجیره مسیر را تا رسیدن به اولین دایرکتوری که فاقد مجوز x برای سایرین (other) است، بررسی کنید.
دایرکتوریهایی که برنامه در آنها مینویسد، مانند مسیر آپلود، استثنا هستند. این دسترسی را با تغییر مالکیت (ownership) فراهم کنید، نه با بازتر کردن مجوزها: از sudo chown -R www-data:www-data /srv/site/uploads استفاده کنید و مجوز را روی 755 باقی بگذارید. دسترسی نوشتن را فقط برای همان دایرکتوری که به آن نیاز دارد، حفظ کنید.
استفاده از chmod بدون تغییر کل ساختار درختی
chmod به هر دو صورت قابل استفاده است. حالت هشتهشتی (octal) تمام 9 بیت مجوز را یکجا تنظیم میکند: chmod 644 notes.txt. حالت نمادین (symbolic) فقط مواردی را که مشخص میکنید تغییر میدهد و بقیه را دستنخورده باقی میگذارد: chmod u+x deploy.sh مجوز اجرا را برای مالک اضافه میکند و chmod go-w notes.txt مجوز نوشتن را از گروه و سایرین میگیرد.
بازگشتی (recursion) جایی است که ساختار درختی فایلها آسیب میبیند. chmod -R 755 . تمام تصاویر و فایلهای پیکربندی را قابلاجرا میکند، زیرا chmod نمیتواند تفاوت یک اسکریپت را از یک فایل JPEG تشخیص دهد. بهجای آن از X با حروف بزرگ استفاده کنید.
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txtحرف بزرگ X مجوز اجرا را فقط برای دایرکتوریها و فایلهایی که از قبل حداقل یک بیت اجرا داشتهاند، اعمال میکند. دایرکتوریها به 755، فایلهای معمولی به 644 و اسکریپتهایی که از قبل قابلاجرا بودهاند، به همان حالت باقی میمانند. زمانی که فایلی دارید که مجوز آن مورد اعتماد شماست، chmod --reference=good.sh other.sh همان مجوز را روی فایلهای دیگر کپی میکند.
پیامهایی که هنگام اشتباه بودن یک بیت مشاهده میکنید
bash: ./deploy.sh: Permission denied به این معنی است که اسکریپت فاقد بیت x در سهتایی (triad) مربوط به شما است، یا یکی از دایرکتوریهای موجود در مسیر آن، بیت x را ندارد. دستور chmod u+x deploy.sh مورد اول را اصلاح میکند.
bash: ./deploy.sh: cannot execute: required file not found یک خطای متفاوت با نامی گمراهکننده است. بیت x مشکلی ندارد، اما مفسری که در خط اول نام برده شده، یافت نمیشود. علت معمول این خطا، استفاده از پایانههای خط ویندوزی است؛ بنابراین هسته سیستمعامل به دنبال مفسری به نام /bin/bash\r میگردد. آن را با دستور sed -i 's/\r$//' deploy.sh تعمیر کنید.
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. از سمت کلاینت SSH صادر میشود که از استفاده از کلید خصوصیای که سایر حسابها قادر به خواندن آن هستند، خودداری میکند. کلید باید دارای مجوز 600 و دایرکتوری ~/.ssh باید دارای مجوز 700 باشد. جزئیات کامل مدیریت کلیدها در مدیریت کلیدهای SSH و مجوزهای فایل آنها آمده است.
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh زمانی در ژورنال سرور ظاهر میشود که دایرکتوری home یا دایرکتوری .ssh آن برای گروه قابل نوشتن باشد. تنظیمات StrictModes در sshd کلید را رد میکند و از سمت کلاینت، این وضعیت به صورت درخواست غیرمنتظره رمز عبور بدون هیچ توضیحی دیده میشود.
sudo: /etc/sudoers is world writable، که به دنبال آن sudo: no valid sudoers sources found, quitting میآید، به این معنی است که sudo مجوزهای فایل پیکربندی خود را بررسی کرده و از اجرا امتناع ورزیده است. آن فایل باید دارای مجوز 0440 باشد. این پیام، نتیجه کلاسیک یک دستور chmod بازگشتی (recursive) گسترده است و ممکن است همزمان با پیام sshd در بالا ظاهر شود که در این صورت، کنسول ارائهدهنده سرور تنها راه دسترسی مجدد خواهد بود.
چرا 777 راهحل مناسبی نیست
مجوز 777 به تمام حسابهای کاربری روی سیستم و تمامی پردازشهایی که تحت آن حسابها اجرا میشوند، دسترسی نوشتن میدهد. یک سرور، سرویسها را تحت کاربران اختصاصی خود اجرا میکند؛ بنابراین در یک VPS، عبارت «همه» (everyone) دامنهٔ بسیار گستردهتری نسبت به یک لپتاپ شخصی دارد. اگر یک سرویس دچار رخنه شود، میتواند در هر مسیری که مجوز 777 دارد، بنویسد.
در دایرکتوری ریشهٔ وب (web root)، آسیب مستقیم است. دایرکتوری با قابلیت نوشتن برای همه (world writable) که توسط سرور سرویسدهی میشود، به این معناست که یک نقص در آپلود فایل میتواند به راهی برای کاشتن یک اسکریپت و سپس فراخوانی مجدد آن تبدیل شود.
مجوز 777 تقریباً همیشه پاسخ اشتباهی برای مشکل مالکیت فایل است. نشانهٔ این مشکل این است که «برنامه نمیتواند در این دایرکتوری بنویسد». علت اصلی این است که دایرکتوری متعلق به کاربر اشتباهی است. استفاده از sudo chown -R appuser:appuser /srv/app/storage با حالت 755 این مشکل را حل کرده و دسترسی سایر حسابهای کاربری را مسدود میکند. ایجاد این حسابهای کاربری پیش از استقرار هرگونه سرویس، بخشی از ده دقیقهٔ اول در یک VPS جدید است.
دسترسی نوشتن برای همه (world write) تنها در یک مکان آشنا مجاز است، یعنی /tmp، و به صورت drwxrwxrwt نوشته میشود. عبارت t در انتهای آن، sticky bit است: دایرکتوری برای همه قابل نوشتن است، اما هر کاربر فقط میتواند فایلهایی را که خودش مالک آنهاست حذف کند. بدون این بیت، هر حساب کاربری میتوانست فایلهای موقت حسابهای دیگر را حذف کند.
پیش از تغییر حالت، آن را بخوانید
این دستورات فقط وضعیت را میخوانند، بنابراین اجرای آنها در هر محیطی ایمن است.
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002دستور find <path> -perm -0002 تمام موارد موجود در یک مسیر را که بیت دسترسی نوشتن برای همه (world write) روی آنها فعال است فهرست میکند؛ این سریعترین روش برای بازرسی یک سرور پس از آن است که شخصی با استفاده از chmod 777 اقدام به تعمیرات کرده باشد.
برای اینکه بپرسید آیا یک حساب کاربری خاص میتواند وارد یک دایرکتوری شود، این پرسش را با همان حساب انجام دهید. دستور sudo -u www-data test -x /srv/site && echo yes || echo no در صورتی که آن کاربر دسترسی پیمایش (traverse) در دایرکتوری را داشته باشد yes و در غیر این صورت no را چاپ میکند. پرسش با حساب root هیچ چیزی را اثبات نمیکند، زیرا root از این بررسی عبور میکند و پاسخ همیشه yes خواهد بود.
FAQ
عبارت drwxr-xr-x در لینوکس به چه معناست؟
این یک دایرکتوری است که با کاراکتر ابتدایی d مشخص میشود و دارای مد 755 است. سهتایی مالک برابر با rwx است، بنابراین مالک تمام دسترسیها را روی آن دارد. سهتایی گروه r-x و سهتایی سایرین r-x است؛ یعنی بقیه کاربران میتوانند نام فایلهای داخل آن را لیست کرده و وارد دایرکتوری شوند، اما هیچکس جز مالک نمیتواند فایلی را اضافه یا حذف کند. هر مسیری را با stat -c '%A %a %U %G %n' <path> بررسی کنید که فرم متنی و اکتال (octal) را در کنار هم نمایش میدهد.
چرا فایلهای وب 644 و دایرکتوریهای وب 755 هستند؟
وبسرور تحت یک حساب کاربری متفاوت، یعنی www-data در اوبونتو، اجرا میشود. این سرویس برای خواندن فایلهایی که ارائه میدهد و عبور از هر دایرکتوری در مسیر آنها به دسترسی خواندن و عبور نیاز دارد، اما دلیلی برای نوشتن در آنها ندارد. مد 644 به مالک اجازه نوشتن میدهد و بقیه فقط میتوانند بخوانند. مد 755 به مالک اجازه نوشتن میدهد و بقیه فقط میتوانند وارد دایرکتوری شوند. دایرکتوریهایی که برنامه واقعاً باید در آنها بنویسد، باید با دستور chown به کاربرِ همان برنامه واگذار شوند، نه اینکه دسترسی برای همه باز شود.
آیا بیت x به معنای قابلیت اجرای یک دایرکتوری است؟
خیر. در مورد دایرکتوری، x به معنای قابلیت عبور (traverse) است؛ یعنی حق دسترسی به نامهای داخل آن در حالی که هسته سیستمعامل در حال پیمایش مسیر است. cd به این دسترسی نیاز دارد و هر بار باز کردن فایلی در زیرمجموعه آن نیز به آن وابسته است. هر دایرکتوری در طول مسیر به x نیاز دارد، بنابراین اگر دایرکتوری بالادستی فاقد x برای شما باشد، فایلی با مد 644 همچنان غیرقابل دسترس خواهد بود. دستور namei -l /path/to/file مد هر دایرکتوری در زنجیره مسیر را چاپ میکند که نشان میدهد عملیات جستجو کجا متوقف میشود.
آیا chmod 777 هرگز راهحل درستی است؟
تقریباً هرگز در یک سرور. این دستور به تمام حسابهای کاربری روی ماشین، از جمله حسابهایی که سرویسها تحت آنها اجرا میشوند، اجازه نوشتن میدهد؛ بنابراین یک سرویسِ نفوذپذیر میتواند فایل را بازنویسی کند. وقتی برنامهای نمیتواند در دایرکتوری بنویسد، مشکل اصلی معمولاً مالکیت است: sudo chown -R appuser:appuser /srv/app/storage با مد 755 آنچه برنامه نیاز دارد را فراهم میکند و دسترسی بقیه را محدود نگه میدارد. استثنای معروف، /tmp با مد 1777 است که تنها به این دلیل کار میکند که sticky bit مانع از آن میشود که کاربران فایلهای یکدیگر را حذف کنند.
چرا ls بعد از مجوزها یک نقطه یا علامت مثبت چاپ میکند؟
آن کاراکتر یازدهم، قوانینی فراتر از نه بیت مجوز اصلی را توصیف میکند. یک نقطه، مانند drwxr-xr-x.، به این معناست که یک SELinux security context متصل شده است که در Fedora و Rocky عادی است. یک علامت مثبت، مانند drwxr-xr-x+، به این معناست که یک POSIX ACL (لیست کنترل دسترسی) تنظیم شده است؛ بنابراین برخی کاربران یا گروهها حقوقی دارند که در آن سه سهتایی نمایش داده نمیشود. برای لیست کردن آن ورودیهای اضافی، getfacl <path> را اجرا کنید.