دستورات chmod و chown در لینوکس؛ آموزش مدیریت Permission فایلها
مقدمه:
دستورات chmod و chown در لینوکس برای مدیریت Permission فایلها و پوشهها به کار میروند، اما وظیفه یکسانی ندارند. chmod مجوز خواندن، نوشتن و اجرا را تغییر میدهد؛ درحالیکه chown مالک و گروه فایل را مشخص میکند. برای استفاده ایمن از این فرمانها باید ابتدا مجوز فعلی، مالک فایل، نوع مسیر و نیاز واقعی سرویس را بررسی کرد. اجرای بازگشتی یا تنظیم عمومی 777 بدون ارزیابی میتواند امنیت و عملکرد سرور را مختل کند.
فهرست مطالب
- Permission در لینوکس چیست؟
- تفاوت chmod و chown
- مشاهده مجوز و مالکیت فایلها
- آموزش حالت عددی chmod
- آموزش حالت نمادین chmod
- تغییر مالک و گروه با chown
- استفاده امن از گزینه Recursive
- تنظیم Permission فایلهای سایت
- مجوزهای ویژه لینوکس
- رفع خطاهای رایج
- چکلیست مدیریت امن مجوزها
- جمعبندی و سؤالات متداول
Permission در لینوکس چیست؟
لینوکس برای کنترل دسترسی به هر فایل یا پوشه، سه گروه کاربری در نظر میگیرد:
- User یا Owner: مالک اصلی فایل
- Group: اعضای گروهی که فایل به آن تعلق دارد
- Others: سایر کاربران سیستم
برای هرکدام از این گروهها میتوان سه مجوز اصلی تعریف کرد:
| مجوز | نماد | مقدار عددی | مفهوم برای فایل | مفهوم برای پوشه |
|---|---|---|---|---|
| Read | r |
4 | مشاهده محتوای فایل | مشاهده نام محتویات پوشه |
| Write | w |
2 | تغییر محتوای فایل | ایجاد، حذف یا تغییر ورودیهای پوشه |
| Execute | x |
1 | اجرای فایل | ورود و دسترسی به مسیرهای داخل پوشه |
مفهوم x برای پوشه با فایل متفاوت است. مجوز Execute روی پوشه امکان عبور یا جستوجوی مسیر را فراهم میکند؛ بنابراین ممکن است کاربر نام فایل را بداند، اما بدون x نتواند به آن دسترسی پیدا کند.
اگر یک سرویس وب، پنل یا برنامه بهدلیل مجوزهای اشتباه اجرا نمیشود، تغییر تصادفی Permission میتواند مشکل را گستردهتر کند. برای بررسی مالکیت و دسترسی مسیرهای سرور میتوانید از کارشناسان شرکت تجارت الکترونیک نوژن مشاوره فنی دریافت کنید.
تفاوت chmod و chown در لینوکس
chmod از عبارت Change Mode گرفته شده و بیتهای مربوط به دسترسی فایل یا پوشه را تغییر میدهد. chown نیز مخفف Change Owner است و مالک یا گروه فایل را تغییر میدهد.
| فرمان | چه چیزی را تغییر میدهد؟ | نمونه |
|---|---|---|
chmod |
مجوزهای خواندن، نوشتن و اجرا | chmod 640 config.php |
chown |
مالک و گروه فایل | chown user:group config.php |
chgrp |
فقط گروه فایل | chgrp developers config.php |
stat |
نمایش اطلاعات دقیق فایل | stat config.php |
ls -l |
نمایش خلاصه Permission و مالکیت | ls -l config.php |
اگر کاربر مالک فایل باشد اما مجوز نوشتن نداشته باشد، احتمالاً باید chmod بررسی شود. اگر فایل متعلق به کاربر یا سرویس اشتباهی باشد، موضوع به chown مربوط است.
برای مشاهده سرویسهای سرور مجازی لینوکس و راهکارهای مدیریت زیرساخت میتوانید خدمات شرکت تجارت الکترونیک نوژن را بررسی کنید. انتخاب سرویس مدیریتشده یا مدیریتنشده باید بر اساس تجربه تیم شما در مدیریت دسترسیها و امنیت لینوکس انجام شود.
مطالعه بیشتر: خرید سرور مجازی لینوکس
مشاهده Permission و مالکیت فایلها
پیش از هر تغییر، وضعیت فعلی فایل یا پوشه را مشاهده کنید:
ls -l filename
یک خروجی نمونه میتواند چنین ساختاری داشته باشد:
-rw-r----- 1 nojen web 2048 Oct 29 10:30 filename
بخش اول خروجی، نوع و مجوزهای مسیر را نشان میدهد:
-rw-r-----
کاراکتر اول نوع مسیر را مشخص میکند:
-فایل معمولیdپوشهlپیوند نمادین یا Symbolic Link
نه کاراکتر بعدی در سه مجموعه قرار میگیرند:
rw- r-- ---
rw-مجوز مالکr--مجوز گروه---مجوز سایر کاربران
در مثال بالا، مالک اجازه خواندن و نوشتن دارد، گروه فقط میتواند فایل را بخواند و دیگران هیچ دسترسی ندارند.
برای مشاهده اطلاعات دقیقتر از stat استفاده کنید:
stat filename
برای نمایش مجوز عددی همراه با نام مالک و گروه:
stat -c '%a %U %G %n' filename
نمونه خروجی:
640 nojen web filename
مطالعه بیشتر: آموزش اتصال به سرور لینوکس با SSH
آموزش دستور chmod در لینوکس
ساختار اصلی فرمان chmod چنین است:
chmod MODE FILE
مقدار MODE را میتوان بهصورت عددی یا نمادین وارد کرد. طبق راهنمای GNU، این فرمان بیتهای حالت فایل را بر اساس نمایش نمادین یا مقدار هشتهشتی تغییر میدهد. Linux manual page
اگر فایل متعلق به حساب دیگری باشد، ممکن است به دسترسی مدیریتی نیاز داشته باشید:
sudo chmod MODE FILE
استفاده از sudo باید فقط در صورت نیاز و پس از بررسی دقیق مسیر انجام شود.
آموزش Permission عددی در chmod
در روش عددی، هر مجوز مقدار مشخصی دارد:
- خواندن یا
rبرابر 4 - نوشتن یا
wبرابر 2 - اجرا یا
xبرابر 1
برای ساخت عدد هر گروه، مقدار مجوزهای موردنیاز را با یکدیگر جمع میکنیم:
| Permission | محاسبه | مقدار |
|---|---|---|
--- |
0 | 0 |
--x |
1 | 1 |
-w- |
2 | 2 |
-wx |
2+1 | 3 |
r-- |
4 | 4 |
r-x |
4+1 | 5 |
rw- |
4+2 | 6 |
rwx |
4+2+1 | 7 |
سه رقم نهایی بهترتیب متعلق به مالک، گروه و سایر کاربران هستند.
مثال Permission برابر 644
chmod 644 document.txt
مقدار 644 یعنی:
- مالک: خواندن و نوشتن
- گروه: فقط خواندن
- دیگران: فقط خواندن
نمایش نمادین آن چنین است:
rw-r--r--
مثال Permission برابر 755
chmod 755 script.sh
این مقدار یعنی:
- مالک: خواندن، نوشتن و اجرا
- گروه: خواندن و اجرا
- دیگران: خواندن و اجرا
نمایش نمادین:
rwxr-xr-x
مثال Permission برابر 750
chmod 750 private-script.sh
در این حالت مالک دسترسی کامل دارد، اعضای گروه میتوانند فایل را بخوانند و اجرا کنند و سایر کاربران دسترسی ندارند.
مثال Permission برابر 600
chmod 600 private-key
این تنظیم فقط به مالک اجازه خواندن و نوشتن میدهد. برای فایلهای حساس مانند برخی کلیدهای خصوصی یا فایلهای دارای اطلاعات محرمانه، چنین سطحی ممکن است مناسب باشد؛ اما باید با نیاز برنامه هماهنگ شود.
چرا استفاده از chmod 777 خطرناک است؟
فرمان زیر به مالک، گروه و سایر کاربران اجازه کامل خواندن، نوشتن و اجرا میدهد:
chmod 777 filename
این تنظیم معمولاً راهکار مناسبی برای رفع خطا نیست. اگر یک برنامه فقط به دسترسی نوشتن برای کاربر یا گروه سرویس نیاز داشته باشد، دادن مجوز نوشتن به تمام کاربران سطح حمله را افزایش میدهد.
بهجای 777 ابتدا این موارد را بررسی کنید:
- پردازش برنامه با چه کاربری اجرا میشود؟
- مالک فعلی فایل یا پوشه چه کسی است؟
- آیا افزودن کاربر سرویس به یک گروه مشترک کافی است؟
- آیا فقط یک مسیر خاص به دسترسی نوشتن نیاز دارد؟
- آیا ACL برای نیاز پیچیدهتر گزینه مناسبتری است؟
استفاده از Permission باز ممکن است خطا را ظاهراً برطرف کند، اما علت اصلی یعنی مالکیت یا طراحی نادرست دسترسی را پنهان میکند.
آموزش حالت نمادین chmod
حالت نمادین به شما اجازه میدهد فقط بخش موردنظر مجوز را تغییر دهید و سایر بخشها را حفظ کنید.
ساختار کلی آن چنین است:
WHO OPERATOR PERMISSION
بخش WHO مشخص میکند تغییر برای چه کسی اعمال شود:
uمالکgگروهoدیگرانaهمه
عملگرها نیز عبارتاند از:
+افزودن مجوز-حذف مجوز=تعیین دقیق مجوز
راهنمای GNU ساختار حالت نمادین را بهصورت ترکیبی از ugoa، یکی از عملگرهای +، - یا = و مجوزهای مربوط تعریف میکند. gnu.org
افزودن مجوز اجرا برای مالک
chmod u+x deploy.sh
حذف مجوز نوشتن از سایر کاربران
chmod o-w shared.txt
افزودن خواندن و نوشتن برای گروه
chmod g+rw project.log
تعیین دقیق مجوز مالک
chmod u=rw config.ini
این دستور مجوز مالک را دقیقاً روی خواندن و نوشتن قرار میدهد و مجوز اجرای او را حذف میکند.
اعمال چند تغییر همزمان
chmod u=rw,g=r,o= document.txt
در این مثال مالک اجازه خواندن و نوشتن دارد، گروه فقط میتواند بخواند و سایر کاربران هیچ دسترسی ندارند.
حالت نمادین زمانی مناسب است که نمیخواهید تمام Permission را بازنویسی کنید. برای نمونه، chmod g+w فقط مجوز نوشتن گروه را اضافه میکند.
آموزش دستور chown در لینوکس
ساختار اصلی chown به شکل زیر است:
chown OWNER FILE
برای تغییر همزمان مالک و گروه:
chown OWNER:GROUP FILE
طبق مستندات این فرمان، اگر فقط مالک مشخص شود گروه تغییر نمیکند. اگر مالک و گروه با علامت دونقطه تعیین شوند، هر دو بخش تغییر خواهند کرد. Linux manual page
تغییر مالک فایل
sudo chown nojen document.txt
این دستور مالک فایل را به nojen تغییر میدهد و گروه موجود را حفظ میکند.
تغییر مالک و گروه
sudo chown nojen:developers document.txt
اکنون مالک nojen و گروه developers خواهد بود.
تغییر فقط گروه با chown
sudo chown :developers document.txt
همچنین میتوانید از chgrp استفاده کنید:
sudo chgrp developers document.txt
استفاده از مالکیت یک فایل مرجع
اگر میخواهید مالکیت یک فایل با فایل دیگری یکسان شود:
sudo chown --reference=reference.txt target.txt
برای Permission مشابه نیز میتوان از این روش استفاده کرد:
chmod --reference=reference.txt target.txt
استفاده بازگشتی از chmod و chown
گزینه -R تغییر را روی پوشه و محتویات زیرمجموعه آن اعمال میکند:
sudo chown -R nojen:developers /srv/project
یا:
sudo chmod -R 755 /srv/project
دستور دوم معمولاً انتخاب دقیقی نیست؛ زیرا فایلها و پوشهها نیاز یکسانی به Execute ندارند. اعمال 755 به همه فایلها، بسیاری از فایلهای عادی را بیدلیل اجرایی میکند.
گزینه بازگشتی میتواند تعداد زیادی فایل را در چند ثانیه تغییر دهد. قبل از اجرا:
ls -ld /srv/project
find /srv/project -maxdepth 2 -ls
مسیر را دقیق بررسی کنید. از اجرای فرمان بازگشتی روی /، مسیرهای سیستمی یا متغیرهای نامشخص خودداری کنید.
راهنمای GNU هشدار میدهد ترکیب پیمایش بازگشتی با دنبالکردن Symbolic Linkها میتواند خطر امنیتی ایجاد کند؛ زیرا پیوند ممکن است عملیات را به یک هدف خارج از درخت موردنظر هدایت کند. gnu.org
پیشنمایش تغییر مالکیت
برای مشاهده فایلهایی که مالک فعلی مشخصی دارند:
find /srv/project -user olduser -print
پس از بررسی خروجی، میتوان تغییر محدودتری انجام داد:
sudo find /srv/project -user olduser -exec chown newuser:developers {} +
این روش فقط فایلهای متعلق به olduser را تغییر میدهد و از تغییر بیدلیل سایر فایلها جلوگیری میکند.
تنظیم جداگانه Permission فایلها و پوشهها
پوشهها معمولاً برای پیمایش به مجوز x نیاز دارند، اما فایلهای متنی عادی نباید بیدلیل اجرایی شوند. به همین دلیل بهتر است Permission فایل و پوشه جداگانه تنظیم شود.
برای نمونه، اگر نیاز پروژه با این سطوح دسترسی سازگار باشد:
find /srv/project -type d -exec chmod 755 {} +
find /srv/project -type f -exec chmod 644 {} +
این اعداد نسخه عمومی و قطعی برای همه پروژهها نیستند. اگر گروه توسعه باید فایلها را ویرایش کند، برنامه فایل محرمانه داشته باشد یا سرویس وب با کاربر دیگری اجرا شود، تنظیم مناسب متفاوت خواهد بود.
روش نمادین زیر در برخی سناریوها ایمنتر است:
chmod -R u=rwX,g=rX,o= /srv/project
حرف بزرگ X فقط در شرایط مرتبط، مانند پوشهها یا فایلهایی که قبلاً اجرایی بودهاند، Execute را اعمال میکند. این موضوع مانع اجراییشدن بیدلیل تمام فایلهای عادی میشود.
[لینک داخلی پیشنهادی: انکرتکست «آموزش ساخت User و دادن دسترسی Sudo در Ubuntu» ← مقاله مدیریت کاربران Ubuntu]
مثال مدیریت Permission فایلهای یک وبسایت
فرض کنید فایلهای یک سایت در مسیر زیر قرار دارند:
/var/www/example
ابتدا وضعیت مالکیت و مجوز را بررسی کنید:
sudo ls -la /var/www/example
sudo stat /var/www/example
سپس باید مشخص کنید چه کسی سایت را مدیریت میکند و سرویس وب با چه کاربری اجرا میشود. نام کاربر سرویس در همه سرورها یکسان نیست و نباید بدون بررسی، مالکیت تمام پروژه به یک نام عمومی تغییر داده شود.
یک ساختار قابل بررسی میتواند شامل این موارد باشد:
- مالک فایلها: کاربر مسئول استقرار
- گروه فایلها: گروه مشترک پروژه یا وبسرور
- فایلهای عمومی: فقط خواندنی برای سرویس
- پوشه آپلود یا کش: قابل نوشتن برای پردازش مربوط
- فایلهای تنظیمات حساس: محدودتر از فایلهای عمومی
بهجای بازکردن تمام پروژه، فقط مسیرهای نیازمند نوشتن را تنظیم کنید. برای مثال، اگر یک پوشه مشخص باید برای گروه پروژه قابل نوشتن باشد:
sudo chown -R deploy:projectgroup /var/www/example/storage
sudo chmod -R u=rwX,g=rwX,o= /var/www/example/storage
نام کاربران، گروه و مسیر صرفاً نمونه هستند. پیش از اجرا، آنها را با ساختار واقعی سرور هماهنگ کنید.
مطالعه بیشتر: امنیت سرور لینوکس بعد از راهاندازی
مجوزهای ویژه در لینوکس
علاوه بر rwx، سه بیت ویژه نیز وجود دارد:
Setuid
Setuid روی برخی فایلهای اجرایی باعث میشود برنامه با شناسه مؤثر مالک فایل اجرا شود. استفاده نادرست از آن میتواند پیامد امنیتی جدی داشته باشد و نباید بدون شناخت برنامه فعال شود.
نمایش عددی آن با رقم ابتدایی 4 انجام میشود:
chmod 4755 executable
این دستور فقط یک نمونه آموزشی است و نباید روی برنامههای ناشناس اجرا شود.
Setgid
Setgid روی فایل اجرایی به گروه فایل مربوط است. روی یک پوشه میتواند باعث شود فایلها و پوشههای جدید، گروه مسیر والد را به ارث ببرند.
برای یک پوشه اشتراکی تیمی:
sudo chmod g+s /srv/shared-project
سپس گروه و Permission مسیر باید متناسب با اعضای تیم تنظیم شوند.
Sticky Bit
Sticky Bit روی یک پوشه اشتراکی باعث میشود کاربران معمولاً فقط فایلهای متعلق به خود یا مسیر را حذف کنند. نمونه شناختهشده این رفتار در پوشههایی مانند /tmp دیده میشود. Linux manual page
تنظیم نمادین آن:
chmod +t shared-directory
این مجوز نیز باید بر اساس سناریوی واقعی استفاده شود و جایگزین طراحی صحیح گروهها نیست.
نقش umask در Permission فایلهای جدید
umask تعیین میکند هنگام ایجاد فایل یا پوشه، کدام مجوزها از حالت پایه حذف شوند. برای مشاهده مقدار فعلی:
umask
برای نمایش نمادین:
umask -S
chmod مجوز مسیر موجود را تغییر میدهد، اما umask روی مجوز اولیه فایلها و پوشههای جدید اثر میگذارد. اگر فایلهای جدید دائماً با Permission نامناسب ساخته میشوند، ممکن است مشکل از umask، تنظیم سرویس یا روش استقرار باشد؛ نه فایلهای موجود.
رفع خطاهای رایج Permission در لینوکس
خطای Permission denied
ابتدا تمام اجزای مسیر را بررسی کنید:
namei -l /path/to/file
ممکن است خود فایل مجوز کافی داشته باشد، اما یکی از پوشههای والد فاقد مجوز Execute باشد. سپس مالکیت و Permission فایل را مشاهده کنید:
ls -l /path/to/file
stat /path/to/file
خطای Operation not permitted در chown
تغییر مالک فایل معمولاً به دسترسی مدیریتی نیاز دارد:
sudo chown user:group filename
اگر حتی Root نیز نمیتواند فایل را تغییر دهد، عواملی مانند فایلسیستم فقطخواندنی، ویژگی Immutable، Mount خاص یا محدودیت محیط کانتینری باید بررسی شوند.
تغییرات chmod اثر مورد انتظار ندارد
موارد زیر را بررسی کنید:
- مسیر موردنظر Symbolic Link نباشد.
- برنامه از ACLهای اضافه استفاده نکرده باشد.
- فایلسیستم از Permissionهای POSIX پشتیبانی کند.
- سرویس با کاربر مورد انتظار اجرا شود.
- SELinux یا AppArmor محدودیت دیگری ایجاد نکرده باشد.
- فایل روی یک Mount خارجی با تنظیمات متفاوت قرار نداشته باشد.
پس از chown سایت از دسترس خارج شده است
احتمالاً سرویس وب دیگر به فایلها یا پوشههای لازم دسترسی ندارد. مالک و گروه قبلی را از بکاپ، فایل مرجع یا مستندات سرویس پیدا کنید.
تغییر مالکیت کل مسیر به کاربر وبسرور همیشه راهکار مناسبی نیست؛ زیرا ممکن است توانایی تغییر فایلهای برنامه را بیش از نیاز سرویس افزایش دهد.
اسکریپت اجرا نمیشود
ابتدا Permission را بررسی کنید:
ls -l script.sh
در صورت اطمینان از محتوای فایل، مجوز اجرا را برای مالک اضافه کنید:
chmod u+x script.sh
وجود مجوز Execute بهتنهایی کافی نیست. Shebang، مسیر مفسر، فرمت خطهای فایل و گزینه noexec روی Mount نیز ممکن است مانع اجرا شوند.
مطالعه بیشتر: آموزش تغییر پورت SSH در Ubuntu
مطالعه بیشتر: نصب Fail2ban برای محافظت از SSH
چکلیست مدیریت امن Permission فایلها
- مسیر دقیق با
lsیاrealpathبررسی شده است. - مجوز و مالکیت فعلی ثبت شده است.
- از فایلها یا تنظیمات حساس نسخه پشتیبان وجود دارد.
- کاربر اجراکننده سرویس مشخص شده است.
- از
chmod 777بهعنوان راهکار سریع استفاده نشده است. - گزینه
-Rفقط پس از بررسی زیرپوشهها استفاده میشود. - Permission فایلها و پوشهها جداگانه تنظیم میشود.
- Symbolic Linkهای مسیر پیش از عملیات بازگشتی بررسی شدهاند.
- دسترسی نوشتن فقط به کاربران یا گروههای ضروری داده شده است.
- Setuid، Setgid و Sticky Bit بدون ضرورت فعال نشدهاند.
- پس از تغییر، سایت یا سرویس مربوط آزمایش شده است.
- نتیجه نهایی با
statوls -lکنترل شده است.
جمع بندی
در موضوع «دستورات chmod و chown در لینوکس، آموزش مدیریت Permission فایلها»، مهمترین نکته شناخت تفاوت مجوز و مالکیت است. chmod سطح خواندن، نوشتن و اجرا را تعیین میکند؛ درحالیکه chown مالک و گروه فایل یا پوشه را تغییر میدهد.
پیش از هر تغییر، خروجی ls -l و stat را بررسی کنید. در عملیات بازگشتی نیز فایلها، پوشهها و Symbolic Linkها را جداگانه در نظر بگیرید تا تغییر ناخواسته به مسیرهای دیگر سرایت نکند.
Permission مناسب یک عدد ثابت برای همه سایتها و برنامهها نیست. ساختار کاربران، گروهها، نوع سرویس و نیاز نوشتن در هر پروژه تعیین میکند چه مجوزی مناسب است. بهجای بازکردن دسترسی عمومی، حداقل مجوز لازم را اعمال کنید.
اگر مجوزهای اشتباه باعث اختلال سایت، وبسرور یا سرویسهای لینوکسی شدهاند، میتوانید برای بررسی مالکیت مسیرها، امنیت دسترسی و پشتیبانی زیرساخت با شرکت تجارت الکترونیک نوژن تماس بگیرید.
سؤالات متداول
تفاوت chmod و chown چیست؟
chmod مجوزهای خواندن، نوشتن و اجرای فایل را تغییر میدهد. chown برای تغییر مالک یا گروه فایل و پوشه استفاده میشود.
Permission عددی 755 چه معنایی دارد؟
مالک اجازه خواندن، نوشتن و اجرا دارد. گروه و سایر کاربران فقط اجازه خواندن و اجرا خواهند داشت.
Permission عددی 644 برای چیست؟
در 644، مالک میتواند فایل را بخواند و تغییر دهد، اما گروه و دیگران فقط اجازه خواندن دارند. مناسببودن آن به نوع فایل و ساختار سرویس بستگی دارد.
آیا استفاده از chmod 777 درست است؟
در بیشتر سناریوها خیر. این مقدار به همه کاربران اجازه کامل میدهد و میتواند خطر امنیتی ایجاد کند. بهتر است مالکیت و نیاز واقعی سرویس بررسی شود.
چگونه مالک یک پوشه و همه محتویات آن را تغییر دهیم؟
میتوان از chown -R USER:GROUP DIRECTORY استفاده کرد. قبل از اجرا، مسیر و Symbolic Linkهای موجود را دقیق بررسی کنید.
چرا فایل Permission مناسب دارد اما باز هم قابل دسترسی نیست؟
ممکن است یکی از پوشههای والد مجوز Execute نداشته باشد یا ACL، AppArmor، SELinux، تنظیمات Mount یا مالکیت مسیر مانع دسترسی شود.
آیا فایلها و پوشهها باید Permission یکسان داشته باشند؟
خیر. پوشهها برای پیمایش به x نیاز دارند، اما فایلهای عادی معمولاً نباید بیدلیل اجرایی شوند. بهتر است مجوز آنها جداگانه تنظیم شود.
