Bash 使用 rbash 限制 Shell

Bash 使用 rbash 限制 Shell

我正在/bin/rbash为一些用户使用。它按预期工作,但有一些黑客行为,例如当用户运行bash或时,然后他们获得不受限制的 shell,因此为了避免这些命令,我​​在他们的文件dash中添加了以下函数。.bashrc

bash() {
echo "WARNING: NOT ALLOW!!"
}

sh() {
echo "WARNING: NOT ALLOW!!"
}

所以我的问题是:

1#我们可以使用具有多个名称的函数,如下所示

func1,func2 () {
 # do stuff
}

2#我也尝试过:

case $BASH_COMMAND in # check each command`
        bash|dash|sh) 
        echo "WARNING: NOT ALLOW!!" 
        ;;
esac

3#/bin/rbash -> bash这只是bash的软链接,那么它是如何受到限制的呢?

还有一些命令可以避免用户执行类似的命令unset HISTFILEkill -9 $$ 是否有其他方法可以实现相同的目的?

答案1

不要这样做。rbash应该仅有的除非您知道自己在做什么,否则不能在已经安全的环境中使用。有很多方法可以破解受限制的 bash shell,但事先不容易预测。

command bash只需通过执行或即可轻松覆盖函数command sh

至于你的问题:

  • 您不能直接同时定义多个函数。你必须做这样的事情:
x()  { foo; }
alias f1=x
alias f2=x
  • rbash之所以有效,是因为在启动时bash检查 的值。argv[0]如果基本名称(去掉前导破折号)等于RESTRICTED_SHELL_NAME(默认为rbash,请参阅config.h),则它在受限模式下运行。如果作为 调用,这与它在 POSIX 兼容模式下运行的方式相同sh。您可以shell.c在 bash 4.2 第 1132-1147 行的以下代码中看到这一点:
/* Return 1 if the shell should be a restricted one based on NAME or the
   value of `restricted'.  Don't actually do anything, just return a
   boolean value. */
int
shell_is_restricted (name)
     char *name;
{
  char *temp;

  if (restricted)
    return 1;
  temp = base_pathname (name);
  if (*temp == '-')
    temp++;
  return (STREQ (temp, RESTRICTED_SHELL_NAME));
}

相关内容