حالتی را در نظر بگیرید که بخواهید اجازه دسترسی به رابط کاربری خط فرمان را به کاربری بدهید و در عین حال کاربر تنها مجاز به اجرای برخی فرامین خاص سیستم عامل باشد. برای مثال فرض کنید بخواهید به کاربر تنها اجازه پیکربندی اولیه سیستم را با دستوراتی مثل 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 به تنهایی جلوی اجرای دستورات دلخواه توسط کاربر را نمی گیرد. اگر بخواهیم دستوراتی که کاربر قادر به اجرای اون هست رو هم محدود کنیم کار بیشتری باید انجام بشه.

راه اندازی 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

همانطور که قبلا هم گفتم روش ارائه شده در این پست قابل دور خوردن است. ولی شما در شرایطی خاص می تونید جلوی دور خوردنش رو بگیرید. برخی روش های دور زدن در نوشتاری دیگر تشریح خواهد شد!

مطالب مرتبط:
مجازی سازی ARMv8-A – مقدمه
مجازی سازی ARMv8-A – مجازی سازی در حالت AArch64