دستور chmod و chown در لینوکس با مثال

دستور chmod دسترسی فایل‌ها و پوشه‌ها را تعیین می‌کند (چه کسی بخواند، بنویسد یا اجرا کند) و chown مالک و گروه آن‌ها را عوض می‌کند. هر فایل در لینوکس سه دسته دسترسی دارد: مالک (u)، گروه (g) و بقیه (o)، و هر دسته سه حق خواندن (r)، نوشتن (w) و اجرا (x). مقدارهای رایج 644 برای فایل‌ها و 755 برای پوشه‌ها و برنامه‌هاست.

درک درست دسترسی‌ها پایه امنیت و عیب‌یابی سرور است. بسیاری از خطاهای 403 و 500 وب‌سرور، آپلود نشدن فایل در وردپرس و خطای «Permission denied» به همین موضوع برمی‌گردند. دیگر ابزارهای مدیریت کاربر و دسترسی در مدیریت دسترسی در لینوکس آمده و این راهنما روی chmod و chown تمرکز دارد.

خواندن خروجی ls -l

ls -l
-rwxr-xr-- 1 deploy www-data 1240 Oct  5 10:00 script.sh
drwxr-x--- 2 deploy www-data 4096 Oct  5 10:00 private

در ستون اول، حرف اول نوع است (خط تیره برای فایل و d برای پوشه). نه حرف بعدی سه دسته سه‌تایی‌اند: مالک rwx، گروه r-x و بقیه r--. بعد از آن شماره لینک، نام مالک (deploy)، نام گروه (www-data)، اندازه و تاریخ و نام می‌آید. در خط اول، مالک می‌تواند بخواند، بنویسد و اجرا کند، گروه بخواند و اجرا کند، و بقیه فقط بخوانند.

معنی r، w و x

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

برای وارد شدن به پوشه به x نیاز دارید. حذف یک فایل هم به دسترسی نوشتن روی پوشه بستگی دارد و دسترسی خود فایل در آن نقشی ندارد.

دستور chmod با عدد

هر حق یک مقدار دارد: r برابر 4، w برابر 2 و x برابر 1. با جمع آن‌ها، هر دسته یک رقم می‌شود و سه رقم برای مالک، گروه و بقیه نوشته می‌شود:

عددمعنیکاربرد
7rwxهمه حق‌ها
6rw-خواندن و نوشتن
5r-xخواندن و اجرا
4r–فقط خواندن
0—هیچ

حالت‌های رایج:

chmod 644 file.txt      # مالک بخواند و بنویسد، بقیه فقط بخوانند
chmod 755 script.sh     # مالک همه، بقیه بخوانند و اجرا کنند
chmod 600 secret.key    # فقط مالک؛ برای کلید و فایل رمز
chmod 700 private/      # فقط مالک؛ برای پوشه خصوصی

دستور chmod با حرف

به‌جای عدد می‌توانید تغییر را با حرف بنویسید. دسته‌ها u (مالک)، g (گروه)، o (بقیه) و a (همه) هستند و عملگرها + (افزودن)، - (حذف) و = (تعیین دقیق):

chmod u+x script.sh     # مالک اجرا هم بتواند
chmod g-w file.txt      # گروه نتواند بنویسد
chmod o-rwx private/    # بقیه هیچ دسترسی نداشته باشند
chmod a+r readme.txt    # همه بتوانند بخوانند

این روش وقتی فقط یک حق را عوض می‌کنید ساده‌تر و ایمن‌تر است، چون بقیه حق‌ها دست نمی‌خورند.

تغییر بازگشتی

گزینه -R تغییر را روی همه فایل‌ها و زیرپوشه‌ها اعمال می‌کند. دقت کنید که chmod -R 755 روی کل پوشه سایت، همه فایل‌ها را اجرایی می‌کند که لازم و درست نیست. بهتر است پوشه‌ها و فایل‌ها را جدا تنظیم کنید:

find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;

اولی فقط پوشه‌ها و دومی فقط فایل‌ها را تغییر می‌دهد. این کار برای سایت‌های وردپرسی و PHP روش معمول است.

chown: تغییر مالک و گروه

sudo chown deploy file.txt              # فقط مالک
sudo chown deploy:www-data file.txt     # مالک و گروه
sudo chown :www-data file.txt           # فقط گروه
sudo chown -R www-data:www-data /var/www/example.com

فقط root می‌تواند مالک فایل را عوض کند. نام کاربر و گروه وب‌سرور بسته به توزیع فرق دارد: در Debian و Ubuntu برابر www-data و در AlmaLinux و Rocky برای Apache برابر apache و برای Nginx برابر nginx است. نام درست را با ps aux | grep nginx یا grep ^user /etc/nginx/nginx.conf پیدا کنید.

دسترسی مناسب برای سایت و وردپرس

روی وب‌سروری که با کاربر خودش اجرا می‌شود، قاعده معمول این است که فایل‌ها را کاربر دیگری (کاربر دیپلوی) داشته باشد، تا برنامه نتواند کد خودش را عوض کند، و فقط پوشه‌هایی که باید در آن‌ها نوشته شود برای وب‌سرور قابل نوشتن باشند. در وردپرس، پوشه wp-content/uploads باید برای کاربر وب‌سرور قابل نوشتن باشد. فایل wp-config.php را فقط برای مالک و گروه قابل خواندن کنید:

chmod 640 wp-config.php

هرگز سایت یا پوشه‌ای را با 777 رها نکنید. این مقدار به همه کاربران سیستم اجازه نوشتن می‌دهد و در سرور مشترک یا هنگام آسیب‌پذیری یک افزونه، راه آلوده شدن فایل‌هاست. روش پاک‌سازی بعد از آلودگی در رفع هک و پاک‌سازی مالور آمده است. نصب کامل وردپرس همراه با دسترسی‌های درست در راهنمای نصب وردپرس روی اوبونتو هم هست.

بیت‌های ویژه: setuid، setgid و sticky

بیتعدداثر
setuid4000برنامه با دسترسی مالک فایل اجرا می‌شود (مثل passwd)
setgid2000فایل‌های جدید داخل پوشه، گروه همان پوشه را می‌گیرند
sticky1000فقط مالک فایل می‌تواند آن را در پوشه حذف کند (مثل /tmp)

مثال: chmod 2775 /srv/shared پوشه مشترک تیمی می‌سازد که فایل‌های جدید گروه آن را می‌گیرند. بیت setuid روی برنامه‌ها خطرناک است؛ فهرست فایل‌هایی که آن را دارند را گاهی بررسی کنید: find / -perm -4000 -type f 2>/dev/null. فایل ناشناسی که setuid دارد نشانه‌ای است که باید جدی گرفته شود.

umask: دسترسی پیش‌فرض فایل‌های جدید

umask تعیین می‌کند فایل‌ها و پوشه‌های تازه با چه دسترسی ساخته شوند. مقدار رایج 022 به فایل جدید 644 و به پوشه 755 می‌دهد. برای سخت‌گیری بیشتر 027 بگذارید تا بقیه هیچ دسترسی نداشته باشند. مقدار فعلی را umask نشان می‌دهد.

ACL: دسترسی دقیق‌تر

اگر باید به یک کاربر خاص دسترسی دهید و نمی‌خواهید مالک یا گروه را عوض کنید، فهرست کنترل دسترسی (ACL) کمک می‌کند:

sudo apt install acl
sudo setfacl -m u:alice:rx /srv/reports
getfacl /srv/reports

با ACL هر کاربر یا گروه دسترسی جداگانه می‌گیرد. در ls -l وجود ACL با علامت + آخر ستون دسترسی دیده می‌شود.

خطاهای رایج

نشانهعلت و راه حل
Permission denied هنگام اجرای اسکریپتبیت اجرا نیست؛ chmod +x script.sh
Permission denied هنگام ورود به پوشهدسترسی x روی پوشه یا یکی از پوشه‌های بالاتر نیست
403 Forbidden در وب‌سرورکاربر وب‌سرور به فایل یا یکی از پوشه‌های مسیر دسترسی ندارد
وردپرس نمی‌تواند آپلود یا به‌روزرسانی کندپوشه برای کاربر وب‌سرور قابل نوشتن نیست؛ مالکیت را بررسی کنید
chown: changing ownership ... Operation not permittedبدون sudo اجرا شده
فایل را حذف نمی‌توانمحق نوشتن روی پوشه ندارید یا sticky bit مانع است

سوالات متداول

فرق 644 و 755 چیست؟

هر دو مالک را مجاز به خواندن و نوشتن می‌کنند، ولی 755 بیت اجرا را هم برای همه می‌گذارد. برای پوشه‌ها و برنامه‌ها 755 و برای فایل‌های معمولی 644 به کار می‌رود.

777 چه خطری دارد؟

همه کاربران سیستم می‌توانند فایل را بخوانند، بنویسند و اجرا کنند. روی وب‌سرور، آسیب‌پذیری یک افزونه یا کاربر دیگر می‌تواند کد سایت را عوض کند.

چطور بفهمم یک فایل مالکش کیست؟

با ls -l مالک و گروه را می‌بینید و با stat file جزئیات بیشتر.

رمز و کلید خصوصی چه دسترسی داشته باشند؟

فقط مالک: 600 برای فایل و 700 برای پوشه. SSH کلید خصوصی با دسترسی بازتر را اصلاً قبول نمی‌کند.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *