Criando um cluster de alta performance para quebrar senhas!

2012-01-07 Off Por gambin

 

Olá Pessoal!

Este post é na verdade baseado em um projeto de faculdade que superou todas as minhas expectativas em relação à tecnologia e trabalho em equipe!

Trata-se de um projeto de construção de um cluster em ambiente Linux para quebra de senhas utilizando o John the Ripper, com cada nó (servidor) do cluster executando de maneira síncrona o mesmo algoritmo para quebra de senhas. Fantástico!

Antes de mais nada, me sinto no dever agradecer a todas as incríveis pessoas que participaram diretamente e indiretamente no sucesso deste projeto das quais posso destacar:

E claro, ao nosso orientador, conselheiro e professor Erivelton Nunes.

Finalizando os agradecimentos, vamos ao que interessa!

 

O que é um cluster de alta performance?

Os clusters de alta performance são utilizadas para tarefas que exigem grande capacidade de processamento de dados, tais como cálculos matemáticos complexos, renderização de imagens 3D, previsões meteorológicas, entre muitas outras.

Uma das principais vantagens da utilização de clusters de alta performance é o custo benefício proporcionado pela capacidade do processamento distribuído.

Para entendermos o funcionamento de um cluster faz-se necessário entendermos o conceito de Message Passing.

Message Passing é o método de envio e recebimento de mensagens em uma rede através de protocolos de comunicação.

Neste caso as informações são enviadas do processo local para os processos remotos, fazendo com que as tarefas sejam gerenciadas, distribuídas e executadas simultaneamente em todos os servidores do cluster.

Os padrões mais conhecidos de Message Passing são o MPI e o PVM.

Para fins de estudo e aplicação iremos demonstrar a utilização de um cluster de alta disponibilidade através do MPICH – implementação multiplataforma do padrão MPI – que será responsável pelo processamento paralelo do John the Ripper, utilizando três maquinas virtuais com o sistema Debian Squeeze separadamente conectadas para quebra de senha e hashes.

 

Entendido o conceito de cluster e com um conhecimento razoável em Linux, mãos à obra!

 

Considerações Iniciais + Terminologia

Este post talvez seja um pouco ‘tequiniquês’ e extenso, e em alguns momentos pode exigir do amigo leitor um certo conhecimento em Linux.

Embora esteja tudo bem detalhado, vamos nos evitar alguns erros através de exemplos de Terminologia.

$ = significa que o comando deve ser executado com usuário comum

# = significa que o comando deve ser executado como usuário root

Exemplo:

root@deb01: ~# apt-get update
-[1]--[2]---[3]-----[4]------

[1] root = nome do usuário atual
[2] deb01 = hostname
[3] # = identificação do usuário
[4] apt-get update = comando

Neste caso, todos os comandos que deverão ser digitados estão depois do caractere de identificação do usuário [$] ou [#]

Os comandos também deverão ser executados sempre em uma única linha.

 

Sumário

1.  Configuração

1.1  Configuração do servidor master

1.1.1  Configuração do repositório

1.1.2  Configuração da rede

1.1.3  Configuração de usuários e permissões

1.1.4  Configuração de servidor NFS

1.1.5  Instalação do SSH e libssl-dev

1.1.6  Instalação e configuração do MPICH2

1.1.7  Instalação e configuração do John the Ripper

1.2  Configuração dos servidores slaves

1.2.1  Configuração da rede

1.2.2  Configuração de usuários e permissões

1.2.3  Instalação do SSH

1.2.4  Configuração do /cluster nos servidores slaves

2.  Verificando o funcionamento do cluster + John the Ripper

3.  Quebrando senha com John the Ripper em cluster

 

Requisitos recomendados de Hardware:

  • Hardware compatível com sistema operacional Debian Squeeze;
  • 01 Interface de Rede (modo NAT)
  • 01 Interface de Rede (modo Internal)
  • 256 Mb de memória
  • 02 Gb de espaço disponível em disco rígido
  • Conexão com internet

 

Requisitos recomendados de Software:

  • Sistema operacional Debian Squeeze (sistema básico)

 

1. Configuração

Nesta etapa serão feitas as configurações do sistema, tais como atualização, instalação e configuração dos pacotes básicos.

Também serão configurados usuários responsáveis pela execução dos serviços do cluster e também a preparação do ambiente.

É válido lembrar que o servidor responsável por iniciar os serviços cluster é o host (nó) principal (master) e todos os demais serão os hosts (nós) secundários (slaves).

 

1.1. Configuração do servidor master

Esta configuração será feita com a instalação dos pacotes/ serviços: NFS, SSH, MPICH2 e John the Ripper que serão utilizados por todo o cluster através da rede.

 

1.1.1. Configuração do repositório

Acesse o terminal como root

Edite o seguinte arquivo para configuração de repositórios:

root@deb01:~# vi /etc/apt/sources.list

Configure conforme as informações abaixo:

deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
deb http://ftp.br.debian.org/debian/ squeeze-updates main
deb-src http://ftp.br.debian.org/debian/ squeeze-updates main
deb http://ftp.br.debian.org/debian squeeze main

Em seguida atualize repositório e os pacotes do sistema através dos seguintes comandos:

root@deb01: ~# apt-get update
root@deb01: ~# apt-get upgrade all

 

1.1.2. Configuração de Rede

Acesse o terminal como root

Edite o seguinte arquivo para configuração de endereços de rede:

root@deb01:~# vi /etc/network/interfaces

Configure conforme as informações abaixo:

auto lo
iface lo inet loopback 

auto eth0
iface eth0 inet dhcp 

auto eth1
iface eth1 inet static
address 10.1.1.1
netmask 255.255.255.0

Inicie a segunda interface de rede através do seguinte comando:

root@deb01:~# ifup eth1

Agora iremos desabilitar o ipv6 em nosso servidor para garantir uma melhor compatibilidade com os serviços utilizados.

Também serão configurados os ips dos servidores utilizados no cluster, uma vez que não será utilizada a resolução de nomes DNS.

Portanto edite o seguinte arquivo para desabilitar o uso local do ipv6 e configurar os ips dos servidores do cluster:

root@deb01:~# vi /etc/hosts/

Configure conforme as informações abaixo:

127.0.0.1 localhost
10.1.1.1 deb01 #master
10.1.1.2 deb02 # slave
10.1.1.3 deb03 # slave

Agora será necessário desabilitar o ipv6 na inicialização do sistema, portanto será necessário editar o seguinte arquivo:

root@deb01:~# vi /etc/sysctl.conf

Basta adicionar a seguinte linha no final do arquivo:

net.ipv6.conf.all.disable_ipv6 = 1

Agora iremos desativar o IPv6 utilizado pelo exim, para evitar que o serviço comece a gravar mensagens de erro nos logs do sistema pois o ipv6 está desativado.

Pare reconfigurar o exim, basta executar o seguinte comando:

root@deb01:~# dpkg-reconfigure exim4-config

Será exibida a tela de configuração do serviço. Basta configurá-lo conforme o seguinte procedimento:

Clique em Ok para prosseguir
Selecione Sem configuração no momento e clique em Ok para prosseguir
Clique em Sim para deixar o sistema de mensagens não configurado
Clique em Não para não dividir os arquivos de configuração

Reinicie o servidor para que todas as alterações tenham efeito

 

1.1.3.  Configuração de usuários e permissões:

Para utilização o cluster com MPICH2 é necessário que todos os usuários tenham o mesmo UID e GUID em todas as estações utilizadas, uma vez que não estamos utilizando nenhum serviço de diretório.

Para isso iremos configurar um usuário e grupo para utilização deste serviço.

Crie o usuário através do seguinte comando:

root@deb01:~# groupadd -–gid 1100 mpigroup
root@deb01:~# adduser –-home /cluster -–uid 1100 -–gid 1100 mpiuser --disabled-password --quiet

Apenas confirme todas as informações sobre o usuário

 

1.1.4. Configuração do servidor NFS

O servidor NFS será utilizado para compartilhar todos os arquivos (binários, bibliotecas e senhas) utilizados durante a utilização do cluster.

Para isso entre no terminal como root.

Digite o seguinte comando para a instalação do serviço NFS

root@deb01:~# apt-get install nfs-kernel-server

Após a instalação será necessário compartilhar o diretório /cluster que será acessado por todos os servidores do cluster.

Como o foco deste projeto post é um ambiente de cluster de alta performance, não serão aplicadas técnicas de hardening. Portanto o compartilhamento estará acessível por todos os computadores da rede.

Faça o compartilhamento através do seguinte comando:

root@deb01:~# echo '/cluster *(rw,sync,no_subtree_check)' >> /etc/exports

Reinicie o serviço do NFS através do seguinte comando:

root@deb01:~# invoke-rc.d nfs-kernel-server restart

 

1.1.5. Instalação do SSH e libssl-dev

O SSH será utilizado para comunicação entre o servidor master e os servidores slaves, e a biblioteca libssl-dev será responsável pela implementação do suporte ao md5.

Para instalar o SSH e a biblioteca libssl-dev acesse o terminal como root.

Digite o seguinte comando para iniciar a instalação:

root@deb01:~# apt-get install openssh-server libssl-dev

Agora será necessário entrar com o usuário mpiuser (que irá executar o serviço de cluster) para a configuração do SSH a fim de realizar a conexão através das chaves que serão criadas.

Acesse com o usuário mpiuser através do seguinte comando:

root@deb01:~# su - mpiuser

Execute o seguinte comandos para gerar as chaves:

mpiuser@deb01:~$ ssh-keygen –t dsa

Pressione Enter 3x para gerar uma chave em branco.

Agora digite os seguintes comando para prosseguirmos com a configuração das chaves

mpiuser@deb01:~$ cd ~/.ssh
mpiuser@deb01:~/.ssh$ cat id_dsa.pub >> authorized_keys

Como todos os servidores irão montar o /cluster como diretório home do usuário mpiuser, não será necessário configurá-las novamente.

 

1.1.6. Instalação e configuração do MPICH2

O MPICH será instalado através da compilação manual, para que possamos desta forma utilizar a versão estável mais atualizada e também para que o diretório destino dos binários e bibliotecas seja acessível para todos os servidores do cluster através da montagem do /cluster.

Para isso acesse o terminal como root.

Será necessário instalar os compiladores necessários através do seguinte comando:

root@deb01:~# apt-get install build-essential gfortran

Após a instalação, acesse o terminal como mpiuser através do seguinte comando:

root@deb01:~# su - mpiuser

Acesse o /cluster e crie os diretórios src e mpich através do seguinte comando:

mpiuser@deb01:~$ mkdir mpich2 src

Acesse o /src

Faça o download da última versão estável do MPICH2 (1.4.1p1) através do seguinte comando:

mpiuser@deb01:~/src$ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.4.1p1/mpich2-1.4.1p1.tar.gz

Após o download descompacte o seguinte arquivo:

mpiuser@deb01:~/src$ tar -zxf mpich2-1.4.1p1.tar.gz

Após a descompactação, acesse o diretório mpich2-1.4.1p1

Agora será necessário configurar o MPICH2 através do seguinte comando:

mpiuser@deb01:~/src/mpich2-1.4.1p1$ ./configure -prefix=/cluster/mpich2 --with-pm=hydra

Concluindo este procedimento configuramos o MPICH2 para ser instalado em /cluster/mpich2 e juntamente com o Hydra, que fará o gerenciamento dos processos nos servidores do cluster.

Execute a instalação através dos seguintes comandos:

mpiuser@deb01:~/src/mpich2-1.4.1p1$ make
mpiuser@deb01:~/src/mpich2-1.4.1p1$ make install

Após a instalação será necessário adicionar os binários e bibliotecas através da edição do seguinte arquivo:

mpiuser@deb01:~$ vi ~/.bashrc

Insira as seguintes linhas no final do arquivo:

export PATH=/cluster/mpich2/bin:$PATH
LD_LIBRARY_PATH=/cluster/mpich2/lib:$LD_LIBRARY_PATH

Recarregue as novas variáveis no bash através do seguinte comando:

mpiuser@deb01:~$ source ~/.bashrc

Execute os seguinte comandos para verificar se as variáveis foram carregadas com sucesso no bash:

mpiuser@deb01:~$ which mpiexec

Se forem exibidos os paths dos binários e bibliotecas significa que eles já estão disponíveis no PATH do bash sem a necessidade de digitar o caminho completo durante sua próxima execução.

Agora será necessário configurar o arquivo hosts, que será responsável por identificar ao Hydra os servidores que fazem parte do cluster.

Crie o arquivo através do seguinte comando:

mpiuser@deb01:~$ vi /cluster/hosts

Adiciones as seguintes linhas no arquivo

deb01
deb02
deb03

Estas linhas representam respectivamente o servidor master e os servidores slaves do cluster.

 

1.1.7. Instalação e configuração do John the Ripper

O John the Ripper será instalado através dos últimos pacotes estáveis disponíveis no site oficial para que seja compilado de maneira otimizada e esteja acessível a todos os usuários através do /cluster.

Para isso, acesse o terminal como mpiuser:

root@deb01:~# su - mpiuser

Acesse o /cluster

Faça o download do código fonte do John the Ripper através do seguinte comando:

mpiuser@deb01:~$ wget http://www.openwall.com/john/g/john-1.7.9.tar.gz

Após o download, descompacte os arquivos através do seguinte comando:

mpiuser@deb01:~$ tar -zxf john-1.7.9.tar.gz

Acesse agora a pasta com o conteúdo dos arquivos através do seguinte comando

mpiuser@deb01:~$ cd john-1.7.9/src

Agora basta compilar através do seguinte comando:

mpiuser@deb01:~$ make linux-x86-any

Este comando compila o John the Ripper otimizado para uma arquitetura 32 bits comum. Para outros tipos de arquitetura, basta compilá-lo utilizada qualquer uma das arquiteturas listadas através do seguinte comando:

mpiuser@deb01:~$ make clean

Importante: como ele será executado em um dos nós do cluster por hardwares diferentes, é importante que ele seja compilado em uma arquitetura compatível com todos os nós. Neste caso o linux-x86-any garante essa compatibilidade com as máquinas virtuais utilizadas neste post ;p

Certifique-se que o John the Ripper está funcionando normalmente através dos seguintes comandos:

mpiuser@deb01:~$ cd /cluster/john-1.7.9/run
mpiuser@deb01:~$ ./john -test

Será exibida uma tela com os resultados dos testes de performance de todos os algoritmos utilizados.

 

1.2. Configuração dos servidores Slaves

A configuração dos servidores slaves é bem parecida com a configuração do servidor master, a diferença principal será na instalação e configuração de pacotes (bem menor).

Iremos configurar apenas um servidor slave, embora o procedimento é o mesmo utilizado para ‘n’ servidores.

No cenário apresentado estamos utilizando apenas dois slaves: deb02 (10.1.1.2) e deb03 (10.1.1.3).

Para iniciarmos sua configuração, acesse o terminal como root.

Edite o seguinte arquivo para configuração de repositórios:

root@deb02:~# vi /etc/apt/sources.list

Configure conforme as informações abaixo:

deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
deb http://ftp.br.debian.org/debian/ squeeze-updates main
deb-src http://ftp.br.debian.org/debian/ squeeze-updates main
deb http://ftp.br.debian.org/debian squeeze main

Em seguida atualize repositório e os pacotes do sistema através do seguinte comando:

root@deb02: ~# apt-get update
root@deb02: ~# apt-get upgrade all

 

1.2.1. Configurações de Rede

Acesse o terminal como root

Edite o seguinte arquivo para configuração de endereços de rede:

root@deb02:~# vi /etc/network/interfaces

Configure conforme as informações abaixo:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 10.1.1.2
netmask 255.255.255.0

Inicie a segunda interface de rede através do seguinte comando:

root@deb02:~# ifup eth1

Agora iremos desabilitar o ipv6 em nosso servidor para garantir uma melhor compatibilidade com os serviços utilizados.

Também serão configurados os ips dos servidores utilizados no cluster, uma vez que não será utilizada a resolução de nomes DNS.

Portanto edite o seguinte arquivo para desabilitar o uso local do ipv6 e configurar os ips dos servidores do cluster:

root@deb02:~# vi /etc/hosts/

Configure conforme as informações abaixo:

127.0.0.1 localhost
10.1.1.1 deb01 # master
10.1.1.2 deb02 # slave
10.1.1.3 deb03 # slave

Agora será necessário desabilitar o ipv6 na inicialização do sistema, portanto será necessário digitar o seguinte comando

root@deb02:~# echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf

Agora iremos desativar o IPv6 utilizado pelo exim, para evitar que o serviço comece a gravar mensagens de erro nos logs do sistema pois o ipv6 está desativado.

Pare reconfigurar o exim, basta executar o seguinte comando:

root@deb02:~# dpkg-reconfigure exim4-config

Será exibida a tela de configuração do serviço. Basta configurá-lo conforme o seguinte procedimento:

Clique em Ok para prosseguir
Selecione Sem configuração no momento e clique em Ok para prosseguir
Clique em Sim para deixar o sistema de mensagens não configurado
Clique em Não para não dividir os arquivos de configuração

Reinicie o servidor para que todas as alterações tenham efeito

 

1.2.2. Configuração de usuário e permissões

Para utilização o cluster com MPICH2 é necessário que todos os usuários tenham o mesmo UID e GUID em todas as estações utilizadas.

Para isso iremos configurar um usuário e grupo para utilização deste serviço.

Crie o usuário através do seguinte comando:

root@deb01:~# groupadd -–gid 1100 mpigroup
root@deb01:~# adduser –-home /cluster -–uid 1100 -–gid 1100 mpiuser --disabled-password --quiet

Apenas confirme todas as informações sobre o usuário.

 

1.2.3. Instalação do SSH

Para instalar o SSH acesse o terminal como root.

Digite o seguinte comando para iniciar a instalação:

root@deb02:~# apt-get install openssh-server

 

1.2.4. Configuração do /cluster nos servidores slaves

O /cluster deverá estar acessível a todos os servidores do cluster podendo ser montado manualmente ou automaticamente (melhor ;p) durante o boot.

Neste projeto post iremos utilizar o mapeamento automático.

Para isso acesse o terminal como root.

Digite o seguinte comando:

root@deb02:~# echo 'deb01:/cluster /cluster nfs defaults 0 0' >> /etc/fstab

Para testar o mapeamento, digite o seguinte comando:

root@deb02:~# mount -a

 

2. Verificando o funcionamento do cluster + John the Ripper

A partir de agora, toda utilização do cluster será feita no servidor master (deb01), que ficará responsável por controlar os processos em todos os servidores slaves.

Iremos iniciar novamente o teste de algoritmos do John the Ripper em modo cluster.

Para isso digite o comando abaixo:

mpiuser@deb01:~$ mpiexec -f hosts -n 3 john-1.7.9/run/./john -test

Neste momento é possível observar nos servidores slaves o consumo de memória de processamento através do comando top

 

3. Quebrando senhas com o John the Ripper em cluster

Agora iremos executar o John the Ripper em modo cluster para quebrar as senhas dos usuários locais do servidor.

Para isso, acesse o terminal como root

Faça uma cópia dos arquivos /etc/passwd e /etc/shadow para o /cluster através do seguinte comando:

root@deb01:~# cp /etc/passwd /etc/shadow /cluster

Acesse o diretório dos binários do John the Ripper através do seguinte comando:

root@deb01:~# cd /cluster/john/run

Agora iremos executar o unshadow, que será responsável por unir as informações dos arquivos copiados anteriormente em um único arquivo.

Para isso digite o seguinte comando:

./unshadow /cluster/passwd /cluster/shadow > /cluster/senhas

Vale lembrar que você também pode editar este arquivo e remover as contas de usuário locais que não sejam utilizadas (as contas estão em texto limpo e as senhas criptografadas em seguida).

Agora será necessário que as permissões sejam alteradas para que todos os usuários do cluster tenham acesso ao arquivo.

Para isso execute os seguintes comandos:

root@deb01:~# chown mpiuser:mpigroup /cluster/senhas
root@deb01:~# chmod 660 /cluster/senhas

Entre com o usuário mpiuser

Acesse os binários do John the Ripper através do seguinte comando:

mpiuser@deb01:~$ cd /cluster/john-1.7.9/run

Agora iremos iniciar o cluster através das indicação dos hosts presentes no arquivos hosts juntamente com a execução do John the Ripper através do seguinte comando:

mpiuser@deb01:~$ mpiexec -n 3 -f hosts ./john /cluster/senhas

O comando acima foi responsável por executar o John the Ripper no arquivo senhas através do mpiexec utilizando 3 núcleos dos processados dos nós indicados no arquivos hosts.

O tempo de quebra de senhas pooderá variar de acordo com o tamanho e caracteres utilizados e também com a capacidade de processamento de todos os nós do cluster.

Conforme as senhas são quebradas, serão sendo exibidas automaticamente na tela.

 

Fontes de Pesquisa

http://openwall.com/john/doc/

http://www.mcs.anl.gov/research/projects/mpich2/

http://www.petur.eu/blog/?p=59

(Apostila Servidores de Aplicação Linux), Profº Erivelton Nunes – Uniararas

 

Conclusão

Vimos de um modo prático como montar um cluster de alta performance com quantos nós desejarmos utilizando tecnologia open source (e gratuita) para quebra de senhas.

Vale lembrar que com o cluster configurado, ainda é possível utilizá-lo para qualquer propósito (não apenas quebra de senha) que possa utilizar os benefícios do processamento distribuído.

E claro, o John the Ripper pode ser utilizado para vários outros algortimos e combinado com dicionário de palavras, regras e até hashs pré-definidos. Mas isso tudo já merece um outro post ;p

 

Espero que tenham gostado e que também possa ser útil!

Qualquer dúvida, sugestão, melhoria – Arrebentem nos comentários ;p

 

[]’s