quinta-feira, 10 de fevereiro de 2011

OTP (One-Time Password) - barrando a força bruta

Imagine o seguinte, você possui acesso a vários sites, como: Hotmail, Orkut, Lojas Americanas, Fórum, Listas etc. Você utiliza apenas uma senha para acessar estes sites. Já imaginou se alguém conseguir esta senha!!?? Ele poderia ter acesso a todos os seus sites.

Imagine também que você é administrador de redes e possui vários servidores sobre sua responsabilidade. Como administrador você precisa implementar políticas de segurança e uma política básica seria a criação de senhas “fortes”.  O que você faz, cria uma senha forte e usa em todas as máquinas ou cria várias senhas fortes porém terá que escrever em um papel para lembrar??

Se você respondeu em criar a senha “forte” e usar em todas as máquinas, neste caso você enfrentará o mesmo dilema comentado anteriormente, ou seja, se alguém conseguir esta senha poderá ter acesso a todas as máquinas. Se sua resposta foi criar várias senhas seguras e escrever em um papel, ai você tem um grande problema de segurança que é escrever as senhas no papel.

Você pode estar pesando em utilizar os famosos Gerenciadores de Senha, não é? O problema é que toda vez que você precisar de uma senha você precisa do programa de gerenciamento. E se você estiver na casa de um amigo ou em uma lan house? Você vai pedir pra ele instalar seu programa de gerenciamento de senha para que você possa acessar o site das Lojas Americanas ou um servidor do seu trabalho?? Espero que a sua resposta seja “não”.

O que fazer?

Simples. Perfect Paper Password.
Perfect Paper Password é também chamado de One-Time Password System. OTP é um sistema de senhas que são válidas apenas para uma sessão, ou seja, cada nova sessão a senha muda. Você não precisa ficar lembrando da senha, uma tabela como a da figura abaixo serve para guiar você no processo de autenticação:



Exemplo:
Vou simular o que ira acontecer quando você tentar acessar remotamente o seu servidor via SSHD, veja a figura abaixo:



Quando eu fizer o acesso via SSH será necessário primeiramente realizar a autenticação usando a minha senha do sistema e em seguida na linha 5 tenho o passcode “1A” que de acordo com o meu Passcard (primeira figura) corresponde com a string “Es28”. O que podemos ver é que para realizar essa autenticação com sucesso irei precisar da minha senha do sistema e do meu passcard, sem eles será impossível autenticar.
Vou mostrar depois como implementar o PPP (perfect paper password) no seu servidor SSHD.  O grande problema é que não podemos implementar este mecanismo nos sites que somos cadastrados, isso deveria ser feito pelos administradores desses sites. E agora? Calma, vamos pegar a idéia do PPP e criar o nosso Passcard para acessar os sites.

Criando nosso Passcard

Vá no site https://www.grc.com/ppp.htm e gere seu passcard, perceba que ele gerou 3 passcard, vamos usar o primeiro passcard como exemplo. Agora copie o passcard 1 (1) para o Excel e com base nele você criará o seu próprio passcard (2) para acessar seus sites, veja a figura abaixo:



Imprima seu Passcard, plastifique e coloque na carteira. Tenha uma imagem dele no seu pen-drive e tire uma foto com o seu celular, acho que isso já é o bastante.

Vamos ver como ficaria nossa senha para acessar o site das Lojas Americanas (www.americanas.com.br):
Pegue a palavra “A M E R I C A N A S” e veja no seu passcard como ficaria:

A --> o=
M --> Mz
E --> bB
R --> 3T
I --> Xv
C --> ?R
A --> C5
N --> h6
A --> mq
S --> 9m

Nossa senha seria: o=MzbB3TXv?RC5h6mq9m

Você não precisa lembra desta senha, apenas do nome “americanas”. Vamos tornar nossa senha um pouco mais forte? Imagine o seguinte que a sua senha padrão para acessar seus sites era “123456”, que tal colocar esta senha no final da nossa senha? Ficando assim:
o=MzbB3TXv?RC5h6mq9m123456

Desta forma mesmo que alguém consiga o seu Passcard ele precisa saber da senha no final e precisa saber também que a palavra “americanas” serviu para lhe orientar na criação da sua senha. E se na hora de criar a senha você escolhesse a palavra “lamericanas” ou “lojasamericanas”??

Você também pode criar seu passcard usando a função rand() do Excel ou use o script paper-token.pl.

Para usar o script é necessário instalar alguns módulos em Perl, segue abaixo como fazer isso no Linux:

perl -MCPAN -e Shell
install Authen::HOTP
install PDF::API2
install PDF::Table
install Getopt::Compact

Será necessário fazer algumas alterações no script e no módulo HTOP para que o resultado seja como a da figura abaixo:


O resultado acima foi gerado com o seguinte comando:

#perl paper-token.pl --output test2.pdf --counter 0 --end 55 --digits 2

Será gerado um PDF com o nome test2.
Agora vamos configurar o PPP no seu servidor SSHD para isso vou usar o Ubuntu 10.10 32 bits.

Primeiramente instale os seguintes pacotes:
  • subversion
  • make
  • gcc
  • g++
  • libc6-dev
  • uuid-dev
  • libpam0g-dev
  • openssh-server
Agora baixe o código fonte aqui.
Descompacte o arquivo e compile:
#tar -xvzf ppp-pam-0.2.tar.gz
#cd ppp-pam
#cd build
#../configure
#make

obs: quando estiver compilando der o seguinte erro (no Debian 64 bits ocorreu este erro):

“/usr/bin/ld: pam_ppp_so-pam_ppp.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with –fPIC pam_ppp_so-pam_ppp.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [pam_ppp.so] Error 1”

Então substitua os dois últimos comandos acima por estes:

#CC="gcc -fPIC" ../configure
#make -B

Agora vamos testar para ver se tudo ocorreu bem e depois instalar:
#make test
#make install

Configurando o SSHD e o módulo do ppp

Edite o arquivo:
#vi /etc/pam.d/ssh

E acrescente logo abaixo da linha “@include common-auth”
auth       required       pam_ppp.so

Se você quiser que a autenticação ocorra apenas com o módulo ppp comente a linha “@include common-auth” que é responsável pela autenticação padrão do SSHD, onde checa o usuário e senha junto com os arquivos de autenticação do Linux.

Edite o arquivo de configuração do sshd e certifique-se que os dois parâmetros estejam no arquivo:

#vi /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
UsePAM yes

Pronto já esta configurada. Agora precisamos gerar uma seguencia de chave para o meu usuário e em seguida gerar o passcard:

$pppauth --key

obs: o comando acima deverá ser executado com a permissão do usuário que queremos criar a chave, exemplo, se você esta logado como root e deseja criar a chave e o passcard para o usuário osvaldohp você deverá antes executar o comando “su - osvaldohp” ou logar em outro terminal com a conta do usuário osvaldohp.

Gerando o passcard:

$pppauth --text --next 1
Eu sugiro que você tire uma foto do seu passcard. 
 
Agora eu quero que você entenda uma coisa, esse passcard vai ser descartado assim que todos os números forem usado em seguida passara para o passcard 2. Para ver o passcard 2 digite o comando:
 
$pppauth --text -c 2
 
Tenha sempre o passcard atual e o seguinte.
 
Outra ótima ferramenta que implementa OTP é o OPIE:
Link1
Link2
Link3
 
 Tire suas conclusões.

by Osvaldo H Peixoto


2 comentários:

  1. Osvaldo, parabéns pelo tópico.
    estou querendo implementar esse serviço, porém quero que o cartão não passe para o 2º, fique só no primeiro mesmo porque vou ter outros métodos de segurança para acesso ao ssh, você pode me ajudar?

    esse serviço não pode ser cancelado pelo usuário pelo CTRL+C nem jogado para segundo plano? ou séka se torna obrigatorio para o usuário se atutenticar.

    meu email: dayvidsonbezerra@gmail.com

    ResponderExcluir
  2. Podemos trabalhar juntos para resolver isso, ainda não testei da maneira que você precisa, estarei entrando em contato com você pelo email.

    ResponderExcluir