terça-feira, 29 de junho de 2010

Consultas LDAP no AD

Bom dia!

Um pouco atrasado mas sempre pode ajudar alguém.
Quem vêm do mundo Linux e está familiarizado com o OpenLDAP ou semelhantes certamente fica triste quando precisa fazer uma consulta LDAP em um AD e não encontra um ldapsearch nas estações disponíveis ou mesmo no servidor.

Antes de continuar... As pessoas, assim como eu, que tiveram o privilégio de aprender mexer com servidores em Linux para só então mexer em Windows (se é que precisa aprender mexer... hehehe) jamais enfrentaram algum problema com ferramentas semelhantes no Windows. OpenLDAP e AD, por exemplo, são a mesma coisa apenas com alguns schemas modificados e uns atributos diferentes. Certa vez ouvi um MCSE falando que modificar schemas do AD era coisa de outro mundo, algo extremamente complexo. Mostrei para ele como que isso era algo rotineiro para quem trabalhava com OpenLDAP e sem nunca ver um schema do AD antes, consegui interpretá-lo normalmente. hehe Ele ficou bem desapontado.

Agora, para quem conhece OpenLDAP e tenta user AD tira de letra. O contrário, por convivência, digo com propriedade que é muito raro. hehe Em Linux, a menos que não queira, você aprende como tudo funciona. Esse negócio de segurança por obscuridade até pode ter alguns argumentos positivos, mas no fim não resolve em nada os problemas de segurança.


Chega de filosofar...
Minha necessidade foi extrair todos os usuários de um grupo do AD para um arquivo texto para então fazer um relatório. Se tem uma forma de fazer isso pelo AD eu não encontrei, mas nem pensei muito. Fui direto para a raíz do problema. AD + Usuáios = LDAP.

Encontrei alguma documentação sobre a ferramenta ldifde que por sinal é muito parecida com o ldapsearch. Bastou um /h para ver as opções e montar a consulta abaixo:

ldifde -s server -d "dc=dominio,dc=com" -f users.txt -p subtree -r (memberof="cn=Grupo,ou=users,dc=dominio,dc=com") -l samAccountName

-s: Servidor onde farei a consulta.
-d: meu dn.
-f: onde vou salvar a saída do comando.
-p: tipo de busca.
-r: filtro de pesquisa.
-l: atributo que quero listar.

Funcionou legal. Obviamente usei o Linux para ordenar os resultados em ordem alfabética e remover alguns lixos da saída do comando. Tenta fazer isso em PS e notepad para ver a tortura... : )

OBS: Fiz isso através de uma estação logada no domínio.

Grande abraço!

Fonte de auxílio:
http://support.microsoft.com/?scid=kb%3Ben-us%3B555636&x=11&y=11

segunda-feira, 28 de junho de 2010

Curso - Segurança em Firewalls

Boa tarde!

No próximo sábado (03/06) iniciarei uma nova turma do Curso de Segurança em Firewalls na FTEC Caxias do Sul. O curso está em sua quarta turma e possui um histórico bastante positivo.

No momento ainda estou com 1 vaga em aberto. Quem tiver interesse, por favor, entre em contato pelo meu e-mail que mando maiores detalhes.

ABAIXO COLOQUEI ALGUNS DOS TÓPICOS ABORDADOS:


Relação entre firewall e camadas do modelo TCP/IP.
Filtros de pacotes.
Como funcionam?
Quais as funções?
Papel do kernel.
Evolução dos filtros de pacotes no Linux.
Ipfwadm.
Ipchains.
Iptables.
Nftables (futuro).
Iptables.
Tabelas do iptables.
Tabela FILTER.
Fluxos da tabela.
Entendendo e praticando a tabela Filter.
Sintaxe de comandos.
INPUT/OUTPUT.
FORWARD.
CHAINS.
Extensões do Iptables.
Categorias de Firewalls.
Firewall Bridge.
Firewall StateLess.
Firewall StateFull.
Estados de conexões.
Firewall Proxy.
Tabela NAT
Conceitos de NAT.
Conceitos de PAT.
Fluxos da Tabela.
Tipos de NAT.
PREROUTING.
POSTROUTING.
MASQUERADE.
REDIRECT.
Vantagens e desvantagens de NAT.
Principais aplicações.
Tabela MANGLE
Campo TOS.
Customizando conexões.
Preparando pacotes para QoS.
Tabela RAW.
Rastremento de pacotes.
Otimizando conexões de alta disponibilidade.
Exploração de todos os módulos do Iptables.
Ataques x Defesas.
Conceitos de ataque.
Ataques locais.
Ataques remotos.
Ataques remotos.
Ataques de spoofing.
Ataques de flood.
ICMP Flood.
SYN Flood.
Ataques DoS.
Ataques DdoS.
Ataques RDDoS.
Ataques de Estado.
Ataques locais.
Exploits
Juntando ataques locais com ataques remotos.
Criando uma botnet.
Aplicando um exploit remotamente.
Burlando firewall com protocolo SSH.
Scanner de Rede
NMAP
Tácnicas de Scan e exploração de informações.
Dicas e exemplos de técnicas de Incident Response.
Introdução ao ISA Server 2006.

Grande abraço!

segunda-feira, 21 de junho de 2010

Palestra TcheLinux FTEC 2010

Olá!
Nesse final de semana (19/06/10) ocorreu na FTEC Caxias do Sul o evento TchêLinux, o qual fui palestrante.
Conforme comentei com o pessoal, estou disponibilizando aqui no Blog a palestra e os scripts usados na apresentação.

A palestra intitulada "Técnicas Avançadas de Segurança com Iptables" foi apresentada previamente no Forum Internacional do Software Livre 10º Edição e mostrei técnicas não tão comuns e muito interessantes para aplicar defesas na estrutura de Firewalls.

Baixar apresentação e scripts:

Video da palestra gravada no 10º Forum Internacional do Software Livre:


Lembrando que no dia 03/07/10 iniciarei uma turma do Curso de Segurança em Firewalls na FTEC Caxias do Sul. Ainda estou com algumas vagas em aberto...

Qualquer dúvida, por favor, entre em contato.

Grande abraço!

quinta-feira, 17 de junho de 2010

Squid + AD + Kerberos - Uma solução decente.

Buenas!!

Após um tempinho de correria voltei para publicar aqui mais uma ótima solução para nosso dia-a-dia.
Todos conhecem Squid e todos conhecem AD.

É muito comum termos organizações com as bases de usuários totalmente centralizadas no AD. Isso é fato.
Porém sempre houve uma dificuldade de se implementar ótimos proxies como o Squid por motivos que não nos estressam, mas estressam os usuários. O maior exemplo disso é a maldita janela de autenticação.

O motivo!
Em uma estrutura que administro, após uma mudança de topologias de Firewall precisei instalar proxies em cada filial (antes todas usavam o proxy da Matriz).

A opção!
Obviamente a solução de proxy escolhida para as filiais foi o Squid. Há quem diga que ele não é bom, mas basta ler e estudar suas funcionalidades que rapidamente achará diferenciais que colocam outros proxies vários anos atrás. O que você prefere para suas soluções? Algo fácil e medilcre ou a melhor e mais segura solução mesmo que você precise estudá-la e entendê-la? Estudar não mata ninguém!! O que ferra é o "profissional" ter a cara de pau de implementar algo "nas coxas" mesmo sabendo que podia ser melhor. Mas cada caso é um caso. No meu caso essa foi a MELHOR solução. : )

O problema!
Todos os usuários estavam acostumados com uma estrutura completamente integrada, onde a única vez que ele precisava colocar sua senha para serviços de rede era na autenticação do Windows. Todo o resto era feito através de kerberos, o que particularmente acho muito interessante. Para que fazer trabalho repetitivo se o objetivo final é o mesmo?
Outro fato é que essa solução de Squid integrado com Kerberos, AD e fazendo controles baseados em usuários e grupos é muito difícil de ser encontrada até mesmo pela sua complexidade. Não basta dar um "rpm -ivh" e fazer algumas configurações que o negócio saí funcionado. Isso seria ótimo!!! Até tive uma idéia: Vou mandar um e-mail para o pessoal do Squid e/ou gerar os pacotes para as distros que uso.

A solução!
Bom, vamos dar um jeito de fazer isso funcionar de forma profissional. Gambiarras qualquer um consegue fazer. Vamos fazer algo um pouco mais decente do que os preguiçosos costumam fazer... hehehehe Não é nada pessoal com ninguém, mas para o seu próprio bem, espero que o chapéu não sirva... e por favor, se alguém achar uma solução ainda melhor compartilhe. Sempre temos algo para aprender com os próximos.
Também é fato que muitos profissionais bons nem mesmo sabiam dessa possibilidade. Não devemos julgar ninguém ainda mais de forma preconceituosa. Para isso estou colocando a solução aqui. Algo construtivo.

Importante: Não é integração com LDAP, isso é fácil e está cheio de tutorial na Internet. Isso é Kerberos!

Resumo:
Basicamente faremos uma compilação da última versão do squid pois nas versões das oferecidas pelas distros (testei em CentOS) não vem com o módulo de integração com kerberos.
Depois vamos baixar e compilar um módulo bem interessante para fazermos buscas de grupos e usuários através de kerberos.
Por fim vamos ajustar nosso SO para se comunicar com o servidor kerberos e criar um arquivo de credenciais para consultas vindas do Squid.
Se tudo funcionar legal você pode pedir aumento, replicar a solução, abrir uma cerveja, pagar um churras para os amigos (me chama), etc etc... Como preferir.


Let's Start!!

FQDN do meu servidor Squid: squidserver.macus.net
FQDN do meu servidor AD: adserver.marcus.net
Distro Linux: CentOS 5.5 x86
Versão AD: 2008 R2

Preparando o Squid
Fiz o download da última versão do Squid no site http://www.squid-cache.org/. Antes do download dê uma olhada se já não tem uma versão mais nova.

$ wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.4.tar.gz

$ tar -xvzf squid-3.1.4.tar.gz
$ cd squid-3.1.4

As opções em negrito são importantes na hora de compilar, pode colocar outras se quiser...
$ ./configure --enable-negotiate-auth-helpers=squid_kerb_auth --enable-stacktraces --prefix=/opt/squid-3.1

$ make
$ make install


Antes de configurarmos nosso Squid vamos fazer os outros procedimentos que ele depende.

Compilando módulo de consulta em grupos por Kerberos
Bem interessante esse módulo, mas infelizmente não vem nativamente no Squid.

$ cvs -z3 -d:pserver:anonymous@squidkerbauth.cvs.sourceforge.net:/cvsroot/squidkerbauth co -P squid_kerb_ldap
$ cd squid_kerb_ldap
$ ./configure ; make
$ cp -a squid_kerb_ldap /opt/squid-3.1/sbin


Gerando o Keytab pelo Windows
Para que o Squid consiga trocar tickets com o servidor kerberos, o mesmo precisa de credenciais para isso. Não temos como ficar autenticando o squid manualmente a cada incialização do mesmo, por isso vamos criar um arquivo keytab e adicioná-lo no nosso arquivo de inicialização do Squid.

Esse processo pode ser feito pelo próprio Linux usando o msktutil, mas encontrei alguns problemas nele quando o servidor Squid não está no domínio. Como não vou colocar ele no domínio usei a própria ferramenta do Windows 2008 (AD) que é nativa no SO.

Antes de gerar o keytab é necessário criar um usuário no AD que será cadastrado nessas credenciais.
No meu caso criei o usuário "squid.filial" e rodei o seguinte comando no meu PDC.

C:\> ktpass -princ HTTP/squidserver.marcus.net@MARCUS.NET -mapuser marcus.net\squid.filial -crypto All -mapop set -pass senha -ptype KRB5_NT_SRV_HST -out squid.filial.keytab

Mande o arquivo keytab gerado para o servidor Squid. No meu caso coloquei na pasta /opt/squid.


Em alguns materiais da Internet o pessoal usava criptografia "rc4-hmac-nt", mas tive alguns problemas com autenticação. Dei uma pesquisada por cima e encontrei algumas referênias dizendo que no Windows 7 e 2008 foram alteradas algumas questões de criptografia. Com o all todos os serviços funcionaram legal. Algo interessante é usar o Wireshark para monitorar as requisições de tickets entre cliente e servidor.

Adicione as estradas do keytab no script de inicialização do Squid.
Caso não tenha o script de inicialização do mesmo, aconselho pegar de um pacote do squid específico da distro.

De volta ao Linux
No arquivo /etc/init.d/squid adicione as seguintes linhas:

KRB5_KTNAME=/opt/squid/squid.filial.keytab
export KRB5_KTNAME


Kerberos Client
Edite o arquivo /etc/krb5.conf

No meu caso ficou assim:
##################
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = MARCUS.NET
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 forwardable = yes

; for Windows 2008 with AES
      default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
      default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
      permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
 MARCUS.NET = {
  kdc = adserver.marcus.net:88
  admin_server = adserver.marcus.net:749
  default_domain = marcus.net
 }

[domain_realm]
 .marcus.net = MARCUS.NET
 marcus.net = MARCUS.NET

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

##################


Configurações do Squid
Antes de mexer no squid copiei mais um arquivo para a pasta sbin.

$ cd /opt/squid-3.1
$ cp -a libexec/squid_kerb_auth sbin/

Dentre as demais configurações, o que interessa para a autenticação kerberos é:

##################
# KERBEROS - Integracao completa com AD
auth_param negotiate program /opt/squid-3.1/sbin/squid_kerb_auth -s HTTP/squidserver.marcus.net
auth_param negotiate children 10
auth_param negotiate keep_alive on

# ACLs externas para buscar grupo baseado em Kerberos.
external_acl_type Internet_Full ttl=3600 negative_ttl=3600 %LOGIN /opt/squid-3.1/sbin/squid_kerb_ldap -g Internet_Full

##################

Beleza! Feito isso é só criar os diretórios de cache e iniciar o squid.
Configure o proxy e porta no navegador das estações e teste.

Detalhes e Dicas:
- Certifique-se que os servidores conseguem resolver nomes DNS do Squid e do AD.
- Verifique as permissões dos arquivos e pastas do Squid.
- Verifique se os horários dos servidores e clientes estão sincronizados.
- Observe o arquivo cache.log do Squid para resolver problemas ou entender o funcionamento.
- Da para colocar os módulos squid_kerb_auth e squid_kerb_ldap em modo dedug apenas adicionando um "-d" depois do comando no squid.conf.


Fontes que li durante a implementação

Belo Tutorial:
http://klaubert.wordpress.com/2008/01/09/squid-kerberos-authentication-and-ldap-authorization-in-active-directory/

Squid Kerb Helper
http://sourceforge.net/projects/squidkerbauth/

Informações sobre KeyTabs
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tsec_SPNEGO_config_dc.html

Informações sobre erros comuns:
http://sammoffatt.com.au/jauthtools/Kerberos/Troubleshooting