Squid3+Ubuntu10S+Kerberos+AD

12
SQUID3 + UBUNTU LUCID 10.04 + KERBEROS AUTH + ACTIVE DIRECTORY 12:07 Marcell C. Ribeiro Squid e suas autenticações Pessoal, depois de 2 anos utilizando Squid + NTLM na empresa ele começou a dar problemas, eu realizei uma pesquisa sobre as diversas maneiras de autenticação, vou resumir para quem quer aprender um pouco sobre como autenticar o Squid. Para realizar a autenticação o Squid utiliza os chamados helpers, que nada mais são que interfaces que realizam a autenticação e retorna um OK ou um ERR para o proxy. A forma como essa autenticação vai ser negociada é o que define sua segurança, eficiência e compatibilidade. Cabe ao responsável decidir a melhor forma a ser utilizada. Existem basicamente 4 formas de autenticação: Basic (passando a senha em texto puro) A Autenticação Basic é a mais comum, compatível e fácil de ser configurada, porém a mais insegura, qualquer interceptação de pacote é possível capturar a senha do usuário que está navegando. Ela pode ser implementada com diversos helpers, por exemplo pam, httpd, ldap, nsca etc. Há diversos tutoriais sobre esse tipo de autenticação. Digest (passando o hash da senha) Esse tipo de autenticação invés de passar a senha em texto puro passa o hash em MD5 ou SHA-1, isso dificulta um pouco a captura de senhas, porém senhas inferiores a 15 caracteres são facilmente quebradas com ataque de rainbowtables ou de dicionário. Há tutoriais explicando como implementar esse tipo de autenticação com LDAP, porém não achei para o Active Directory, somente para Open LDAP. ntlm (utilizando challenge response) Na autenticação NTLM é realizado um challenge response, ao autenticar o usuário se identifica e recebe um desafio do servidor, o que trafega pela rede é o hash da senha com a resposta do desafio, caso o pacote seja capturado o atacante não terá a senha e sim a senha + alguma coisa, isso dificulta a quebra da senha e aumenta um pouco a segurança. Esse método porém possui 2 defeitos, devido ao desafio, para cada

Transcript of Squid3+Ubuntu10S+Kerberos+AD

Page 1: Squid3+Ubuntu10S+Kerberos+AD

SQUID3 + UBUNTU LUCID 10.04 + KERBEROS AUTH + ACTIVE DIRECTORY

12:07 Marcell C. Ribeiro

Squid e suas autenticações

Pessoal, depois de 2 anos utilizando Squid + NTLM na empresa ele começou a dar

problemas, eu realizei uma pesquisa sobre as diversas maneiras de autenticação, vou

resumir para quem quer aprender um pouco sobre como autenticar o Squid.

Para realizar a autenticação o Squid utiliza os chamados helpers, que nada mais são que

interfaces que realizam a autenticação e retorna um OK ou um ERR para o proxy. A forma

como essa autenticação vai ser negociada é o que define sua segurança, eficiência e

compatibilidade. Cabe ao responsável decidir a melhor forma a ser utilizada.

Existem basicamente 4 formas de autenticação:

Basic (passando a senha em texto puro)

A Autenticação Basic é a mais comum, compatível e fácil de ser configurada, porém a

mais insegura, qualquer interceptação de pacote é possível capturar a senha do usuário

que está navegando. Ela pode ser implementada com diversos helpers, por exemplo pam,

httpd, ldap, nsca etc. Há diversos tutoriais sobre esse tipo de autenticação.

Digest (passando o hash da senha)

Esse tipo de autenticação invés de passar a senha em texto puro passa o hash em MD5

ou SHA-1, isso dificulta um pouco a captura de senhas, porém senhas inferiores a 15

caracteres são facilmente quebradas com ataque de rainbowtables ou de dicionário. Há

tutoriais explicando como implementar esse tipo de autenticação com LDAP, porém não

achei para o Active Directory, somente para Open LDAP.

ntlm (utilizando challenge response)

Na autenticação NTLM é realizado um challenge response, ao autenticar o usuário se

identifica e recebe um desafio do servidor, o que trafega pela rede é o hash da senha com

a resposta do desafio, caso o pacote seja capturado o atacante não terá a senha e sim a

senha + alguma coisa, isso dificulta a quebra da senha e aumenta um pouco a segurança.

Esse método porém possui 2 defeitos, devido ao desafio, para cada requisição http no

proxy ele gera 3 registro no proxy 2 HTTP_DENIED 407 e um HTTP_MISS ou HIT no

momento que a autenticação dá certo, para cada requisição é necessário essa

autenticação, o que perde um pouco de performance.

Outro problema é a incompatibilidade. Esse tipo de autenticação também já não é tão

segura, tanto que vem desabilitado por padrão o suporte a NTLM no Windows7, para

quem quiser testar mesmo assim pode seguir o tutorial do próprio site do Squid:

* http://wiki.squid-cache.org/ConfigExamples/Authenticate/WindowsActiveDirectory

Page 2: Squid3+Ubuntu10S+Kerberos+AD

negotiate

Esse é o tipo de autenticação que abordaremos no artigo, baseia-se na emissão de tickets.

Para configuração é necessário gerar um keymap no AD para o srvsquid funcionando da

seguinte forma, o srvsquid (nome do servidor Squid) confia no srvdc1 (nome do servidor

do AD), o usuário paulo se autentica no servidor srvdc1 e ganha um ticket, uma espécie de

"crachá", onde ele autentica seus acessos ao servidor de arquivos, impressão etc. Ao

tentar acessar a internet é solicitada autenticação e ele mostra esse "crachá" para o

srvsquid, o srvsquid então verifica a validade do crachá com o srvdc1 e se estiver ok ele

dá o acesso, tudo isso é feito de forma segura.

Os tickets duram em média 5 minutos, o que torna improvável a quebra de uma senha

com esse nível de criptografia em tão pouco tempo, após 5 minutos o usuário solicita um

novo ticket. O processo de autenticação é mais leve em termo de performance.

O porém dessa autenticação é a incompatibilidade, só funciona com Internet Explorer 7

pra cima e com o Firefox 3 ou superior (não foram testados Chrome, Opera, Safari etc).

Para questão de compatibilidade é possível configurar uma autenticação do tipo Basic

como alternativa, será descrito no artigo.

Instalando o Kerberos

Instale o Ubuntu Server 10.04 32 bits (versão utilizada).

* Foi utilizado idioma em Português (não creio que vá influenciar se mudar)

* Configurada rede manualmente (Ex: 192.168.1.2)

* Certifique-se que o acesso à internet está configurado

Atualiza a lista de pacotes:

$ sudo apt-get update

Instale o Kerberos:

$ sudo apt-get install krb5-kdc krb5-config krb5-clients libpam-krb5 krb5-user

Faça uma cópia do arquivo krb5.conf:

$ sudo cp /etc/krb5.conf /etc/krb5.conf.OLD

Edite o arquivo /etc/krb5.conf, apague tudo e cole todo o código abaixo, depois configure

de acordo com seu IP e domínio.

Page 3: Squid3+Ubuntu10S+Kerberos+AD

[libdefaults]

default_realm = MEUDOMINIO.COM.BR (usar letra maiúscula)

dns_lookup_realm = no

dns_lookup_kdc = no

ticket_lifetime = 24h

forwardable = yes

# The following krb5.conf variables are only for MIT Kerberos.

krb4_config = /etc/krb.conf

krb4_realms = /etc/krb.realms

kdc_timesync = 1

ccache_type = 4

forwardable = true

proxiable = true

# for Windows 2003

default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

# For Windows XP:

default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

# The following libdefaults parameters are only for Heimdal Kerberos.

v4_instance_resolve = false

v4_name_convert = {

Page 4: Squid3+Ubuntu10S+Kerberos+AD

host = {

rcmd = host

ftp = ftp

}

plain = {

something = something-else

}

}

fcc-mit-ticketflags = true

[realms]

MEUDOMINIO.COM.BR = {

kdc = 192.168.1.1 (Ip do windows 2003 com AD)

admin_server = 192.168.1.1 (Ip do windows 2003 com AD)

dafault_domain = meudominio.com.br

}

[domain_realm]

.meudominio.com.br = MEUDOMINIO.COM.BR

meudominio.com.br = MEUDOMINIO.COM.BR

[kdc]

profile = /etc/krb5kdc/kdc.conf

[appdefaults]

pam = {

debug = false

Page 5: Squid3+Ubuntu10S+Kerberos+AD

ticket_lifetime = 36000

renew_lifetime = 36000

forwardable = true

krb4_convert = false

}

[login]

krb4_convert = true

krb4_get_tickets = false

[logging]

default = FILE:/var/log/krb5libs.log

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmind.log

Configurando o Active Directory

Abra o Active Directory Users and Computer.

Linux: Squid3 + Ubuntu Lucid 10.04 + Kerberos Auth + AD

Crie um novo usuário no Active Directory "srvsquid", desmarque a opção para mudar a

senha no próximo logon, marque a opção que a senha nunca expira, coloque uma senha

grande (20 dígitos) e complexa.

Page 6: Squid3+Ubuntu10S+Kerberos+AD

Adicione um computer com o nome "srvsquid".

No seu servidor DNS adicione um registro para o srvsquid IP 192.168.1.2 (isso é

realmente importante, não pule esse passo).

O DNS reverso deve estar habilitado para o srvsquid.

Baixe o arquivo WindowsServer2003-KB892777-SupportTools-x86-ENU.exe do site da

Microsoft, instale no seu servidor ou em alguma máquina rodando Windows XP.

Abra o cmd: iniciar ---> executar ---> cmd

Vá para a pasta onde foi instalado o Support Tools.

cd c:\"arquivos de programas"\"Support Tools"

Digite o comando para gerar um keytab para o srvsquid:

ktpass -princ HTTP/[email protected] -mapuser srvsquid -crypto rc4-hmac-nt -pass SENHA_DO_USR_SRVSQUID -ptype KRB5_NT_PRINCIPAL -out c:\srvsquid.keytab

O arquivo srvsquid.keytab será gerado no c:\, reserve esse arquivo, você precisará dele

mais tarde.

Instalando e configurando o Squid3

No srvsquid edite o arquivo /etc/hosts e adicione as linhas:

192.168.1.2 srvsquid.meudominio.com.br srvsquid

192.168.1.1 srvdc1.meudominio.com.br srvdc1

Edite o arquivo /etc/resolv.conf e coloque essa configuração:

search meudominio.com.br

nameserver IP-DO-DNS-PRIMÁRIO

nameserver IP-DO-DNS-SECUNDÁRIO

Teste o DNS reverso com o comando:

$ dig -x 192.168.1.2

Page 7: Squid3+Ubuntu10S+Kerberos+AD

Na parte ANSWER da saída do comando deve retornar o nome

srvsquid.meudominio.com.br.

Instale o Squid3:

$ sudo apt-get update

$ sudo apt-get install squid3

Copie de forma segura o keytab gerado no passo anterior no Windows para o srvsquid.

Copie para /etc/squid3/srvsquid.keytab depois apague a cópia do c:\.

Dê owner para o usuário proxy:

$ sudo chmod proxy:proxy /etc/squid3/srvsquid.keytab

Dê permissão somente leitura 400 no arquivo:

$ sudo chmod 400 /etc/squid3/squid.keytab

Edite o arquivo /etc/enviroment e adicione a linha:

KRB5_KTNAME=/etc/squid3/srvsquid.keytab

Edite o arquivo /etc/init.d/squid3 e adicione a linha abaixo no script logo em baixo da linha

PATH=/bin:/usr/bin:/sbin:/usr/sbin:

export KRB5_KTNAME=/etc/squid3/srvsquid.keytab

Faça cópia do arquivo de configuração original do Squid:

$ sudo cp /etc/squid3/squid.conf /etc/squid3/squid.conf.ORIGINAL

Edite o arquivo squid.conf e cole a configuração abaixo:

Obs.:

* No arquivo tem a configuração negotiate e um exemplo de configuração basic via LDAP

para compatibilidade, caso seja necessário utilizar proxy para sistemas que não aceitem

negotiate. Caso seja habilitada essa opção a senha trafegará em texto puro quando

utilizado LDAP.

Page 8: Squid3+Ubuntu10S+Kerberos+AD

* Colocar na ordem, pois se colocar primeiro o LDAP ele vai priorizar a autenticação texto

puro.

Conteúdo do squid.conf:

auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -d -s HTTP/[email protected]

auth_param negotiate children 20

auth_param negotiate keep_alive on

#Segue a configuração BASIC LDAP, basta descomentar as 4 linhas abaixo.

#O usuário fornecido deve ter permissão de consultar a base LDAP.

#auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "DC=meudominio,DC=com,DC=br" -D "CN=USUARIOLDAP,OU=usuarios,OU=informatica,DC=meudominio,DC=com,DC=br" -w "SENHADOUSUARIO" -f sAMAccountName=%s -P -v 3 -h 192.168.1.1

#auth_param basic children 20

#auth_param basic realm Autenticacao internet

#auth_param basic credentialsttl 2 hours

acl auth proxy_auth REQUIRED

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8 0.0.0.0/32

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

Page 9: Squid3+Ubuntu10S+Kerberos+AD

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

http_access allow auth

http_access deny all

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost

http_access deny all

icp_access deny all

htcp_access deny all

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /var/log/squid3/access.log squid

Page 10: Squid3+Ubuntu10S+Kerberos+AD

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|\?) 0 0% 0

refresh_pattern . 88032234 0 20% 4320

icp_port 3130

coredump_dir /var/spool/squid3

Configurando os navegadores

Os navegadores testados foram o IE 7 e o Firefox 3.0 ou superior.

As máquinas clientes foram testadas com Windows XP, Vista e 7. Ambos precisam estar

logados no domínio para funcionar.

Estou realizando testes com o Ubuntu 10.04 desktop para autenticar via kerberos, mas

ainda não tive sucesso, assim que tiver progresso atualizo. Quem tiver alguma crítica,

sugestão ou melhoria pode enviar.

Para contornar esse problema foi ativada a autenticação BASIC LDAP no squid.conf da

página anterior. Essa autenticação é compatível com o Linux, inclusive quando exporta o

proxy pelo comando "export http_proxy=http://user:[email protected]",

porém ela envia a senha em texto puro.

ATENÇÃO:

* Para configurar os navegadores é necessário na configuração do proxy adicionar o

FQDN, ou seja, ao invés de colocar srvsquid ou o IP deve ser configurado o nome +

domínio, Ex.: srvsquid.meudominio.com.br nas opções de proxy, por isso a importância de

se configurar o DNS e o DNS reverso. A porta se não foi alterada é 3128.

* A autenticação Kerberos, para funcionar, o relógio e data do SRVSQUID e do SRVDC1

precisa estar sincronizados, você pode fazer isso configurando NTP, network time

protocol. Há vários tutoriais disponíveis, ou você mesmo pode configurar na mão para que

ambos fiquem no máximo com 2 minuto de diferença.

Referências:

Getting Squid to authenticate with kerberos and Windows 2008/2003/7/XP - Server Fault

Squid kerberos authentication and ldap authorization in Active Directory « Klaubert's Blog

ConfigExamples/Authenticate/Kerberos - Squid Web Proxy Wiki

Autor: Vinicius Domingues (VOL)