
Eu tenho um usuário que precisa se conectar a uma máquina remota M
(via ssh) e executar uma em um conjunto fixo de comandos (digamos, N
no total).
Esses comandos dependem de python, suas bibliotecas e acesso privilegiado à rede (que a máquina M
possui).
Existem estratégias padrão para limitar o shell do usuário Linux apenas à execução desses N
comandos, sem qualquer possibilidade de:
- mais acesso ao fs
- lendo o conteúdo dos próprios comandos
- adquirir acesso privilegiado à rede
- e similares
Em outras palavras, quais são as estratégias padrão para solicitar um console limitado ao usuário após o login, permitindo, por exemplo, apenas números entre 1
e N
como entradas?
Responder1
Há um truque interessante no arquivo autorizado_keys, você pode usar a opção de comando para definir o comando a ser executado no login, identificado por uma chave, portanto, se seus N comandos forem estáticos - você pode defini-los no servidor e pronto. Não irá restringir a rede, apenas lançando o comando. Será algo parecido com isto no arquivoauthorized_keys:
command = "date" ssh-rsa AAAA
Você pode encontrar mais informações sobre issotutorial
Para impedir que o usuário acesse a rede - você pode usar o SELinux ou outro software semelhante, também pode escrever um gancho eBPF para permitir exatamente o que deseja.
Responder2
Vamos supor que este não seja um pequeno chroot ou contêiner com apenas o que eles precisam, mas sim um sistema operacional multiusuário de uso geral.
Com automação suficiente, o login no host pode não ser necessário. Talvez forneça através de algum sistema de autoatendimento essas opções limitadas, o que a automação faz.
Para permitir que eles façam isso no host, tente o que eu chamaria de menu de texto cativo. Qual é um script que você pode precisar escrever.
Impedir estritamente a pessoa de fazer outras coisas requer vários truques.
- Faça login como um usuário não privilegiado, de preferência exclusivo para ele. Escale para coisas privilegiadas com ferramentas como doas ou sudo.
- Mandar este menu é o que funciona com
ForceCommand
blocos OpenSSH. - Execute-o também a partir de perfis de shell. exec, então ele substitui o processo shell e, quando o menu sai, o mesmo acontece com a sessão.
- Sinais de armadilha no script do menu.
- Cuidado com programas que podem executar comandos arbitrários. Desembolsar é trivialno vim, o comando é
:shell
- Escreva e use scripts wrapper como itens de menu, para operações mais complexas ou mais controle sobre a saída.
Escolha uma linguagem de script para escrever o menu. Considere usar uma biblioteca de menu de texto existente. Um loop de entrada por si só não é difícil, mas torná-lo robusto, fácil de modificar e com boa UX é o que você realmente deseja na produção.