Coluna do Kurt
COLUNA
Acesso permitido
Terceirizar a autenticação oferece acesso a mais
serviços – por um preço. Vamos examinar os
prós e contras da autenticação distribuída.
N
o mês passado, falamos sobre o gerenciamento de senhas. Ainda aprofundando este tema,
surge a pergunta: o que os administradores de
servidores e sistemas podem fazer para facilitar a vida
dos usuários e deles mesmos? Uma solução óbvia à proliferação de nomes de usuários e senhas é permitir de
alguma forma um único acesso de uma conta a múltiplos serviços. Tradicionalmente, este processo era feito
com serviços de autenticação federados, como LDAP,
Kerberos e assim por diante. Esta técnica funciona bem
para organizações específicas, mas é improvável que
sites deem a qualquer pessoa a possibilidade de criar e
utilizar contas aleatoriamente.
OpenID
Hoje em dia, o OpenID parece ser a única possibilidade
segura e viável para fornecer autenticação distribuída,
mas mesmo nele, muita coisa mudou. Por exemplo, o
suporte é muito melhor e é incluído por padrão em várias distribuições Linux, além de beneficiar-se de vários
anos de uso operacional, o que auxiliou no aperfeiçoamento da ferramenta.
Terceirizar a autenticação
Uma das maiores vantagens da terceirização da autenticação é a possibilidade de escolher um provedor que
consiga oferecer os serviços que você não consegue. A
autenticação com dois fatores, por exemplo, requer outros servidores, licenciamento de softwares e também
a aquisição e transporte de dispositivos de hardware
Figura 1Link de login OpenID no MediaWiki.
16
para os clientes. Vários provedores OpenID suportam
a autenticação de dois fatores, permitindo pegar uma
carona em seus sistemas. Com essa técnica, é possível
reduzir a quantidade de informações sensíveis que é
preciso armazenar e gerenciar. Além disso, um ataque
de SQL Injection (injeção de scripts SQL maliciosos
em um sistema) contra seu serviço de autenticação é
muito menos problemático quando não há hashes de
senhas para roubar e quebrar.
Além disso, é possível manter seu próprio gerenciamento e verificações de identidades internamente. Por exemplo, é possível permitir que os usuários
usem um OpenID para fazer login e depois mapeá-los
a uma conta interna com seu nome real e assim por
diante. Terceirizar o gerenciamento da autenticação
não significa abrir mão das suas próprias verificações
e considerações.
Uma grande desvantagem de terceirizar a autenticação é o fato da perda do controle do que acontece por
trás do sistema de autenticação. Um provedor pode usar
uma função de hash fraca para armazenar as senhas
(por exemplo, MD5) ou pode ter outros problemas (por
exemplo, vulnerabilidades à injeção SQL) dentro de seu
site. Um exemplo disso é o clássico ataque de tempo,
descoberto em uma versão antiga de uma biblioteca
do OpenID. Usando esse ataque, um agressor poderia
adivinhar senhas uma letra de cada vez, verificando o
primeiro caractere em busca de a a z, A a Z etc., partindo depois para o segundo caractere, e assim por diante.
Desta forma, até uma senha com 20 caracteres levaria
apenas alguns poucos milhares de tentativas para ser
descoberta (em vez de 100 elevado a 20, supondo a-z,
A-Z, 0-9 etc.).
As bibliotecas dos protocolos mais antigos, como
LDAP e Kerberos, geralmente já corrigiram tais pro-
www.linuxmagazine.com.br
Kurt | COLUNA
blemas, possuindo menos vulnerabilidades desconhecidas do que protocolos como o OpenID. Outro
problema de fontes externas de autenticação é estabelecer um caminho seguro entre você e ela. Alguns
provedores de OpenID não usam HTTPS, então a
requisição inicial pode ser suscetível a ataques do
tipo man-in-the-middle – embora proteções embutidas possam ajudar.
Essa necessidade de autenticação externa também
significa que seus servidores web precisarão fazer requisições externas para outros sites. Portanto, será preciso
criar portas de saída em seu firewall, e você deve usar
um proxy para o tráfego web de saída (para conseguir
logá-lo) ou usar um sistema IDS para encontrar ataques na saída.
Significado de um nome
Outra questão dos sistemas de autenticação distribuída como o OpenID diz respeito a namespace. Por
exemplo, o kurtseifried no WordPress sou eu, mas o
kurtseifried no Yahoo! não sou eu. Então, quando você
usa nomes de contas OpenID, também é preciso usar
Linux Magazine #75 | Fevereiro de 2011
a porção do nome fornecida pelo provedor, caso contrário haverá conflitos.
Alternativamente, é possível usar a conta OpenID
com fins de autenticação e depois mapeá-la para uma
conta local. Esta técnica tem ainda a vantagem de não
permitir que um agressor insira caracteres estranhos no
nome de usuário ou domínio do nome da conta, o que
poderia causar problemas no futuro (por exemplo, ataques de injeção SQL ou estouros de buffer).
Conexão ao OpenID
Então, como plugar o OpenID a um aplicativo
web? O MediaWiki é um ótimo exemplo, pois é
comum querer que as pessoas façam login antes de
editar documentos, para minimizar o vandalismo
ou simplesmente rastrear quem mudou o quê. Para
começar, será preciso suporte ao OpenID no PHP
(linguagem do MediaWiki e da maioria de suas extensões). Para isso, você pode usar o OpenID Enabled
[1], disponível como pacote no Debian, o Fedora e
em várias outras distribuições Linux importantes, ou
você pode obter os fontes e instalá-los manualmente.
17
COLUNA | Kurt
Quadro 1: Quebras de senhas
Como questão de política, a maioria dos sites agora fazem verificação de senhas usando uma função de sentido único; portanto, se um agressor roubar o arquivo de
senha, não conseguirá descobri-las.
Esta teoria, no entanto, tem alguns problemas: GPU e
armazenamento barato. GPUs como a Tesla da NVIDIA
(que agora está disponível para aluguel na Amazon EC2)
possuem várias centenas de núcleos que, apesar de
não serem bons para computação de propósito geral,
são ideais para tarefas altamente paralelizáveis, como
quebra de senhas. Se você adicionar armazenamento
barato a esta mistura, o agressor poderá gerar enormes
listas de senhas criptografadas. Existem vários sites [8]
de busca MD5 que permitem fornecer um hash MD5,
esperar alguns segundos e receber uma entrada que
gerará a senha.
Então, ao escolher um algoritmo de hash, lembre-se de
que os mais velhos (como o MD5) e os mais rápidos
(como o SHA1) não são exatamente os ideais.
Note que, no Fedora, o pacote se chama php-pearAuth-OpenID.noarch.
Após o pacote ser instalado, será necessária a extensão MediaWiki OpenID [2], também disponível como
pacote no Debian, Fedora (chamada media-wiki-openid.
noarch), e assim por diante. Ativar a extensão do MediaWiki é trivial; basta inserir a seguinte linha de include no
seu arquivo LocalSettings.php: require_once(“extensions/
OpenID/OpenID.setup.php”);.
Em seguida, é possível criar outra tabela (usando o
script openid_table.sql) no banco de dados do MediaWiki, que será usada para mapear as contas do OpenID
aos nomes de usuários locais. Note que nem todos os
nomes de usuários OpenID são compatíveis com as
exigências de contas do MediaWiki. Depois, você pode
clicar no link para fazer login e definir seu nome de
usuário local no MediaWiki.
Há amplo suporte ao OpenID em outras linguagens
de programação, como listas de bibliotecas que podem
ser conferidas em [3].
Serviços OpenID
Usar o OpenID é muito fácil, mas e se você quiser
fornecer serviços OpenID para que seus usuários se
beneficiem de uma conta única para múltiplos serviços? Vários provedores de hospedagem, como o Google, agora oferecem suporte a OpenID para usuários
de empresas e estudantes, mas, infelizmente, não para
a versão gratuita do Google Apps para domínios particulares. Se você possui uma conta no Yahoo!, pode
18
ir para o endereço [4] para ativar o uso de OpenID
com sua conta (o melhor a fazer é digitar no Google
o nome do seu provedor + OpenID). Para criar seu
próprio servidor OpenID, não existem tantas alternativas assim [5].
OAuth e PAPE
Talvez você ainda não tenha ouvido falar do OAuth
[6] ou do PAPE [7] – eu também não tinha. O OAuth
oferece uma camada de interface entre o OpenID e
a autenticação dos serviços. Com isso, é possível, por
exemplo, dar acesso a fotos hospedadas em um site de
compartilhamento de fotos em algum local protegido
sem precisar informar seu nome de usuário e senha ao
aplicativo. Basicamente, o OAuth oferece uma forma
fácil de interagir com servidores OpenID de forma
transparente aos usuários.
O PAPE é a OpenID Provider Authentication Policy Extension, uma forma sofisticada de dizer que um
site que usa o OpenID também pode definir regras
como “somente permitir que contas do OpenID tenham autenticação de dois fatores usando um token
físico”. Esta possibilidade reduz a probabilidade de
uma conta comprometida conseguir acessar seu serviço (quadro 1). n
Mais informações
[1]OpenID Enabled:
http://www.janrain.com/openid-enabled
[2]Extensão OpenID do MediaWiki:
http://www.mediawiki.org/wiki/Extension:OpenID
[3]Bibliotecas OpenID: http://wiki.openid.net/
w/page/12995176/Libraries
[4]OpenID no Yahoo!: http://openid.yahoo.com/
[5]Seu próprio servidor de identidade:
http://wiki.openid.net/w/page/12995226/
Run-you-own-identity-server
[6]OAuth: http://oauth.net/
[7]PAPE: http://openid.net/specs/openidprovider-authentication-policyextension-1_0.html
[8]Lookup reverso de hash MD5:
http://tools.benramsey.com/md5/
Kurt Seifried é consultor de segurança da informação especializado em
redes e Linux desde 1996. Ele frequentemente se pergunta como a tecnologia
funciona em grande escala mas costuma falhar em pequena escala.
www.linuxmagazine.com.br
Download

Acesso permitido - Linux Magazine Online