You are on page 1of 9

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Armazenamento de senhas no Linux


Autor: Elgio Schlemer <elgio.schlemer at gmail.com> Data: 08/02/2008 Introduo Autenticar um usurio em um sistema sempre foi alvo de pesquisa. Para que um sistema aceite o usurio necessrio que ele, de alguma forma, prove que ele o usurio que diz ser. A autenticao sempre baseada em trs princpios, sendo que a combinao de mais de um deles aumenta a segurana; 1) baseado no que voc tem Neste tipo de autenticao o usurio precisa provar que tem a posse de alguma coisa, supondo que somente o usurio real tem este objeto. No estou falando de senha, pois a senha o usurio "no tem", ele "conhece". Um exemplo bem atual deste sistema o carto de banco. Se voc no tiver o carto no poder se autenticar perante o terminal de saque. 2) baseado em algo que voc Neste caso o sistema identificar voc pelo que voc . Resumindo em uma nica palavra: BIOMETRIA. Autenticao por impresso digital, anlise da retina e outras mais sofisticadas e ainda em estudo como reconhecimento facial so exemplos deste tipo de autenticao. 3) baseado no que voc sabe Aqui entra o foco deste estudo. Voc ser reconhecido pelo sistema se souber um segredo que, supostamente, ningum mais saberia. Aqui entra a senha. Muitos sistemas crticos de segurana usam mais de um tipo de autenticao podendo at usar os trs ao mesmo tempo. Bancos geralmente usam o tipo 1 e tipo 3. Voc tem um carto mas tambm precisa conhecer a senha, no raro mais de uma (senha, trs letrinhas, ltimos dgitos do carto que voc tem e as vezes informaes pessoais do seu cadastro). Sistemas computacionais geralmente usam somente a senha para autenticar o usurio. O problema : como armazenar com segurana as senhas de todos os usurios? A maneira mais infantil e, claro, no usada nem mesmo pela Microsoft armazenar as senhas em um arquivo texto ou em um Banco de Dados. muito fcil prever o desastre que pode ocorrer se algum roubar este arquivo, fato que muito freqentemente ocorre em sites da Internet que insistem em armazenar senhas desta forma precria. Mas existem outras, sendo que a melhor delas ainda HASH com salt numbers.

1 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Senha em um simples arquivo texto O primeiro mtodo que se possa pensar ter um arquivo com as senhas. Cito este mtodo porque infelizmente ele ainda amplamente usado em sites. Usarei exemplos de arquivos, mas o conceito vale para banco de dados (algum pode pensar que o BD tem maior segurana porque exige autenticao. Ora, em um ataque supe-se que o atacante invadiu a mquina e teve plenas condies de ler os fontes de teu PHP para ver a senha do Banco de Dados!). Se este mtodo fosse o usado no Linux, poderamos imaginar um arquivo /etc/passwd deste jeito: elgio:teste123:Elgio Schelmer:/home/elgio:/bin/bash O formato do arquivo /etc/passwd realmente este, com cada campo separado com dois pontos, mas a senha no fica armazenada assim em texto claro. A autenticao seria fcil: usurio fornece seu login, sistema l o arquivo de senhas e l pega a senha dele (teste123). Usurio fornece senha, se for realmente "teste123" ele acertou a senha e pode se logar. Contudo muito fcil imaginar os problemas: qualquer um que tivesse acesso de leitura no arquivo /etc/passwd (e no Linux TODOS precisam ter este acesso) poderia ver a senha de todos. Alm do mais se algum roubasse este arquivo teria ali, sem dificuldade a senha at do root. Sem dvida um mtodo extremamente ingnuo e no deveria ser usado para nada, absolutamente nada.

Senha em um arquivo criptografado Rapidamente algum poderia pensar: bom, posso criptografar o arquivo de senhas, assim mesmo com permisso de leitura a leitura de nada adiantaria. Poderia usar os excelentes algoritmos como o AES128 para realizar esta cifragem. O problema deste mtodo que algoritmos de criptografia requerem chave. S a Microsoft conseguiu a faanha, at hoje sem nenhum sentido para mim, de criptografar pastas no Windows 2000 sem que o usurio precisasse colocar uma chave. Se o arquivo de senhas ou mesmo parte dele estiver cifrado, significa que ele possui uma chave que permite abr-lo. O fato : "quem conhece esta chave"? Criptografia tem muitas utilidades como cifrar documentos para que somente pessoas autorizadas possam abrir. Eu mesmo tenho uma partio inteira cifrada e para mont-la eu preciso sempre fornecer a chave. Quando se envolve criptografia ou se solicita a chave cada vez que for abrir o arquivo ou se memoriza ela. Esta soluo no se aplica para este problema pois: a) no se pode solicitar a chave ao usurio pois ele no a conhece. Se ele a conhecesse significa que poderia abrir o arquivo de senhas e novamente ler a senhas de todos, at do root. b) o Sistema Operacional quem precisa conhecer a chave, logo ele precisa memoriz-la. Isto, a princpio pode parecer aceitvel, mas lembre-se que sempre estamos trabalhando com a hiptese de algum invadir o sistema. O que o impediria de ler a senha que o SO armazena? O Windows em sua criptografia de pastas assim. Ele fica com a chave.

2 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Para este problema esta soluo definitivamente no serve. O arquivo de senhas no pode ser criptografado porque uma chave poderia abrir ele. Aos mais ntimos com criptografia observem que estou falando de criptografia no de HASH! Na verdade s existe uma nica soluo possvel: simplesmente no armazenar a senha em lugar algum. Isto mesmo. O Linux e demais Sistemas Operacionais no sabem a tua senha. Sim, eles no tem ela, no a armazenam em lugar algum. Isto possvel atravs da tcnica de hash.

Algoritmos de HASH Muita confuso se faz quanto aos algoritmos de HASH. Muitos acham que ele um algoritmo de criptografia. No . Pertence a cincia da criptografia, alguns so at baseados em algoritmos de criptografia, mas o que quero deixar claro que Algoritmos de HASH no servem para cifrar. HASH so tambm conhecidos como "algoritmos de mo nica". Qualquer coisa que se "cifra" com eles impossvel matematicamente de se recuperar. Alm disso eles possuem outras caractersticas: a) no possuem chave. Gerar o hash no envolve nenhum segredo que deva ser compartilhado. b) tamanho nico. No importa o quo grande a informao original, o hash ser sempre de um mesmo tamanho. Como exemplo o famoso e depreciado MD5. Ele tem 128 bits de tamanho, mesmo que seja o HASH de uma nica letra (8bits) ou de um arquivo de 1GB! c) infinitos hashes para uma mesma mensagem. Isto meio confuso de entender e pode at parecer uma fraqueza. Novamente o caso do MD5: como ele possui sempre 128 bits, o nmero de hashes MD5 existentes no Universo grande, mas limitado e conhecido. 2128. Contudo o nmero de mensagens infinito. No tem hashes nicos para cada diferente mensagem no Universo. Logo, tem mensagens que possuem o mesmo HASH. Se o HASH da frase "Eu sou Viva o Linux" tiver como HASH FE:45:56, existem outras infinitas mensagens que gerem o mesmo hash FE:45:56. Isto vale para qualquer algoritmo de hash e no significa uma fraqueza, apenas uma concluso matemtica. Descobrir duas ou mais mensagens que geram o mesmo hash chamado de coliso, coisa que o pessoal de Banco de Dados estuda (porque se usa hash como mtodo de pesquisa em BD). Para tornar mais fcil entender o que um algoritmo de HASH eu costumo apresentar em sala de aula o "HASH by Elgio". Um HASH podre, fraco, mas fcil de entender. Meu algoritmo de HASH consiste em simplesmente somar os bytes de uma frase, com teto de 255 (255 +2 = 257 = 2). Matematicamente pode-se expressar como o Modulo 256 da soma de todos os bytes. Depois de somar todos os caracteres o byte final considerado o hash. Na frase "Viva o Linux" tem-se os seguintes bytes:
'V' 'i' 'v' 'a' ' ' 'o' ' ' 'L' 'i' 'n' 'u' 'x' 086 105 118 097 032 111 032 076 105 110 117 120 Soma dos bytes = 1109 1109 mod 256 = 85

Neste caso o Hash de "Viva o Linux" atravs do algoritmo "by Elgio" seria 85. Veja que pelo meu mtodo no importa o tamanho da frase, o HASH ser sempre um nmero entre 0 e 255. Isto serve para explicar a propriedade que eu citei de que o hash sempre do mesmo tamanho.

3 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Mas a grande pergunta para que serve isto (no este meu algoritmo que s serve para fins didticos). Se eu previamente conheo o HASH (85) e algum me apresenta a frase "Grande Linux" dizendo que ela do hash armazenado, ao verificar eu percebo que a frase fornecida possui o HASH 129. Como no 85, esta frase no deste hash. A grande sacada do arquivo de senhas do Linux armazenar apenas o HASH. Se minha senha fosse "Viva o Linux" o arquivo de senhas teria apenas 85. Se eu digitar corretamente a senha o SO dever calcular os mesmos 85 o que indica que acertei a senha. Assim o sistema no precisa armazenar a senha, mas somente o HASH. No se apressem em falar mal deste meu HASH by Elgio! Ele ruim mesmo e bom que seja para meus fins didticos. O problema que com este meu algoritmo de HASH ridculo muito fcil algum, at com papel e lpis, chegar aos mesmos 85 sem saber a frase. De cara eu percebo que apenas a letra 'U' j resolve meu problema pois ela justamente 85. Apresentei este algoritmos by Elgio para explicar o que HASH, mas no como exemplo de um que possa ser usado. Ele no resiste ao mais simples ataque: o da fora bruta. Um algoritmo de HASH srio precisa fazer exatamente isto, reduzir cadeias de bytes para uma sequncia menor de tamanho reduzido, mas sem que algum tenha meios de quebrar. O MD5 bom nisto. Como seus 128 bits, um ataque de fora bruta poderia levar at 2128 possibilidades (um cara muito azarado). Considerando que no existem caras to azarados de acertar justamente na ltima tentativa, trabalhar com a metade uma boa medida. Qual a metade de 2128? NO NO!! No 264 A metade de 2128 2127! Isto ainda d 170141183460469231731687303715884105728 possibilidades! (Voc consegue ler este nmero? ) Vamos a uma simulao: se eu tiver 5.000.000 de computadores, cada um deles com 100.000 processadores de 100Ghz que consiga a faanha de realizar uma tentativa por ciclo de clock (100G tentativas por segundo), o tempo estimado para quebrar seria: 170141183460469231731687303715884105728 / 100.000.000.000 / 100.000 / 5.000.000 Dividi por 100 bilhes porque quantas tentativas um processador completa por segundo (100Ghz), dividi por 100.000 porque cada computador tem cem mil processadores e dividi novamente por 5.000.000 porque tenho cinco milhes de computadores iguais a este. Ainda assim isto resulta em 3.402.823.669.209.384 segundos ou 107.902.830 anos! Bem vindo a fora da matemtica da fora bruta. Novamente, aos j iniciados em criptografia, estou falando de fora bruta sendo que bem sabemos que existem atalhos em alguns mtodos.

4 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Resumindo: existem algoritmos de HASH que so impossveis de se quebrar por fora bruta. MD5 ainda um exemplo deles (as vulnerabilidades descobertas no MD5 tem ver com colises no com fora bruta). Tais algoritmos podem ser usados para nosso propsito e de fato o so!

Armazenando senhas com segurana A soluo bvia: ao invs de armazenar uma senha eu armazeno o HASH dela. Jamais armazeno a senha. As vantagens so muitas pois nem mesmo o root sabe a senha de um usurio. Ele tem poderes para sobrescrev-la mas no para saber qual era. Para exemplificar e antes de falar como isto realmente fora implementado no Linux, vou dar novamente um exemplo hipottico usando MD5 que todos podem reproduzir em seus Linux, em uma shell. Meu arquivo de senhas : login:HASH:Nome:HOME:BASH Usurio Elgio est cadastrado e vai cadastrar a sua senha: Changing password for elgio (current) UNIX password: Elgio digita como senha "Ola345". O Sistema Operacional calcula o hash de Ola345. Vamos calcular assim: $ echo "Ola345"|md5sum 2d3956215ec2d09484165c0d5261303c Est ai o hash. O sistema armazena: elgio:2d3956215ec2d09484165c0d5261303c:Elgio Schlemer:/home/elgio:/bin/bash Em algum momento o Elgio vai se autenticar e fornecer a sua senha. Veja que nem o Linux sabe qual a senha. A nica coisa que ele sabe que seja l qual for a senha, o hash dela 2d3956215ec2d09484165c0d5261303c! Se elgio digitar como senha "Ola346" (senha ERRADA), o sistema calcula o HASH do que o usurio digitou: $ echo "Ola346"|md5sum 23d863d17e7b64552104747ad3c30522 Veja que no e nem passou perto do hash armazenado. Usurio errou a senha. Este simples mtodo j muito bom e pode ser usado nos sistemas de autenticaes de pginas WEB com muita facilidade. Qualquer um tem implementao de MD5. 128 bits lhe parecem pouco? Use o SHA1 ento. O Windows usava (desconheo o que usa o Vista) o fraco algoritmo RC4 para cifrar suas senhas e ainda

5 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

com o agravante de no diferenciar letras minsculas de maisculas no lampasswd (lam pode bem lembrar "lambana". Eu realmente no falo mal da Microsoft mas neste ponto eles realmente pisaram na bola. Quem administra Windows DESATIVE URGENTEMENTE senhas no formato lampasswd). No NTpassword melhorou muito com o uso do MD4 armazenando-as em formato HEXA decimal. Trata-se de um HASH da senha em Unicode feita vrias vezes (tive que implementar em PHP isto!! tsctsctsc) Mas o Linux vai ainda alm disto... Antes de mostrar como o Linux trata suas senhas, vamos ver os possveis ataques que este sistema pode sofrer.

Ataques ao Sistema de HASH Basicamente existem trs ataques que podem ser feitos, sem falar do cara olhando por cima do teu ombro enquanto voc digita a senha! a) O primeiro ataque o de fora bruta. Neste o atacante tem a posse do hash, mas no sabe que senha gerou ele. Ele pode tentar todas as possibilidades at conseguir. Ai entra o esforo de milhares de anos para o MD5 que mencionei. b) ataque do dicionrio: para que realizar fora bruta se os usurios colocam senhas fceis baseadas em palavras conhecidas. Mesmo o algoritmo mais forte do mundo perecer se o idiota do usurio colocar como senha 1234. Ou ainda, baseado em seu login (elgio08 por exemplo). Neste ataque se usa palavras do dicionrio para tentar combinaes que usurios comuns tentariam. IMPRESSIONANTE como ainda hoje este ataque quebra mais de 70% de senhas de usurios. c) ataque por comparao de hashes. Neste o atacante tem um Banco de Dados com inmeros hashes pr-compilados. Ao ver um HASH ele consulta se j no um hash conhecido. Existem na Internet sites que fazem isto. O ataque de fora bruta se resolve adotando um bom algoritmo como o MD5 (bom neste sentido. No pensem que estou defendendo o MD5, s que contar as fraquezas dele vai alm do objetivo deste artigo). Mesmo o jurssico DES com seus 56 bits de chave ainda forte para resistir por meses um ataque de fora bruta realizado por UM NICO PC. O ataque do dicionrio no tem soluo!! Sim, vai enfiar na cabecinha dos usurios que eles devem colocar uma senha difcil, com pelo menos SEIS caracteres, sem usar apenas nmeros, etc, etc... Ou ele te ignora ou escolhe a tal senha difcil e a escreve embaixo do teclado para no esquecer. A soluo passa pelo treinamento deste sersinho: o usurio! O ataque por comparao se resolve com "salt numbers", uma lio que a Microsoft insiste em no aprender.

Uso de salt number Seu uso no recente, pelo contrrio, desde que conheo UNIX j existem os salt numbers. O fato que a senha "Teste" sempre ter o mesmo hash, certo? No caso do MD5, como vimos, o HASH ser:

6 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

$ echo "Teste"|md5sum 26e71657bf4137cbc676dc982aad3c5b E se dois usurios colocarem a mesma senha "Teste"? E se algum j tem em seu banco de dados o hash da palavra "Teste"? Danou-se! Dois usurios tendo a mesma senha significa que seus hashes seriam idnticos. No mnimo um dos usurios mais atentos veria no arquivo de senhas que o HASH do outro igualzinho ao seu. Isto INADMISSVEL! E a Microsoft no usa salt numbers... tsctsc Salt number consiste em misturar ao hash caracteres aleatrios. Por serem aleatrios no so escolhidos pelo usurio, mas sim pelo programa que cadastra senha. Veja que se eu introduzir apenas um nmero de 0-9 como salt j crio 10 possibilidades diferentes para a palavra "Teste". Se eu colocar 3 caracteres como hash e eles podendo ser apenas nmeros (000 a 999) crio mil possveis hashes. Qual a implicao disto? Se algum quiser pr-compilar e armazenar o hash da palavra "Teste" ter que armazenar 1000 deles. Mas o Linux usava para o hash DES DOIS caracteres e no precisavam ser apenas nmeros. Podiam ser letras, nmeros e alguns smbolos. Deixemos os smbolos de lado e fiquemos com as letras e nmeros. De A-Z temos 26 possibilidades, de a-z mais 26 e de 0-9 temos 10. Cada posio pode ser uma dentre 62 possibilidades. Como temos duas letras, tem-se um total de 62^2 hashes possveis o que nos d 3844 possveis hashes. Isto que deixei smbolos de lado. O que isto quer dizer? Quer dizer que se algum quiser armazenar o hash da palavra "Teste" ter que computar todos os possveis 3844 hashes dela e armazenar todos. E tudo outra vez para a palavra "TEste" que j no a mesma. Quer saber do melhor? Hashes DES t depreciado. Caiu! At o MD5 j est depreciado, contudo o atualmente usado. No MD5 o salt number pode ter vrios caracteres! Com QUATRO caracteres o nmero de hashes pula para algo perto de 14 milhes. Atualmente se usam OITO caracteres. uma estupidez que inviabiliza por completo o ataque por comparao.

Como o Linux armazena Enfim, depois desta teoria para explicar o porque das coisas, vamos a como HOJE o Linux armazena senhas e o porque deste mtodo. O Linux ainda aceita hashes no formato DES (veja minhas referncias no final do artigo), alm do MD5 e SHA1. O formato DES facilmente identificado. Exemplo de um hash DES: Hash DES da palavra teste: rtyBls.8pJAuo No caso do DES, sempre os primeiros dois cars so o salt number. Claro, se o salt number gerado aleatoriamente ele precisa ser armazenado. O restante o hash de teste com o salt number "rt". No exemplo rtyBls.8pJAuo tem-se: rt = salt number yBls.8pJAuo = hash gerado

7 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

Os hashes MD5 e posteriores comeam com $. A presena de $ indica que no DES. Um $1$ no incio do hash indica ser MD5 enquanto um $2$ indica ser SHA1 (d um cat no teu /etc/shadow agora e veja). Aps o $1$ ou $2$ vem o salt number at o prximo $. Depois vem o HASH propriamente dito em formato base64. Exemplo para a palavra teste: $1$F1CsIATU$HUmNHU5PSCRmRA.EYHYy0. $1$ = MD5 F1CsIATU = salt number usado HUmNHU5PSCRmRA.EYHYy0. = hash da palavra teste com o salt number. Na hora de gerar o hash MD5 o Linux faz centenas de vezes o processo. O Hash calculado recursivamente vrias e vrias vezes, usando hora o salt number, hora a senha, ora algum outro hash. Realizar o MD5 centenas ou mesmo milhares de vezes no o torna mais forte, mas sim o torna MAIS LENTO! Sim, mais lento. Se eu desacelerar o processo em centenas de vezes significa tornar mais lento uma fora bruta tambm centena de vezes. Ento, quando a senha cadastrada o sistema gera um salt number, calcula o hash da senha com o salt number, armazena salt + hash e ESQUECE a senha. Para verificar, o usurio digita a senha, o Sistema Operacional l o salt number e recalcula o HASH. Se bater ele acertou a senha. Simples e brilhante.

Concluses e referncias A forma como o Linux (por favor, sim, sim, Unix e FreeBSD tambm. uma boa herana) armazena senhas extremamente segura. Os ataques possveis so por culpa do usurio que insiste em por uma senha fcil. Como objetivo principal deste artigo espero que os programadores armazenem senhas de uma forma mais segura em seus sistemas. Um simples funo de HASH md5 j melhora muito, mas para quem quiser ir mais alm, no custa nada implementar salt numbers. Pode ser at concatenando os salt numbers na senha do usurio. J inviabiliza os ataques, exceto, evidentemente, os de senha fcil. Em uma universidade que ajudei a administrar implementamos uma pgina para trocar senha. Ela no aceitava senhas fceis, como somente nmeros, somente letras, baseadas em login. Usurio usurio e muitos ficavam horas tentando por uma senha ou mesmo desistiam. Usurio sempre o ponto mais fraco. Como convenc-lo a no usar a placa do carro como senha? Se voc o obriga por fora do seu cargo (eu sou o administrador, eu determino que a senha seja assim), voc ter um eterno inimigo ou ainda ter que eles passaro a anotar a senha em algum lugar, como no celular por exemplo. Obrigar eles a trocar a senha a cada seis meses ento... xiiii... Como referncia para este artigo confesso que realmente no consultei nada para escrev-lo. um assunto bem conhecido meu e claro que na minha formao li vrios livros e sites que explicavam. Para escrever este artigo usei como base um email meu que enviei para os alunos de segurana. Este email no igual a este artigo. Ele mais tcnico e dentro de um conceito de aula especfico. Mesmo assim se algum quiser

8 de 9

2/1/2014 10:18

Armazenamento de senhas no Linux [Artigo]

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7812

ver o email eu o coloquei no meu site: http://gravatai.ulbra.tche.br/~elgio/senhas.html (podia simplesmente ter adaptado o email ao VOL, mas preferi escrever outro) Um site para quebrar hashes MD5 ou SHA1 pode ser encontrado em http://passcracking.com/ Tente com estes HASHES: 698DC19D489C4E4DB73E28A713EAB07B = teste 2FE04E524BA40505A82E03A2819429CC = ola Muita gente se surpreende com este site e acha que o mundo acabou, que no existe senha segura... Bobagem... Por fim, eu me empolguei mais do que gostaria neste artigo. Alguns itens, caso seja do interesse, podem ficar para um segundo artigo. No descrevi como realmente e matematicamente a senha gerada (est no email) e nem porque o MD5 j depreciado. Uma boa leitura o artigo Introduo a Criptografia aqui no VOL.

http://www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux Voltar para o site

9 de 9

2/1/2014 10:18