پرمیژن چیست و چگونه تنظیم می شود؟

پرمیژن (Permission) یا سطح دسترسی، مجموعه قواعدی در لینوکس است که مشخص می‌کند چه کسی اجازه خواندن، نوشتن یا اجرای یک فایل یا پوشه را دارد. این قواعد معمولاً به شکل یک عدد سه‌رقمی مانند ۶۴۴ یا ۷۵۵ نوشته می‌شوند و با دستور chmod تغییر می‌کنند؛ مالک فایل هم با chown تعیین می‌شود.

سه نوع دسترسی و سه گروه کاربر

در لینوکس هر فایل یا پوشه سه نوع دسترسی دارد:

  • خواندن (r): دیدن محتوای فایل. روی پوشه یعنی امکان گرفتن فهرست نام فایل‌ها.
  • نوشتن (w): تغییر محتوای فایل. روی پوشه یعنی امکان ساخت، حذف یا تغییر نام فایل‌های داخل آن.
  • اجرا (x): اجرای فایل به عنوان برنامه یا اسکریپت. روی پوشه یعنی امکان ورود به آن و دسترسی به مسیرهای داخلش.

این سه دسترسی به‌طور جداگانه برای سه دسته تعریف می‌شوند: مالک (user/owner)، گروه (group) و سایرین (other). وقتی دستور ls -l را اجرا می‌کنید، خروجی چیزی شبیه این است:

-rw-r--r-- 1 alireza alireza 1240 Jul 12 10:03 index.php

کاراکتر اول نوع فایل است (- فایل معمولی، d پوشه) و نه کاراکتر بعدی سه دسته سه‌تایی‌اند: به‌ترتیب دسترسی مالک، گروه و سایرین. در مثال بالا مالک می‌خواند و می‌نویسد، گروه و سایرین فقط می‌خوانند.

همین رشته را روی هاست اشتراکی هم می‌بینید؛ در File Manager کنترل‌پنل، ستون Permissions همین مقدار را نشان می‌دهد و از پنجره تغییر دسترسی با تیک‌زدن مربع‌ها قابل ویرایش است. یعنی برای کارهای روزمره لزوماً به خط فرمان نیاز ندارید.

شکل عددی پرمیژن

هر یک از سه دسته با یک رقم بین ۰ تا ۷ نمایش داده می‌شود که از جمع سه مقدار به دست می‌آید: خواندن ۴، نوشتن ۲ و اجرا ۱٫

پرمیژن ۷۵۵ یعنی چه؟مالک⁦owner⁩⁦r⁩⁦w⁩⁦x⁩⁦7⁩گروه⁦group⁩⁦r⁩⁦-⁩⁦x⁩⁦5⁩سایرین⁦other⁩⁦r⁩⁦-⁩⁦x⁩⁦5⁩⁦chmod 755⁩هر رقم، جمع بیت‌های روشن همان ستون است⁦r⁩⁦=⁩⁦4⁩⁦w⁩⁦=⁩⁦2⁩⁦x⁩⁦=⁩⁦1⁩پوشه‌ها معمولاً ۷۵۵ و فایل‌ها ۶۴۴؛ مقدار ۷۷۷ یعنی هر کاربریروی سرور می‌تواند فایل شما را بازنویسی کند

هر رقم پرمیژن، جمع سه بیت خواندن، نوشتن و اجرا برای یک گروه کاربری است؛ با همین جدول می‌توانید هر عدد سه‌رقمی را در ذهن باز کنید.

عدد شکل حرفی معنی
۰ --- بدون دسترسی
۱ --x فقط اجرا
۲ -w- فقط نوشتن
۳ -wx نوشتن و اجرا
۴ r-- فقط خواندن
۵ r-x خواندن و اجرا
۶ rw- خواندن و نوشتن
۷ rwx خواندن، نوشتن و اجرا

ترتیب ارقام از چپ به راست است: مالک، گروه، سایرین. مثلاً chmod 640 یعنی مالک بخواند و بنویسد، گروه فقط بخواند و سایرین هیچ دسترسی نداشته باشند. chmod 604 یعنی مالک بخواند و بنویسد، گروه هیچ دسترسی نداشته باشد و سایرین فقط بتوانند فایل را بخوانند (مثلاً دانلود کنند) بدون امکان تغییر یا حذف.

یک نکته که زیاد اشتباه گرفته می‌شود: حذف فایل به دسترسی نوشتن روی پوشه والد بستگی دارد، نه به پرمیژن خود فایل. پس فایلی با پرمیژن ۴۴۴ هم ممکن است پاک شود.

تغییر پرمیژن با chmod

ساده‌ترین شکل استفاده، دادن عدد سه‌رقمی است:

chmod 644 index.php
chmod 755 /home/user/public_html

شکل حرفی هم وجود دارد و برای تغییرهای جزئی خواناتر است. در آن u مالک، g گروه، o سایرین و a همه را نشان می‌دهد:

chmod u+x backup.sh (افزودن اجازه اجرا برای مالک)
chmod go-w config.php (گرفتن اجازه نوشتن از گروه و سایرین)

سوییچ -R تغییر را روی همه زیرشاخه‌ها اعمال می‌کند. اجرای آن روی مسیرهای سیستمی می‌تواند سرور را از کار بیندازد و برگرداندنش ساده نیست، پس پیش از زدن Enter مسیر را دوباره بخوانید. ضمناً chmod -R 755 به همه فایل‌های داخل پوشه هم اجازه اجرا می‌دهد؛ راه درست، جدا کردن فایل‌ها و پوشه‌هاست:

find /home/user/public_html -type d -exec chmod 755 {} +
find /home/user/public_html -type f -exec chmod 644 {} +

در مقابل، روی سرور مجازی لینوکسی با کاربر root به همه این دستورات دسترسی دارید و مسئولیت درست تنظیم کردنشان هم با خودتان است؛ روی هاست اشتراکی دامنه اختیار محدودتر است و معمولاً همان File Manager کنترل‌پنل کار را راه می‌اندازد.

تغییر مالک با chown

پرمیژن بدون مالکِ درست معنی کاملی ندارد؛ اگر فایل‌ها متعلق به کاربر اشتباهی باشند، پردازش PHP به آن‌ها دسترسی نخواهد داشت. دستور chown مالک و گروه را تغییر می‌دهد:

chown alireza:alireza index.php
chown -R alireza:alireza /home/alireza/public_html

برای تغییر فقط گروه، از chgrp یا شکل chown :groupname file استفاده کنید. اجرای chown معمولاً نیاز به دسترسی root دارد.

چرا ۷۷۷ خطرناک است

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

ضمناً پیکربندی‌هایی مثل suPHP و suEXEC عمداً از اجرای اسکریپتی که برای گروه یا سایرین قابل نوشتن است خودداری می‌کنند و خطای ۵۰۰ برمی‌گردانند؛ یعنی ۷۷۷ اغلب مشکل را هم حل نمی‌کند. اگر خطای «Permission denied» می‌گیرید، راه‌حل تقریباً همیشه اصلاح مالکیت فایل است، نه باز کردن کامل دسترسی‌ها.

مقادیر پیش‌فرض منطقی برای مسیر وب

  • فایل‌ها: ۶۴۴ — مالک می‌نویسد، بقیه فقط می‌خوانند. فایل‌های PHP نیازی به بیت اجرا ندارند؛ مفسر PHP آن‌ها را می‌خواند، اجرا نمی‌کند.
  • پوشه‌ها: ۷۵۵ — بیت اجرا برای ورود به پوشه لازم است، بنابراین ۶۴۴ روی پوشه کار نمی‌کند.
  • فایل‌های پیکربندی مانند wp-config.php: پرمیژن ۶۴۰ یا ۶۰۰ — اگر PHP با کاربر خود شما اجرا می‌شود، مقدار ۶۰۰ هم مشکلی ایجاد نمی‌کند.
  • اسکریپت‌های شل: ۷۰۰ یا ۷۵۰ — تنها جایی که واقعاً به بیت اجرا نیاز دارید.
  • کلید خصوصی SSH باید ۶۰۰ باشد و پوشه .ssh باید ۷۰۰ باشد — در غیر این صورت خود OpenSSH آن‌ها را نمی‌پذیرد.

برای وردپرس هم همین الگو کافی است و توصیه رایج «۷۷۷ کردن پوشه uploads» بی‌مورد است؛ اگر آپلود کار نمی‌کند، مالکیت پوشه را با کاربری که PHP با آن اجرا می‌شود هماهنگ کنید. این نکته روی هاست وردپرس هم دقیقاً صدق می‌کند.

umask و بیت‌های ویژه

مقدار umask تعیین می‌کند فایل‌های تازه‌ساخته‌شده چه پرمیژنی بگیرند. مقدار متداول ۰۲۲ است که به فایل‌ها ۶۴۴ و به پوشه‌ها ۷۵۵ می‌دهد؛ دقیقاً همان چیزی که برای مسیر وب می‌خواهیم. اجرای umask بدون آرگومان مقدار فعلی را نشان می‌دهد.

گاهی پرمیژن را با چهار رقم می‌بینید؛ برای نمونه پوشه /tmp معمولاً drwxrwxrwt (1777) است. رقم اول به بیت‌های ویژه مربوط است: setuid (4)، setgid (2) و sticky bit (1). sticky bit در یک پوشه اشتراکی باعث می‌شود هر کاربر فقط فایل‌های خودش را حذف کند و setgid باعث می‌شود فایل‌های جدید گروه پوشه والد را به ارث ببرند. setuid حساس است و بدون دلیل مشخص نباید تنظیم شود.

جمع‌بندی

پرمیژن‌ها پیچیده نیستند: سه دسترسی، سه دسته کاربر و یک عدد که این‌ها را خلاصه می‌کند. اگر فایل‌ها را ۶۴۴، پوشه‌ها را ۷۵۵ و فایل‌های پیکربندی را ۶۴۰ نگه دارید و مالکیت را درست تنظیم کنید، هم سایت کار می‌کند و هم سطح حمله کمینه می‌ماند. اگر با این تنظیمات باز هم خطای دسترسی می‌گیرید، پیش از باز کردن دسترسی‌ها موضوع را با پشتیبانی فنی بررسی کنید تا ریشه مشکل مشخص شود.