Bash restrito Shell usando o rbash

2

Estou usando /bin/rbash para alguns usuários. Ele está funcionando como esperado, mas há alguns truques como quando os usuários executam bash ou dash , então eles têm shells irrestritos, então, para evitar esses comandos, adicionei funções abaixo em seus arquivos .bashrc .

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

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

Então, minha pergunta é:

1 # podemos usar funções com vários nomes como abaixo

func1,func2 () {
 # do stuff
}

2 # Eu também tentei:

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

3 # /bin/rbash -> bash é apenas um link suave do bash, então como ele funciona como restrito?

Além disso, há algum comando para evitar que os usuários executem isso como unset HISTFILE e kill -9 $$ Existe alguma maneira alternativa de conseguir o mesmo?

    
por Rahul Patil 25.12.2012 / 15:18

1 resposta

6

Não faça isso. rbash deve somente ser usado em um ambiente já seguro, a menos que você saiba o que está fazendo. Há muitas maneiras de criar um shell bash restrito que não é fácil prever com antecedência.

As funções podem ser facilmente substituídas simplesmente fazendo command bash ou command sh .

Quanto às suas perguntas:

  • Você não pode definir várias funções ao mesmo tempo diretamente. Você teria que fazer algo assim:
x()  { foo; }
alias f1=x
alias f2=x
  • rbash funciona porque bash verifica o valor de argv[0] no lançamento. Se o nome da base, com os traços iniciais separados, for igual a RESTRICTED_SHELL_NAME (o padrão é rbash , consulte config.h ), ele será executado no modo restrito. Esta é a mesma maneira que ele é executado no modo de conformidade POSIX se chamado como sh . Você pode ver isso no código a seguir de shell.c no bash 4.2, linhas 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));
}
    
por 25.12.2012 / 15:25