رابط کاربری خط فرمان سفارشی

اخطار: روش ارائه شده در این پست قابل دور خوردن است. روش های دور زدن و مقابله با آنها در نوشتاری دیگر تشریح خواهد شد!حالتی را در نظر بگیرید که بخواهید اجازه دسترسی به رابط کاربری خط فرمان را به کاربری بدهید و در عین حال کاربر تنها مجاز به اجرای برخی فرامین خاص سیستم عامل باشد. برای مثال فرض کنید بخواهید به کاربر تنها اجازه پیکربندی اولیه سیستم را با دستوراتی مثل ifconfig، ip، route، date و … بدهید. برای انجام چنین کاری نیاز به رابط کاربری خط فرمان سفارشی دارید.در این پست یکی از روش های ایجاد رابط کاربری خط فرمان سفارشی (محدود) را تشریح می کنم. انشاالله در پست های بعدی روش های دیگری برای ساخت رابط کاربری خط فرمان سفارشی تر! ارائه خواهد شد. لازم به ذکر است روش ارائه شده در این نوشتار تنها بر روی سیستم عامل لینوکس تست شده است.معرفی rbashنرم افزار rbash گزینه جایگزین حساب کاربری chroot شده است. (chroot چیه؟ بعدا راجع بهش میگم) در واقع rbash همون bash هست با این تفاوت که برخی امکانات shell در اون غیر فعال شده است. برای مثال اگر shell یک کاربر رو rbash قرار بدیم امکان تغییر متغیر محلی PATH رو نخواهد داشت یا از آدرس کامل برای اجرای دستورات نمی تونه استفاده کنه و یا اینکه امکان تغییر مسیر جاری از طریق دستور cd را ندارد.اگر به بخش ۶.۱۰ راهنمای کاربری bash مراجعه کنید، می تونید فهرست محدودیت هایی که rbash برای کاربر ایجاد می کنه رو مشاهده کنید. برخی از محدودیت ها رو اینجا فهرست کردم.تغییر مسیر جاری با دستور cdذخیره و یا حذف مقادیر از متغیرهای SHELL، PATH، ENV و BASH_ENVقرارگیری / (اِسلَش) در نام دستورذخیره خروجی دستور به کمک عملگرهای >, >|, <>, >&, &> و >>استفاده از دستور exec برای جایگزینی shell با یک دستور دیگهخاموش کردن مد محدود شده با set +r و یا set +o restrictedاگر به فهرست کامل موارد غیر فعال شده در rbash نگاهی بیندازید متوجه می شوید کاربر را تا حد زیادی محدود می کنه. با این حال روش های بسیاری وجود دارد تا کاربر از حصار rbash فرار کند! در پست های بعدی به برخی از این روش های اشاره می کنیم.راهنمای کاربری rbashدر این پست برای مساله کانفیگ اولیه سیستم که در مقدمه عنوان شده از روشی استفاده می کنیم که محدودیت بیشتری برای کاربر ایجاد کنه. چون rbash به تنهایی جلوی اجرای دستورات دلخواه توسط کاربر را نمی گیرد. اگر بخواهیم دستوراتی که کاربر قادر به اجرای اون هست رو هم محدود کنیم کار بیشتری باید انجام بشه.راه اندازی rbashابتدا یک لینک از bash ایجاد کنید:# ln -s /bin/bash /bin/rbashکاربر جدیدی ایجاد نمایید. shell مربوط به این کاربر را rbash قرار دهید.# useradd -s /bin/rbash localuserدر صورتی که کاربر از قبل وجود داشت کافی است با دستور زیر bash کاربر را به rbash تغییر دهید. (مستقیما هم می تونید فایل /etc/passwd را ویرایش کنید و shell کاربر مورد نظرتون رو تغییر بدید)# usermod -s /bin/rbash localuserخوب حالا اگر کاربر localuser وارد سیستم بشه rbash براش فعال میشه و محدودیت هایی که گفتیم براش اعمال میشه. مثلا دیگه نمی تونه با cd از پوشه homeش خارج بشه.اعمال محدودیت بیشتر در خط فرمانخوب حالا می خوایم دستوراتی که کاربر میتونه اجرا کنه رو به تعدادی دستور خاص محدود کنیم. در مورد مثال کانفیگ ذکر شده در مقدمه می خوایم دستوراتی مثل ip, ifconfig, route, ping و date رو برای کاربر فعال کنیم.برای این کار در مسیر home کاربر یک پوشه به اسم bin (یا هر اسم دیگه ای) ایجاد می کنیم.# mkdir /home/localuser/binسپس فایل .bash_profile را در مسیر home کاربر ایجاد می کنیم. ( /home/localuser/.bash_profile) و در این فایل مقادیر زیر را می نویسیم:# cat /home/localuser/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$HOME/bin export PATHکلکی که از طریق این فایل زدیم اینه که پوشه bin کاربر رو به همونی که در مسیر homeش ساختیم محدود کردیم. خوب حالا کافیست لینک دستوراتی که میخواید کاربر بتونه اجرا کنه رو در پوشه bin کاربر قرار بدید. یعنی اینطوری:# ln -s /sbin/ifconfig /home/localuser/bin/ # ln -s /bin/ping /home/localuser/bin/ # ln -s /sbin/route /home/localuser/bin/ # ln -s /sbin/ip /home/localuser/bin/ # ln -s /bin/date /home/localuser/bin/خوب اگر کاربر بخواد دستوری که در این لیست نیست رو اجرا کنه با پیام خطای زیر مواجه میشه: (اجرای دستور ls)[localuser@example ~]$ ls -rbash: ls: command not foundبه همین راحتی!فقط یه کار دیگه مونده و اون هم جلوگیری از تغییر فایل .bash_profile توسط خود کاربر هست. با دستور زیر می تونید جلوی تغییر این فایل رو بگیرید.# chattr +i /home/localuser/.bash_profileاگر بعدا خواستید این فایل رو ادیت کنید باید قبلش دستور زیر رو اجرا کنید# chattr -i /home/localuser/.bash_profileهمانطور که قبلا هم گفتم روش ارائه شده در این پست قابل دور خوردن است. ولی شما در شرایطی خاص می تونید جلوی دور خوردنش رو بگیرید. برخی روش های دور زدن در نوشتاری دیگر تشریح خواهد شد!