Segurança: SSH – Verificação em duas etapas

A verificação em duas etapas (two-factors) é a tecnologia que nos permite adicionar uma camada de segurança no processo de autenticação convencional (usuário e senha).
É recomendável usar sempre que é possível, mas e o SSH, tem alguma coisa voltada para isso? Não sei, mas podemos criar algo nós mesmos para isso.

O Linux nos dá o poder de fazer as configurações necessárias.

Então vamos a ela.

Primeiro passo você precisa alterar o bash do seu usuário, os comandos a seguir precisam ser executados como root.

Edite o arquivo “/etc/passwd”, quando encontrar seu usuário, altere o bash dele

exemplo:

leandro:x:1000:1000:Leandro Henrique:/home/leandro:/bin/bash
altere para:
leandro:x:1000:1000:Leandro Henrique:/home/leandro:/usr/local/token

Feito isso hora de criar nosso arquivo “/usr/local/token” para fazer a segunda verificação

exemplo:


#!/bin/bash
echo -e "\nControl + c acionado.\n"
control_c () {
#pkill -kill -u $USUARIO
exit 0;
}

trap control_c INT HUP TERM

USUARIO=`whoami`;
#Aqui você coloca uma URL para enviar para você um SMS,
#ou um email.
#Claro se for SMS você precisa de ter um gateway que faça isso
#existem outros meios, mas este artigo não tem objetivo de
#explorar isso.
VALID_TOKEN=`curl http://asterisk.reis/api/sms/sendtoken/6`

echo "Please enter the token:"
read TOKEN;

if [ "$TOKEN" == "$VALID_TOKEN" ]; then
echo "You have access!"
/bin/bash
exit;
fi

echo "ACCESS DENIED!"
#pkill -kill -u $USUARIO
exit;

O que o código a cima faz?
Primeiro e disse que o script vai ser executado pelo bash.
Cria uma função para prevenir que caso o usuário pressione ctrl+c, ao invés de cancelar o script e ir para o prompt de comando, saia do bash e finalize a conexão SSH, ou caso prefira, pode remover o comentário da linha “#pkill -kill -u $USUARIO” e todas as sessões com este usuário serão fechadas (meio brusco, mas fica a critério de cada um), tem suas vantagens e desvantagens vale a você analisar o que é melhor para você.

Depois ele pega gera um token usando um serviço externo que este artigo não contempla, cabe a você desenvolver ou utilizar algo pronto por ai para enviar um SMS ou email para você.

Em seguida ele solicita ao usuário que digita o valor do token, que foi enviado por SMS ou EMAIL ou qualquer meio que você utilizar.
Então verifica se os tokens batem, se batem ok! Ele passa, senão sai do bash, finaliza.

Bom temos dois problemas ai, primeiro é que seu gateway pode falhar, segundo que você pode ter acesso ao terminal fisicamente e ficaria incomodo você com acesso físico ter que esperar sempre receber o token para poder acessar sua máquina toda vez que abrir um terminal.

Então vamos a um script que verifica se ouve erro, vamos considerar que o token seja apenas de 6 caracteres se o CURL devolver algo maior que isso é porque deu algum erro.

O código completo de como fica está abaixo, e no vídeo mais detalhes da utilização desse processo.


#!/bin/bash
control_c () {
echo -e "\nControl + c acionado.\n"
#pkill -kill -u $USUARIO
exit 0;
}

trap control_c INT HUP TERM

if [[ $(who am i) =~ \((\:0\))$ ]]; then
/bin/bash
exit;
fi

USUARIO=`whoami`;
SECRET="123123";

VALID_TOKEN="15";
#VALID_TOKEN=`curl http://asterisk.reis/api/sms/sendtoken/6`

TAMANHO=${#VALID_TOKEN};
NO_TOKEN="-";

if [[ "$VALID_TOKEN" == "$NO_TOKEN" || "$TAMANHO" -gt 6 ]]; then
echo "Failed to send the token";
stty -echo;
VALID_TOKEN=$SECRET;
fi

echo "Please enter the token:"
read TOKEN;
stty echo;

if [ "$TOKEN" == "secret" ]; then
VALID_TOKEN=$SECRET;
echo "Please enter the password:"
stty -echo;
read TOKEN;
stty echo;
fi

if [ "$TOKEN" == "$VALID_TOKEN" ]; then
echo "You have access!"
/bin/bash
exit;
fi

echo "ACCESS DENIED!"
#pkill -kill -u $USUARIO
exit;

Bom temos ai um script que caso falhe a geração do tem, ou você não queira muito esperar possa digitar “secret” e depois digitar sua segunda senha secreta.

Assista o vídeo para mais detalhes de utilização e como funciona, caso não tenha compreendido.