خطای «Permission denied»، سایتی که نمیتواند تصویر آپلود کند، یا برعکس، فایلهایی با دسترسی ۷۷۷ که در هک شدن سایت نقش داشتهاند؛ همه به یک مفهوم برمیگردند: دسترسی فایلها در لینوکس. در این راهنما دسترسی فایل در لینوکس را از پایه توضیح میدهیم: کاربر و گروه، rwx، حالت عددی، chmod و chown و دسترسیهای درست برای سایتها.
فهرست مطالب
مالک، گروه و دیگران
هر فایل و پوشه در لینوکس یک مالک (User) و یک گروه (Group) دارد. دسترسیها برای سه دسته جداگانه تعریف میشوند:
- u (user): مالک فایل.
- g (group): اعضای گروه فایل.
- o (others): همه کاربران دیگر.
هر برنامه هم با یک کاربر اجرا میشود؛ مثلاً Nginx و PHP-FPM در Ubuntu معمولاً با کاربر www-data. بنابراین «آیا سایت میتواند این فایل را بنویسد؟» یعنی «آیا کاربر www-data اجازه نوشتن دارد؟».
خواندن خروجی ls -l
$ ls -l
-rw-r--r-- 1 deploy www-data 4120 Oct 6 10:12 index.php
drwxr-xr-x 5 deploy www-data 4096 Oct 6 10:12 wp-content
- کاراکتر اول نوع است:
-فایل،dپوشه،lلینک. - سه کاراکتر بعدی دسترسی مالک، سه تای بعد گروه و سه تای آخر دیگران.
deployمالک وwww-dataگروه است.
r، w و x روی فایل و پوشه
| نماد | روی فایل | روی پوشه |
|---|---|---|
| r (خواندن) | خواندن محتوا | دیدن فهرست فایلها |
| w (نوشتن) | تغییر محتوا | ساخت، حذف و تغییر نام فایلهای داخل |
| x (اجرا) | اجرای فایل بهعنوان برنامه | ورود به پوشه و دسترسی به فایلهای داخل |
نکته مهم: برای پوشهها، x لازم است؛ پوشه بدون x حتی اگر r داشته باشد، قابل استفاده نیست. همچنین حذف یک فایل به دسترسی w روی پوشه بستگی دارد، نه خود فایل.
حالت عددی: ۶۴۴ و ۷۵۵
هر دسترسی یک عدد دارد: r=۴، w=۲، x=۱. مجموع آنها برای هر دسته یک رقم میسازد:
| عدد | نماد | کاربرد رایج |
|---|---|---|
| 644 | rw-r–r– | فایلهای معمولی سایت |
| 755 | rwxr-xr-x | پوشهها و اسکریپتهای اجرایی |
| 600 | rw——- | فایلهای محرمانه؛ کلید SSH، فایل env |
| 640 | rw-r—– | فایل پیکربندی که فقط مالک و گروه وبسرور بخوانند |
| 700 | rwx—— | پوشه شخصی؛ مثل ~/.ssh |
| 777 | rwxrwxrwx | همه چیز برای همه؛ تقریباً هرگز استفاده نکنید |
تغییر دسترسی با chmod
chmod 644 index.php # حالت عددی
chmod 600 .env
chmod u+x deploy.sh # افزودن اجرا برای مالک
chmod g-w config.php # حذف نوشتن برای گروه
chmod -R 755 public/ # بازگشتی (با احتیاط)
از chmod -R با یک عدد برای فایلها و پوشهها با هم پرهیز کنید؛ فایلها و پوشهها دسترسی متفاوت لازم دارند. روش درست با find:
find /var/www/site -type d -exec chmod 755 {} \;
find /var/www/site -type f -exec chmod 644 {} \;
تغییر مالک با chown
sudo chown deploy file.txt # تغییر مالک
sudo chown deploy:www-data file.txt # مالک و گروه
sudo chown -R deploy:www-data /var/www/site
sudo usermod -aG www-data deploy # افزودن کاربر به گروه
تغییر مالکیت به کاربر دیگر فقط با دسترسی مدیر ممکن است. پس از افزودن کاربر به گروه، یک بار خارج و دوباره وارد شوید.
دسترسی درست برای سایت
یک الگوی امن برای سایتهای PHP مثل وردپرس روی VPS:
- فایلها متعلق به یک کاربر استقرار (مثلاً
deploy) با گروهwww-data. - پوشهها ۷۵۵ و فایلها ۶۴۴؛ وبسرور میخواند اما نمینویسد.
- فقط پوشههایی که برنامه باید در آنها بنویسد (مثل
wp-content/uploadsیا پوشه کش) برای گروه قابل نوشتن (۷۷۵) باشند. wp-config.phpیا فایل.envبا ۶۴۰ یا ۶۰۰، بسته به کاربری که باید آن را بخواند.- اجرای PHP را در پوشه uploads غیرفعال کنید؛ توضیح در امنیت وردپرس.
با این الگو، اگر مهاجم از طریق یک افزونه آسیبپذیر کد اجرا کند، نمیتواند فایلهای اصلی سایت را تغییر دهد. اما بهروزرسانی خودکار وردپرس از پیشخوان هم به نوشتن نیاز دارد؛ در این حالت بهروزرسانی را با WP-CLI و کاربر deploy انجام دهید. در هاستهای cPanel، فایلها به نام کاربر خود حساب هستند و همان ۶۴۴ و ۷۵۵ کافی است.
اگر پس از انتقال سایت با خطای ۵۰۰ یا ۴۰۳ روبهرو شدید، دسترسیها اولین جای بررسی است؛ راهنما در رفع خطای ۵۰۰.
دسترسیهای ویژه و umask
- setgid روی پوشه (
chmod g+s dir): فایلهای جدید گروه پوشه را به ارث میبرند؛ برای پوشههای مشترک تیمی مفید است. - sticky bit (
chmod +t dir): هر کاربر فقط فایلهای خودش را میتواند حذف کند؛ مثل/tmp. - setuid: برنامه با دسترسی مالک اجرا میشود؛ روی فایلهای خودتان استفاده نکنید.
- umask: دسترسی پیشفرض فایلهای جدید را تعیین میکند؛ umask رایج
022فایلها را ۶۴۴ و پوشهها را ۷۵۵ میسازد.
سوالات متداول
چرا ۷۷۷ خطرناک است؟
یعنی هر کاربر و هر فرایند روی سرور میتواند فایل را تغییر دهد یا در پوشه فایل اجرایی بگذارد. اگر یک بخش سایت آسیبپذیر باشد، مهاجم راحتتر کد مخرب کار میگذارد. بهجای ۷۷۷، مالک یا گروه را درست تنظیم کنید.
با sudo هم Permission denied میگیرم؛ چرا؟
اگر از sudo echo ... > file استفاده میکنید، هدایت خروجی با کاربر خودتان انجام میشود. از echo ... | sudo tee file استفاده کنید. همچنین فایلسیستم ممکن است فقطخواندنی باشد یا فایل ویژگی immutable داشته باشد.
دسترسی ۶۰۰ برای کلید SSH چرا لازم است؟
کلاینت SSH کلید خصوصیای را که دیگران بتوانند بخوانند، رد میکند. پوشه ~/.ssh باید ۷۰۰ و فایلهای کلید و authorized_keys ۶۰۰ باشند. نکات بیشتر در سختسازی SSH.
ACL چیست و کی لازم است؟
ACL اجازه میدهد برای کاربران یا گروههای بیشتری دسترسی جداگانه تعریف کنید (setfacl). وقتی مدل مالک/گروه/دیگران کافی نیست، مثلاً چند تیم با دسترسی متفاوت روی یک پوشه، کاربرد دارد.
سرور امن با پیکربندی درست
برای راهاندازی سایت روی سرور مجازی تراست هاست با دسترسیها و کاربران درست، از خدمات مدیریت سرور کمک بگیرید.