quinta-feira, 14 de maio de 2009

Artigo - Squid + NTLM + Active Directory

Depois de bater cabeça fiz meu próprio tutorial para quem precisa autenticar a internet juntamente com seu controlador de domínio(PDC). Tenho certeza que se chegarem ao fim terão um funcionamento perfeito da autenticação, pois já o fiz várias vezes em vários clientes.


Distribuição Usada:

Ubuntu Server 8.04 (mas deve funcionar em qualquer uma)

Pacotes necessários:
samba-3.0.21c.tar.gz
squid-2.5.STABLE12.tar.gz

Considerações:

Nome do domínio: DOMINIO

Nome completo do domínio: DOMINIO.LOCAL
Nome do Servidor: SERVIDOR (Controlador de Domínio)

IP do Servidor(Controlador de Domínio): 192.168.0.1

Baixe os pacotes

# cd /usr/src

# wget http://ppp.samba.org/samba/ftp/stable/samba-3.0.21c.tar.gz

# wget http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE12.tar.gz


Descompacte compile e instale o Samba

# tar zxvf samba-3.0.21c.tar.gz

# cd samba-3.0.21c/source

# ./configure --bindir=/bin --sbindir=/usr/sbin --with-winbind --with-winbind-auth-challenge

# make && make install


Copie a biblioteca do Winbind e crie um link simbólico

# cp /usr/src/samba-3.0.21c/source/nsswitch/libnss_winbind.so /lib

# ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.2

Edite o arquivo /etc/hosts o adicione o ip do controlador de domínio

# vim /etc/hosts


Coloque a seguinte linha alterando os nomes de acordo com sua rede e nomes


192.168.0.1 servidor.dominio.local servidor


Instale o ntpdate para sincronizar o horário dos servidores

# apt-get update

# apt-get install ntpdate

# ntpdate servidor


Instale os seguintes pacotes krb5-kdc krb5-config krb5-clients libpam-krb5 krb5-user

# apt-get install krb5-kdc krb5-config krb5-clients libpam-krb5 krb5-user


Edite o arquivo /etc/krb5.conf

# vim /etc/krb5.conf


E deixe da seguinte forma:


[libdefaults]

default_realm = DOMINIO.LOCAL

krb4_config = /etc/krb.conf

krb4_realms = /etc/krb.realms

kdc_timesync = 1

ccache_type = 4

forwardable = true

proxiable = true

v4_instance_resolve = false

v4_name_convert = {

host = {

rcmd = host

ftp = ftp

}

plain = {

something = something-else

}

}

fcc-mit-ticketflags = true

[realms]

DOMINIO.LOCAL = {

kdc = 192.168.0.1

admin_server = 192.168.0.1:749

default_domain = 192.168.0.1

}

[domain_realm]

domínio.local = DOMINIO.LOCAL

.domínio.local = DOMINIO.LOCAL

[login]

krb4_convert = true

krb4_get_tickets = false


Agora vamos inicializar a comunicação com controlador de domínio


# kinit administrador@DOMINIO.LOCAL


Onde “administrador” é uma conta administrador do servidor.


Dê o comando


# klist


Se tudo der certo você vera uma mensagem como esta:


klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

Kerberos 4 ticket cache: /tmp/tkt0

klist: You have no tickets cached


Agora edite o arquivo /etc/nsswitch.conf

# vim /etc/nsswitch.conf


altere as linhas:


passwd: compat

group: compat

para:

passwd: compat winbind

group: compat winbind


Crie e edite o arquivo /usr/local/samba/lib/smb.conf


# vim /usr/local/samba/lib/smb.conf


deixando assim:


[global]

workgroup = DOMINIO

server string = Servidor Proxy

netbios name = proxy

log file = /var/log/samba/%m.log

max log size = 0

security = domain

password server = SERVIDOR

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

encrypt passwords = yes

wins server = SERVIDOR

winbind separator = "+"

winbind uid = 10000-20000

winbind gid = 10000-20000

template homedir = /dev/null

template shell = /dev/null

winbind use default domain = yes


Crie a pasta e dê permissão e reinicie o samba


# mkdir /var/log/samba

# chmod 777 -R /var/log/samba/

# nmbd restart

# smbd restart

# winbindd restart


Agora vamos ingressar o servidor proxy no domínio e restartar o samba. Digite a senha do usuário usado (administrador no caso) após dar o comando de ingresso.


# net rpc join DOMINIO -U administrador


# nmbd restart

# smbd restart

# winbindd restart


Para testar digite “wbinfo –u”. Se tude der certo, você terá a listagem de usuários do domínio.


Agora vamos descompactar, compilar e instalar o squid.


# cd /usr/src

# tar zxvf squid-2.5.STABLE12.tar.gz

# cd squid-2.5.STABLE12

# ./configure --sbindir=/usr/sbin --sysconfdir=/etc/squid --enable-default-err-language=Portuguese --enable-delay-pools --enable-underscores --enable-auth="ntlm,basic" --enable-external-acl-helpers="winbind_group,wbinfo_group," --enable-store-io=ufs,aufs,diskd --enable-snmp --enable-linux-netfilter --enable-basic-auth-helpers="winbind" --enable-ntlm-auth-helpers="SMB,winbind" --with-winbind-auth-chalenge

# make && make install


Configurando o squid

# mv /etc/squid/squid.conf /etc/squid/squid.conf.original

# egrep -v "^#^$" /etc/squid/squid.conf.original > /etc/squid/squid.conf


Adicione as linhas a seguir ao seu squid.conf. As linhas em vermelho devem ser adicionadas, e as outras são apenas para referencia a localização das outras. Altere as acls abaixo a gosto para dar permissões diferentes aos usuários do proxy.


cache_effective_user proxy

auth_param ntlm program /bin/ntlm_auth DOMINIO/SERVIDOR --helper-protocol=squid-2.5-ntlmssp

auth_param ntlm use_ntlm_negotiate off

auth_param ntlm children 10

auth_param ntlm max_challenge_reuses 0

auth_param ntlm max_challenge_lifetime 5 minutes


auth_param basic program /bin/ntlm_auth DOMINIO/SERVIDOR --helper-protocol=squid-2.5-basic

auth_param basic children 5

auth_param basic realm Digite seu login e senha.

auth_param basic credentialsttl 2 hours

auth_param basic casesensitive off


acl CONNECT method CONNECT

acl acesso proxy_auth REQUIRED # Solicitando a autenticação

http_access allow manager localhost


http_access deny CONNECT !SSL_ports

http_access allow acesso # Liberando usuários autenticados

http_access allow all


Para finalizar


# mkdir /usr/local/squid/var/cache

# touch /usr/local/squid/var/logs/store.log

# touch /usr/local/squid/var/logs/access.log

# chown -R proxy.proxy /usr/local/squid/var/cache

# chown proxy /usr/local/squid/var/logs/store.log

# chown proxy /usr/local/squid/var/logs/access.log

# chown root.proxy /usr/local/samba/var/locks/winbindd_privileged

# winbindd restart

# nmbd restart

# smbd restart

# squid -z

# squid &


Não se esqueça de configurar o proxy no navegador das estações na porta 3128(ou mais conveniente caso alterou no squid.conf) e também não esqueçam de colocar o samba e winbind num script de inicializacao do sistema.(ex. /etc/rc.local). Qualquer dúvida fiquem a vontade para perguntar, pq responderei na medida do possível.

12 comentários:

  1. Cara, muito bom emsmo, acontece que faço isso tudo mas reinicio menu server, ele não loga mais, nem o root.
    Pode me ajudar?
    daniel.leomil@gmail.com

    ResponderExcluir
  2. Cara, seja um pouco mais específico no seu problema pra eu tentar te ajudar. Creio que seu problema não tem haver com os passos acima e sim problemas na distro/midia.

    ResponderExcluir
  3. Amigo, eu fiz os passos que você mencionou acima, quando eu jogo os comandos wbinfo -t e wbinfo -u ele retorna tudo ok. Mas quando vou navegar ele bloqueio a navegacao. Eu nao tenho servidor Wins no meu DC, será que é por isso?

    ResponderExcluir
  4. Revise seu squid.conf os nomes DOMINIO/SERVIDOR. Poste ai o log do squid. Eu nunca tentei fazer sem servidor Wins, pode ser a raiz do seu problema sim.

    ResponderExcluir
  5. Vou colocar como esta meu squid.conf

    se puder me passa seu msn pelo email levi.seixas@gmail.com

    # IDIOMA DAS PAGINAS DE ERROS
    error_directory /usr/share/squid/errors/Portuguese
    http_port 3128
    visible_hostname fwpx.balcaonetwork.corp
    cache_mem 64 MB
    maximum_object_size_in_memory 64 KB
    maximum_object_size 512 MB
    minimum_object_size 0 KB
    cache_swap_low 90
    cache_swap_high 95
    cache_dir ufs /var/spool/squid 51200 16 256
    cache_access_log /var/log/squid/access.log
    auth_param ntlm program /bin/ntlm_auth DOMINIO/SERVIDOR --helper-protocol=squid-2.5-ntlmssp
    auth_param ntlm children 10
    auth_param basic program /bin/ntlm_auth DOMINIO/SERVIDOR --helper-protocol=squid-2.5-basic
    auth_param basic realm Digite o LOGIN/SENHA
    auth_param basic credentialsttl 2 hours
    auth_param basic casesensitive off
    refresh_pattern ^ftp: 15 20% 2280
    refresh_pattern ^gopher: 15 0% 2280
    refresh_pattern . 15 20% 2280
    acl all src 0.0.0.0/0.0.0.0
    acl redelocal src 192.168.1.0/255.255.255.0
    acl manager proto cache_object
    acl localhost src 127.0.0.1/255.255.255.255
    acl SSL_ports port 443 563
    acl Safe_ports port 80 # http
    acl Safe_ports port 21 # ftp
    acl Safe_ports port 443 563 # https, snews
    acl Safe_ports port 70 # gopher
    acl Safe_ports port 210 # wais
    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 Safe_ports port 901 # swat
    acl Safe_ports port 1025-65535 # portas altas
    acl purge method PURGE
    acl CONNECT method CONNECT
    acl AuthorizedUsers proxy_auth REQUIRED
    http_access allow all AuthorizedUsers
    http_access allow manager localhost
    http_access deny manager
    http_access allow purge localhost
    http_access deny purge
    http_access deny !Safe_ports
    http_access deny CONNECT !SSL_ports
    http_access allow localhost
    http_access deny all

    # REGRAS

    acl dominios_bloqueados url_regex -i "/etc/squid/dominiosbloqueados"
    http_access deny dominios_bloqueados

    acl palavrasproibidas url_regex -s "/etc/squid/palavrasproibidas"
    http_access deny palavrasproibidas

    ResponderExcluir
  6. Ae mano,

    Te tutorial rodou massa demais no meu Ubuntu Server 9. Agora me explicar uma coisa: Como eu faço pra fazer os bloqueios por grupos do Active Directory? tipo, me mostra eu colocaria que o grupo FINANCEIRO so pode acessar os sites A B e C.

    ResponderExcluir
  7. Olá,

    também gostaria de saber se é possível o bloqueio de acesso por grupos do AD.

    ResponderExcluir
  8. Sim é possivel, no momento não disponho de um tutorial apresentável para postar aki.

    Obrigado.

    ResponderExcluir
  9. Gelber, em primeiro lugar quero parabenizá-lo pelo excelente material. Coloquei pra funcionar na universidade que trabalho rodando sobre Debian Lenny autenticando no 2003. Antes disse tentei autenticar num Samba4 mas infelizmente o módulo ntlm_auth não está 100% OK, pois o Samba4 ainda está na versão alpha11. Para usar as regras de grupos, tem que adicionar o seguinte ao squid.conf:

    external_acl_type nt_group %LOGIN /usr/lib/squid/wbinfo_group.pl
    acl AllowedWindowsGroups external nt_group GrupodoAD
    http_access allow AllowedWindowsGroups

    Abraços!

    ResponderExcluir
  10. ola amigo ,
    primeiro , parabens pela materia !!!

    vou dar uma dica ( acho até que voce ja sabe )
    se voce colocar

    acl Safe_ports port 443 563 80 21 443 563 70 210 280 488 591 777 901 1025-65535

    voce vai ter uma velocidade e desempenho melhor no seu squid ;)

    vale a pena lembrar tbm de adicionar espelho das regras no iptables :D

    ResponderExcluir
  11. O comando:
    net rpc getsid -S DOMINIO -I -U administrador

    pode ser dado caso não consiga ingressar no domínio.

    ResponderExcluir
  12. O comando:
    net rpc getsid -S DOMINIO -I (IP DO PDC) -U administrador

    pode ser dado caso não consiga ingressar no domínio.
    este último é o correto.

    ResponderExcluir