O que é ForceCommand

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.

[ Hits: 3.407 ]

Por: Carlos Affonso Henriques. em 25/01/2021


O que é e como funciona



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!
Linux: ForceCommand

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.

   

Páginas do artigo
   1. O que é e como funciona
Outros artigos deste autor

Filtro de conteúdo autenticado com níveis de privilégio

Gateway autenticado com Apache, Iptables e CGI em shell

Debian sem Systemd

Rodando contêineres e aplicações Linux x86 no Raspberry Pi

Docker: Uma abordagem didática para tempos obscuros

Leitura recomendada

Protegendo seu servidor de e-mail Postfix

Bloqueio de usuários com página de aviso

Configurando um servidor de logs simples

OSSEC HIDS - Instalação e configuração no CentOS 6.5

Elastic SIEM - Instalação e Configuração do LAB (Parte I)

  
Comentários
[1] Comentário enviado por fabio em 25/01/2021 - 14:13h

Muito interessante, ótimo pra implementar scripts de backup remoto sem comprometer a segurança do servidor. Favoritado!

[2] Comentário enviado por CapitainKurn em 25/01/2021 - 17:38h


[1] Comentário enviado por fabio em 25/01/2021 - 14:13h

Muito interessante, ótimo pra implementar scripts de backup remoto sem comprometer a segurança do servidor. Favoritado!


Que bom que gostou!

[3] Comentário enviado por maurixnovatrento em 25/01/2021 - 18:28h


Muito bom.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[4] Comentário enviado por SamL em 25/01/2021 - 23:10h

Senti ai uns pingos de ironia o que deixou o artigo muito bom rsrsrs

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://cpusam.github.io/
"com o bug fix vem a perfeição"

[5] Comentário enviado por CapitainKurn em 26/01/2021 - 07:36h


[4] Comentário enviado por SamL em 25/01/2021 - 23:10h

Senti ai uns pingos de ironia o que deixou o artigo muito bom rsrsrs

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://cpusam.github.io/
"com o bug fix vem a perfeição"

Se gostou da ironia vai gostar ainda mais dos outros artigos Rsss!
Agora publico simultaneamente aqui no VOL e o no LInkedin, para aumentar o alcance, visto que estou procurando emprego. Aproveita dá aquele like de lampadinha para ajudar! https://www.linkedin.com/in/carlos-henriques-6a658657/detail/recent-activity/posts/


[6] Comentário enviado por SamL em 27/01/2021 - 20:02h

@CapitainKurn
Eu não uso mais o linkedin, apageui minha conta faz anos.
Sugiro que num próximo artigo tu coloque essa informação do like lá no site deles, isso vai te render maior visibilidade, creio eu.

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://cpusam.github.io/
"com o bug fix vem a perfeição"


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts