در این درس میخوانید
وقتی فرمانی Permission denied نشان میدهد، سیستم میگوید حساب فعلی اجازهٔ انجام آن کار را در آن مسیر ندارد. پیش از تغییر هرچیز، باید بدانید با چه حسابی کار میکنید، صاحب فایل کیست و چه مجوزی لازم است. درس پنجم این سه پرسش را روشن میکند. تمرینهای عملی فقط روی فایلهای ساختهشده در خانهٔ خود کاربر انجام میشوند و تنظیم حسابهای واقعی سرور را تغییر نمیدهند.
حساب کاربری و گروه چه هستند؟
هر فرایند با یک هویت و مجموعهای از مجوزها اجرا میشود. سیستم برای حسابها شناسهٔ عددی UID و برای گروهها GID دارد. گروه، راهی برای دادن دسترسی مشترک به چند حساب است. نام نمایشی کاربر بهتنهایی تمام داستان نیست؛ شناسه و عضویت گروه اهمیت دارند. با فرمانهای زیر حساب و گروههای فعلی را ببینید. خروجی شما به نحوهٔ ساخت محیط وابسته است و قرار نیست با یک تصویر نمونه برابر باشد.
whoami
id
groupsroot چیست و sudo چه میکند؟
حساب مدیریتی رایج Linux نام root و UID برابر صفر دارد و اختیار گستردهای روی سیستم دارد. برای کار روزمره معمولاً از حساب عادی استفاده میکنیم. sudo طبق سیاست سیستم به یک حساب اجازه میدهد فرمانی را با هویت مجاز دیگری اجرا کند؛ کاربرد رایج، اجرای یک فرمان مدیریتی است. وجود واژهٔ sudo جلوی یک دستور، درستبودن خود دستور یا امنبودن فایل دریافتی را تضمین نمیکند.
اگر sudo رمز خواست، معمولاً رمز حساب فعلی لازم است، مگر سیاست سیستم متفاوت باشد. هنگام تایپ ممکن است چیزی دیده نشود. ورود به یک پوستهٔ مدیریتیِ ماندگار با اجرای یک فرمان محدود یکسان نیست؛ در آن پوسته، فرمانهای بعدی هم اختیار گسترده دارند. برای دیدن مجوزهای تعریفشدهٔ حساب خود، sudo -l میتواند مفید باشد؛ خروجی و نیاز به رمز به تنظیم سیستم بستگی دارد.
مجوز فایل را بخوانید
در مدل پایه، مجوزها برای صاحب فایل یا owner، گروه یا group و دیگران یا others تعریف میشوند. r یعنی خواندن، w یعنی نوشتن و x برای فایل معمولاً اجازهٔ اجراست. مثلاً -rw-r----- نشان میدهد صاحب میتواند بخواند و بنویسد، گروه فقط بخواند و دیگران دسترسی ندارند. مالکیت و مجوز دو ویژگی مرتبط اما متفاوتاند؛ chmod مجوز را تغییر میدهد و تغییر صاحب، کار دیگری است.
mkdir -p ~/darsavand-lab/permissions
cd ~/darsavand-lab/permissions
echo "practice" > notes.txt
ls -l notes.txtعددهای 600، 644 و 700 از کجا میآیند؟
- r ارزش 4، w ارزش 2 و x ارزش 1 دارد.
- 6 یعنی خواندن و نوشتن؛ 4 یعنی فقط خواندن؛ 7 یعنی هر سه.
- 600 برای فایل: صاحب خواندن و نوشتن دارد، گروه و دیگران ندارند.
- 644 برای فایل: صاحب خواندن و نوشتن، گروه و دیگران خواندن دارند.
- 700 برای پوشه: در مدل پایه فقط صاحب اجازهٔ ورود، فهرست و تغییر دارد.
این عددها نسخهٔ همیشگی برای همهٔ فایلها نیستند. فایل عمومی وب، کلید خصوصی و پوشهٔ مشترک نیازهای متفاوت دارند. فقط مجوز لازم را بدهید و صاحب درست را بررسی کنید. دادن 777 به یک مسیر، دسترسی بسیار گستردهای میدهد و معمولاً علت اصلی خطا را بررسی نمیکند. علاوه بر این مدل، ACL یا سازوکارهای امنیتی مانند AppArmor و SELinux هم ممکن است روی دسترسی اثر بگذارند.
chmod را روی فایل تمرینی اجرا کنید
chmod u=rw,go= notes.txt
ls -l notes.txt
# انتظار مدل پایه: -rw-------
mkdir -p private
chmod 700 private
ls -ld privateدر شکل نمادین، u به صاحب، g به گروه و o به دیگران اشاره میکند. در دستور نخست، فقط خواندن و نوشتنِ صاحب باقی میماند. در مثال پوشه، -d باعث میشود خود پوشه بررسی شود، نه محتوای آن. اگر اجازهٔ تغییر مجوز نداشتید، ابتدا مالکیت را ببینید؛ برای فایل متعلق به خودتان در محیط تمرین عادی، نیازی به حساب root نیست.
مجوز پوشه با فایل فرق دارد
برای پوشه، r بیشتر به امکان فهرستکردن نامها، x به عبور و دسترسی از مسیر و w به تغییر ورودیهای پوشه مربوط است. به همین دلیل، دسترسی به یک فایل فقط به بیتهای خود فایل وابسته نیست؛ مجوز پوشههای مسیر نیز مهم است. امکان حذف یک نام فایل هم به مجوزهای پوشهٔ والد و قواعدی مانند sticky bit مربوط میشود. فعلاً کافی است هنگام خطای مسیر، فقط آخرین فایل را بررسی نکنید.
یک روش ساده برای بررسی Permission denied
- با whoami و id هویت خود را بررسی کنید.
- با pwd مطمئن شوید مسیر درست است.
- با ls -l صاحب، گروه و مجوز فایل را ببینید.
- برای پوشهٔ والد از ls -ld استفاده کنید.
- نیاز واقعی برنامه را مشخص کنید و همان دسترسی محدود را تنظیم کنید.
تمرین و پاسخ
فایل notes.txt را به مجوز 640 تغییر دهید. انتظار چیست؟ صاحب خواندن و نوشتن، گروه فقط خواندن و دیگران هیچکدام. سپس تفاوت این فایل با پوشهٔ 700 را توضیح دهید: x برای پوشه نقش عبور دارد و نبود آن میتواند دسترسی به مسیر را محدود کند. اگر ls -l نام گروه را نشان داد، آیا همهٔ اعضای آن گروه میتوانند فایل را تغییر دهند؟ در 640 خیر، چون بخش گروه فقط خواندن دارد.
chmod 640 notes.txt
ls -l notes.txt
ls -ld privateمنابع انگلیسی
- Ubuntu — User management
- https://ubuntu.com/server/docs/how-to/security/user-management/
- sudo — Manual
- https://www.sudo.ws/docs/man/sudo.man/
- GNU — Setting permissions
- https://www.gnu.org/software/coreutils/manual/html_node/Setting-Permissions.html
مثالها و تمرینها برای این مجموعه تدوین شدهاند. در درس بعد، اتصال امن به حساب روی یک سرور راه دور را با SSH میشناسیم.
پیشنیاز و محیط اجرای مثالها
درس 5 از ۱۰ در مسیر مقدماتی لینوکس و مفاهیم سرور. محیط Linux آزمایشی و پوشهٔ خانهٔ خودتان کافی است. تمرین chmod روی فایل و پوشهٔ ساختهشده در همین درس انجام میشود؛ برای آن به sudo نیاز ندارید.
پیشرفت روی همین مرورگر ذخیره میشود.