Eu gostaria de restringir alguns usuários no meu servidor a apenas poderem executar determinados comandos. Para fazer isso, a abordagem mais comum que encontrei é usar rbash
.
Embora eu possa encontrar muitos sites falando sobre rbash, estou tendo problemas para encontrar qualquer informação sobre como usá-lo corretamente. A abordagem mais comum que encontrei foi criar um link simbólico de /bin/rbash
para /bin/bash
, definir o shell de login dos usuários restritos para /bin/rbash
e, em seguida, definir um personalizado PATH
no ~/.bash_profile
diretório inicial do usuário.
No entanto, fiquei bastante chocado ao descobrir que, com essa configuração, os usuários ainda podem copiar arquivos para o servidor usando scp
e podem até abrir um shell irrestrito usando ssh user@host -t bash
! O que parece estar acontecendo é que o servidor SSH está passando o comando para o shell de login no servidor usando -c
, então ssh user@host -t bash
faz com que o servidor execute /bin/rbash -c bash
, o que funciona porque .bash_profile
ainda não foi executado para restringir o caminho. scp
da mesma forma faz com que o servidor seja executado /bin/rbash -c scp
.
Agora me deparei com a ForceCommand
diretiva de sshd. Esta diretiva basicamente sempre faz com que o comando configurado seja passado -c
para o shell de login, ignorando qualquer comando que o cliente tenha especificado. Portanto, se ForceCommand
estiver definido como rbash
, isso sempre executará o comando /bin/rbash -c rbash
no servidor, independentemente de o cliente ter sido chamado com -t bash
ou como scp
ou qualquer outra coisa. Infelizmente, /bin/rbash -c rbash
faz com que o .bash_profile
não seja executado, então acabamos com um shell restrito, mas um normal PATH
, então podemos simplesmente chamar bash
lá para escapar dele.
O que eu gostaria de alcançar:
- Não deve haver como evitar o shell restrito para usuários que se conectam via SSH
- Idealmente, ainda seria possível executar comandos permitidos no shell restrito usando
ssh user@server permitted_command
- A configuração não deve ser somente SSH, portanto, os usuários que efetuam login, por exemplo, no TTY, também devem ser restritos.
Depois de experimentar isso por um tempo, parece-me que a raiz do problema é que a segurança de
rbash
depende dePATH
ser definida, mas na maioria das configuraçõesPATH
é definida depois que o SSH especifica seus comandos personalizados, enquanto precisa ser especificado antes de .Como solução, em vez de especificar
/bin/rbash
(link simbólico para/bin/bash
o shell de login), criei um script de shell/usr/local/bin/rbash
e o usei como o shell de login. O script shell tem o seguinte conteúdo:Eu também experimentei com a
SetEnv
diretiva do sshd e tentei definir oPATH
lá. No entanto, achei essa solução menos prática porque ela define a configuração apenas para SSH, e também causava muitos erros durante a execução/etc/profile
do , pois os comandos usados lá não foram encontrados. Além disso, parece haver o risco de que algumas outras diretivas sshd permitam que o cliente substitua certas variáveis de ambiente novamente.