Introdução
Parece nome de um game de combate em primeira pessoa ou estratégia em tempo real, como os legendários jogos das séries
Command & Conquer,
Imperium Galactica II e
Homeworld. Aliás, esse último merecia um filme baseado nele com Keri Russel interpretando Karan S'jet (pelos jogos que citei, já perceberam que sou coroa).
ForceCommand é uma função interessantíssima do OpenSSH que é implementada no servidor. A função ForceCommand permite fazer muitas implementações de segurança interessantes, podemos por exemplo empregá-la para implementar uma API REST super segura que pode interagir sem muita dificuldade com praticamente tudo, ainda podemos criar múltiplos fatores de autenticação, estabelecer listas negadas ou liberadas de comandos que podem ou não serem executados através do SSH. O limite é a criatividade do administrador de sistemas.
O que faz exatamente o ForceCommand
Em tese, qualquer coisa que os privilégios do usuário com o qual você conectar permitam. O que ele faz é rodar um comando assim que uma conexão SSH é estabelecida através de chaves públicas. Podem a grosso modo entendê-lo como um "init system" para conexões SSH ou ainda como um CMD ou "entrypoint" de uma imagem Docker se preferirem, aliás está mais próximo desse último.
Para configurar o seu SSH para autenticar via chave pública, vejam esse tutorial do
Mateus Gabriel Müller. Não vou explanar sobre isso para não estender muito e por haver farto material sobre o assunto:
Perfil do Mateus no
Linkedin.
Exemplos de uso de ForceCommand
Nos exemplos, por uma questão de simplificação, empregarei o usuário root. Mas lembre-se de que se for implementar para produção, use o root com muito cuidado e parcimônia. É apenas um lembrete do Bart!
1° Exemplo
Na máquina servidor (aquela que você irá acessar via SSH) edite seu arquivo
/root/.ssh/authorized_keys ou
root/.ssh/authorized_keys2, conforme for o seu caso e acrescente a seguinte linha imediatamente antes da chave pública separado dela por apenas um espaço em branco.
command="/root/.ssh/Seu_Script_ForceCommand.sh" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAFYw..........
Agora, crie com seu editor preferido o script "/root/.ssh/Seu_Script_ForceCommand.sh" com o seguinte conteúdo:
#!/bin/bash
echo -e "e[1;33m Bem vindo!e[;m
"
/bin/bash
Não esqueça de atribuir-lhe permissão para execução:
# chmod 755 /root/.ssh/Seu_Script_ForceCommand.sh
Agora, desconecte-se do servidor e faça login novamente como root e observe o resultado. Ele lhe exibirá a mensagem "Bem vindo!" em amarelo e em seguida executará o
/bin/bash entregando-lhe um shell.
Agora uma curiosidade bem interessante, experimente fazer o seguinte:
# ssh root@ip.do.seu.server "init 0"
Ou melhor ainda, com o uso do "here strings":
# ssh root@ip.do.seu.server <<< echo "init 0"
Agora ele simplesmente exibirá a mensagem "Bem vindo!" em amarelo e não fará nada, para sair dê um
Ctrl+c. Note que quando o ForceCommand é implementado, ele impede a execução remota via SSH de qualquer comando. Isso já é por si só uma excelente linha de defesa, executando apenas o que for estiver determinado em seu script de comandos, em
/root/.ssh.
2° Exemplo
Usando a variável "SSH_ORIGINAL_COMMAND".
Quando você envia um comando para um servidor através do SSH, esse antes de ser repassado ao shell, é armazenado em uma variável chamada "SSH_ORIGINAL_COMMAND" e a partir dela podemos definir, por exemplo, listas negadas e concedidas.
Vejam o exemplo abaixo do arquivo "/root/.ssh/Seu_Script_ForceCommand.sh":
#!/bin/bash
echo -e "e[1;33m Bem vindo!e[;m
"
if [[ "${SSH_ORIGINAL_COMMAND}" == "ifconfig eth0" ]]; then
${SSH_ORIGINAL_COMMAND}
fi
if [[ "${SSH_ORIGINAL_COMMAND}" == "ifconfig docker0" ]]; then
${SSH_ORIGINAL_COMMAND}
fi
/bin/bash
Nesse caso ocorre o seguinte:
- Se nenhum comando for enviado via SSH, ele lhe retornará a mensagem "Bem vindo!" e executará o /bin/bash entregando-lhe um shell.
- Se qualquer comando, exceto ifconfig eth0 ou ifconfig docker0, for passado ao shell via SSH ele apenas exibirá a mensagem "Bem Vindo!" e desfará a conexão.
Experimente!
# ssh root@ip.do.seu.server <<< echo "ifconfig"
Agora, mude para:
# ssh root@ip.do.seu.server <<< echo "ifconfig eth0"
# ssh root@ip.do.seu.server <<< echo "ifconfig docker0"
Perceberam a diferença?
Mais uma coisa interessante, digamos que você deseja que um usuário ao conectar no servidor via SSH, a aplicação com a qual ele trabalha abra automaticamente e quando o usuário encerrar a aplicação, a conexão seja imediatamente desfeita.
ATENÇÃO: se aplicar isso ao usuário root você perderá acesso ao shell e consertar vai dar um pouquinho de trabalho. Faça-o em uma conta de usuário comum.
Edite o seu "/home/usuario/.ssh/Seu_Script_ForceCommand.sh":
#!/bin/bash
echo -e "e[1;33m Bem vindo!e[;m
"
/usr/bin/mc
Ao conectar como usuário, ele abrirá diretamente o "Midnight Commander" e quando você sair da aplicação a conexão será desfeita.
3° Exemplo
Agora vamos fazer um menu de opções ao conectar via SSH.
Teste com um usuário normal, porque se cometer algum erro, você poderá ainda conectar-se como Root.
Edite o seu "/home/usuario/.ssh/Seu_Script_ForceCommand.sh" como abaixo na máquina servidora:
#!/bin/bash
echo -e "e[1;33m Bem vindo!e[;m
"
read -p "
Digite uma Opção
=============
a - Exibe data e hora
b - Exibe uptime
c - Exibe pontos de montagem
s - SHELL Bash
x - EXIT
" opcao
case "${opcao}" in
a)
date
;;
b)
uptime
;;
c)
df -h
;;
s)
/bin/bash
;;
x)
exit
;;
esac
Agora conecte como o usuário e observe o resultado.
Como podem observar, a função ForceCommand é extremamente versátil, pode ser aplicada a qualquer coisa que empregue um servidor OpenSSH, contêineres, VMs, máquinas físicas e, como afirmei anteriormente, seus limites são a criatividade como administrador.