Se você possui um certificado digital armazenado em uma mídia criptográfica, como um cartão inteligente ou um token, pode adicionar uma camada de segurança às conexões SSH com seu servidor configurando autenticação baseada em dois fatores (two-factor authentication ou 2FA). Com isso, para se conectar ao servidor, é necessário possuir a mídia criptográfica e conhecer sua senha PIN.
Neste post, você verá como configurar autenticação com token no acesso remoto via SSH.
Pré-requisitos
Aqui, parto do princípio que:
- o servidor está com o acesso remoto via SSH habilitado e funcionando,
- o computador cliente consegue acessar remotamente o servidor via SSH, e
- o computador cliente como consegue utilizar o token.
Recomendo a leitura de alguns posts anteriores:
- Levante um servidor com o Linux openSUSE Leap - parte 1 (instalação),
- Levante um servidor com o Linux openSUSE Leap - parte 2 (configuração), e
- Configurando certificado digital no Linux openSUSE.
Obtendo a chave pública do token e copiando para o servidor
O token armazena seu certificado X.509. Sua chave pública deve ser conhecida pelo servidor para que ele aceite a conexão SSH encriptada com ela.
Para extrair a chave pública do token no formato RSA, utilizado por padrão no SSH, use o comando ssh-keygen com o argumento -D
e o caminho para a biblioteca do token (no meu caso, /usr/lib64/libeToken.so
). Salve a saída em um arquivo (por exemplo, chaves_token
):
1
$ ssh-keygen -D /usr/lib64/libeToken.so > chaves_token
Copie sua chave pública para o servidor usando o protocolo e comando SCP (semelhante ao SSH, mas usado para copiar arquivos):
1
$ scp chaves_token kamarada@meuservidor:/home/kamarada/
São informados, na sequência: o caminho no computador local do arquivo a ser copiado, o nome do usuário do servidor, o nome de rede (ou endereço IP) do servidor e o destino do arquivo no servidor.
Configurando a autenticação no servidor
Acesse remotamente o servidor usando SSH:
1
$ ssh kamarada@meuservidor
No servidor, crie a pasta de configuração do SSH:
1
$ mkdir -p .ssh
Copie a chave pública RSA para o arquivo .ssh/authorized_keys
:
1
$ cat chaves_token >> .ssh/authorized_keys
authorized_keys
é um arquivo de configuração do SSH que especifica quais chaves podem ser aceitas no acesso remoto com a conta do usuário.
Você pode excluir o arquivo chaves_token
e encerrar o acesso remoto:
1
2
$ rm chaves_token
$ exit
Acesso remoto usando o token
Acesse remotamente o servidor via SSH, dessa vez adicionando o argumento -I
e o caminho para a biblioteca do token:
1
$ ssh -I /usr/lib64/libeToken.so kamarada@meuservidor
Forneça a senha PIN do token:
1
Enter PIN for 'ANTONIO VINICIUS MENEZES MEDEIR':
E pronto: você está na linha de comando do servidor!
Encerre o acesso remoto, por enquanto:
1
$ exit
Autenticando com o token por padrão
No momento, é possível acessar remotamente o servidor de duas formas:
- informando a senha do usuário do servidor, como de costume, com:
1
$ ssh kamarada@meuservidor
- ou usando o token e informando sua senha PIN com:
1
$ ssh -I /usr/lib64/libeToken.so kamarada@meuservidor
Para usar o token por padrão, edite o arquivo ~/.ssh/config
:
1
$ nano ~/.ssh/config
E adicione a linha:
1
PKCS11Provider /usr/lib64/libeToken.so
(lembre de mudar o caminho para a biblioteca do token conforme sua necessidade)
Feito isso, não é mais necessário adicionar o argumento -I
para usar o token:
1
2
3
4
5
$ ssh kamarada@meuservidor
Enter PIN for 'ANTONIO VINICIUS MENEZES MEDEIR':
Last login: Mon Dec 17 00:47:15 2018 from 172.17.0.10
Have a lot of fun...
kamarada@meuservidor:~>
Se o token estiver plugado no computador cliente, será solicitada sua senha PIN. Senão, será solicitada a senha do usuário do servidor.
Referências
Quero agradecer ao sabe-tudo Leandro Peracchi por ter compartilhado essa dica comigo.
Para escrever a explicação, consultei algumas páginas: