اخطار: روش ارائه شده در این پست قابل دور خوردن است. روش های دور زدن و مقابله با آنها در نوشتاری دیگر تشریح خواهد شد!
حالتی را در نظر بگیرید که بخواهید اجازه دسترسی به رابط کاربری خط فرمان را به کاربری بدهید و در عین حال کاربر تنها مجاز به اجرای برخی فرامین خاص سیستم عامل باشد. برای مثال فرض کنید بخواهید به کاربر تنها اجازه پیکربندی اولیه سیستم را با دستوراتی مثل ifconfig، ip، route، date و … بدهید. برای انجام چنین کاری نیاز به رابط کاربری خط فرمان سفارشی دارید.
در این پست یکی از روش های ایجاد رابط کاربری خط فرمان سفارشی (محدود) را تشریح می کنم. انشاالله در پست های بعدی روش های دیگری برای ساخت رابط کاربری خط فرمان سفارشی تر! ارائه خواهد شد. لازم به ذکر است روش ارائه شده در این نوشتار تنها بر روی سیستم عامل لینوکس تست شده است.
نرم افزار rbash گزینه جایگزین حساب کاربری chroot شده است. (chroot چیه؟ بعدا راجع بهش میگم) در واقع rbash همون bash هست با این تفاوت که برخی امکانات shell در اون غیر فعال شده است. برای مثال اگر shell یک کاربر رو rbash قرار بدیم امکان تغییر متغیر محلی PATH رو نخواهد داشت یا از آدرس کامل برای اجرای دستورات نمی تونه استفاده کنه و یا اینکه امکان تغییر مسیر جاری از طریق دستور cd را ندارد.
اگر به بخش ۶.۱۰ راهنمای کاربری bash مراجعه کنید، می تونید فهرست محدودیت هایی که 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
همانطور که قبلا هم گفتم روش ارائه شده در این پست قابل دور خوردن است. ولی شما در شرایطی خاص می تونید جلوی دور خوردنش رو بگیرید. برخی روش های دور زدن در نوشتاری دیگر تشریح خواهد شد!