Proxy Squid com autenticação NTLM transparente

Solução rápida e pratica para quem utiliza Squid e quer integrar ele com a autenticação do Windows. Já estou levando em consideração de que vai haver redundância, tanto na autenticação, como no serviço de proxy.

Pré-requisitos:
– Domínio Windows AD com 2 servidores. Servidor 1 – IP 10.0.0.10, FQDN AD01.DOMINIO.LOCAL. Servidor 2 – IP 10.0.0.11, FQDN AD02.DOMINIO.LOCAL ;
– Dois servidores para o Squid já com a instalação básica do Debian 8.5 de 64bits. Servidor 1 – IP 10.0.0.20, FQDN PROXY01.DOMINIO.LOCAL. Servidor 1 – IP 10.0.0.21, FQDN PROXY02.DOMINIO.LOCAL. ( ambiente em que a solução foi testada );
– Conta administrativa no AD ( ex: adm.tonev );
– Conhecimentos de AD, DHCP, DNS, DNS reverso, HTTP, criação de GPOs, administração Windows, administração Linux;

1 – Instale os pacotes básicos necessários:
apt-get install squid3 telnet tcpdump ntpdate samba winbind vim telnet tcpdump mc xz-utils rsync

2 – Em cada servidor Squid ajuste o arquivo /etc/hosts com o IP da maquina local e o IP dos ADs:
No servidor proxy01.dominio.local:
10.0.0.20   proxy01.dominio.local   proxy01
10.0.0.10   ad01.dominio.local   ad01
10.0.0.11   ad02.dominio.local   ad02

No servidor proxy02.dominio.local:
10.0.0.21   proxy02.dominio.local   proxy02
10.0.0.10   ad01.dominio.local   ad01
10.0.0.11   ad02.dominio.local   ad02

3 – Em cada servidor Squid ajuste o arquivo /etc/samba/smb.conf para o conteúdo abaixo:
[global]
unix charset = ISO-8859-1
workgroup = DOMINIO
netbios name = proxy01 ( altere na segunda maquina para refletir o nome dela )
server string = proxy01 ( altere na segunda maquina para refletir o nome dela )
log level = 5
load printers = no
log file = /var/log/samba/log.%m
max log size = 500
realm = DOMINIO.LOCAL
security = ads
auth methods = winbind
password server = 10.0.0.10, 10.0.0.11
winbind separator = +
encrypt passwords = yes
printcap name = cups
winbind cache time = 15
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
idmap uid = 10000-20000
idmap gid = 10000-20000
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
local master = no
os level = 233
domain master = no
preferred master = no
domain logons = no
dns proxy = no
ldap ssl = no
printing = cups
disable spoolss = yes
show add printer wizard = no
template shell = /bin/bash
template homedir = /home/%U

4 – No AD crie o registro de DNS e DNS Reverso para o proxy01 e proxy02 e aguarde o tempo necessário para replicação e refresh do DNS;

5 – Insira as maquinas Squid no domínio do AD. Tem que ser feito localmente nas maquinas
net ads join -U adm.tonev

6 – Reinicie os serviços do samba e winbind
/etc/init.d/samba restart ; /etc/init.d/winbind restart

7- Teste a comunicação das maquinas proxy com o domínio Windows:
wbinfo -t

Tem que retornar “checking the trust secret for domain DOMINIO via RPC calls succeeded”

8 – Teste a autenticação no domínio Windows:
wbinfo -a adm.tonev

Depois de solicita a senha duas vezes, deve retornar as linhas abaixo:

plaintext password authentication succeeded
challenge/response password authentication succeeded

9 – Alterar o chmod do /usr/bin/ntlm_auth para que o autenticador rode como root. O único problema é que sempre que o pacote do samba for atualizado será necessário reexecutar o comando para que a autenticação não pare:
chmod 6755 /usr/bin/ntlm_auth

10 – Ajuste a configuração do squid  ( /etc/squid3/squid.conf ) com o conteúdo abaixo:
auth_param ntlm program /usr/bin/ntlm_auth –helper-protocol=squid-2.5-ntlmssp –domain=DOMINIO
auth_param ntlm children 512
acl WINDOWS_AUTH proxy_auth REQUIRED
acl SSL_ports port 80 443 1025-65535
acl Safe_ports port 21 70 80 210 280 443 488 591 777  1025-65535
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access allow WINDOWS_AUTH
http_access deny all
http_port 3128
cache_mem 3072 MB
maximum_object_size_in_memory 512 KB
minimum_object_size 2 KB
maximum_object_size 512 KB
offline_mode off
cache_swap_low 90
cache_swap_high 95
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
dns_v4_first on
cache_mgr [email protected]
logfile_rotate 2
forwarded_for on
httpd_suppress_version_string on
uri_whitespace strip
fqdncache_size 8192
ipcache_size 8192

11 – Ajuste o /etc/sysctl.conf para os parametros abaixo:
fs.file-max = 1048576
net.ipv4.tcp_syncookies = 1
net.ipv4.neigh.default.gc_interval = 15
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
net.core.netdev_max_backlog = 2048
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 49152
net.core.rmem_max = 5242880
net.core.wmem_max = 5242880
net.ipv4.netfilter.ip_conntrack_max = 262144

12 – Crie um arquivo com o nome wpad.dat com o conteúdo abaixo e o coloque em um servidor web que todas as maquinas cliente possam acessar.
function FindProxyForURL(url, host) {
return “PROXY proxy01.dominio.local:3128;PROXY proxy02.dominio.local:3128”;
}

13 – Ajuste a configuração do DHCP da rede para incluir a opção 252 e informar a localização do arquivo wpad.dat

14 – Crie uma GPO forçada para o domínio AD e especifique que os browsers devem usar autoconfiguração e especifique o caminho do wpad.dat. Opcionalmente pode travar a opção de usuário poder alterar a configuração de proxy. O Internet Explorer e o Chrome usam a mesma configuração ( a do IE ), para o Mozilla é necessário baixar o modelo administrativo ( aqui o link do download )

Atenção: nessa configuração do Squid as maquinas cliente somente poderão navegar se conseguirem se autenticar via NTLM. Isso vale somente para maquinas que fazem parte do domínio Windows. Maquinas que não fazem parte serão bloqueadas automaticamente e não vai aparecer nenhuma tela solicitando login/senha. Para que isso aconteça é necessário especificar mais tipos de autenticação. O próximo postá será sobre como implementar autenticação via RADIUS.

Atenção [2]: Se a carga de autenticação for muito grande, pode ser que o Squid pare de atender as conexões dos clientes. Agende um “squid3 -k reconfigure” no crontab para rodar a cada 5 minutos. Assim os processos do ntlm_auth serão reciclados e mantidos somente os necessarios. Ainda preciso reproduzir o bug para poder relatar.

Pronto. Reinicie o squid e aproveite.

2 Comments

  1. Muito bom, funcionou quase de primeira. No entanto, após fazer toda a configuração, inserir o servidor proxy no domínio, testar a autenticação e etc, o Squid gerava o seguinte erro no cache.log: ipcCreate: /usr/bin/ntlm_auth: (13) Permission denied

    No meu caso que uso Ubuntu 16.04.3 LTS, aqui precisei fazer um ajuste no arquivo /etc/init.d/winbind e na linha 43 alterar:
    – DE: chgrp winbindd_priv $PIDDIR/winbindd_privileged/ || return 1
    – PARA: chgrp proxy $PIDDIR/winbindd_privileged/ || return 1

    E incluir logo abaixo:
    chown root $PIDDIR/winbindd_privileged/ || return 1

    1. O ntlm_auth tem que rodar com SUID ( chmod 6755 ). Toda vez que atualiza o samba tem que executar o chmod novamente.

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *