Archive for the Squid Category

Imagine o seguinte cenário: Empresa de pequeno porte, com um AD instalado às pressas sem muitos cuidados e um servidor Linux lá no meio servindo de proxy. Se você tiver vontade de autenticar os serviços no AD, aqui vão alguns exemplos práticos e rápidos.

Tome como base um Windows 2003, com o domínio chamado “EverLinux” e um usuário rosca lá chamado “tcruz” somente para fazer as buscas no diretório da Microsoft. O Linux seria um Ubuntu ou Debian da vida.

Autenticando o Apache no AD

cd /etc/apache2/mods-enabled
ln -s ../mods-available/ldap.load .
ln -s ../mods-available/authnz_ldap.load .
 
<Directory "/var/www/protegido">
        AuthBasicProvider ldap
        AuthzLDAPAuthoritative off
        AuthName "Entre com a senha do AD"
        AuthType Basic
        AuthLDAPBindDN tcruz@everlinux
        AuthLDAPBindPassword senha_do_tcruz
        AuthLDAPURL ldap://10.10.20.20:3268/cn=users,dc=everlinux?sAMAccountName?one
        require user tcruz cmangini
        Allow from all
</Directory>

Autenticando o Squid no AD

...
acl bloqueados dstdom_regex -i "/etc/squid/block.txt"
http_access deny bloqueados
 
auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=everlinux" -D \
"cn=tiago cruz,cn=users,dc=everlinux" -w "senha_tcruz" -f sAMAccountName=%s -h 10.10.20.20
auth_param basic children 5
auth_param basic realm Autenticacao
auth_param basic credentialsttl 5 minutes
acl ldapauth proxy_auth REQUIRED
http_access allow ldapauth
...

Autenticando algo em PHP no AD

O exemplo será o software OneOrZero utilizado Help Desk:

# apt-get install php5-ldap
 
cat /var/www/helpdesk/configuration/website_settings.php
auth_method = "AD"
ldap_host = "10.10.20.20"
ldap_domain = "everlinux"
ldap_binddn = "CN=Tiago Cruz,CN=Users,DC=everlinux"
ldap_bindpwd = "senha_tcruz"
ldap_rootdn = "CN=Users,DC=everlinux"
ldap_searchattr = "sAMAccountName"
ldap_fname = "givenname"
ldap_lname = "sn"
ldap_uname = "samaccountname"
ldap_email_add = "mail"
ldap_office = "physicaldeliveryofficename"
ldap_phone = "telephonenumber"
ldap_context = "sAMAccountName"

Fazendo uma busca manualmente no diretório

# ldapsearch -LLL -h 10.10.20.20 -P 3 -x -D "cn=tiago cruz,cn=users,dc=everlinux" -W \
-b "cn=users,dc=everlinux"  "(&(&(objectClass=user)(objectCategory=person)) \
(sAMAccountName=tcruz))" 
Enter LDAP Password: 
dn: CN=Tiago Cruz,CN=Users,DC=everlinux
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Tiago Cruz
sn: Cruz
physicalDeliveryOfficeName: EverLinuxs Office
telephoneNumber: 1234-4321
givenName: Tiago
initials: ti
distinguishedName: CN=Tiago Cruz,CN=Users,DC=everlinux
instanceType: 4
whenCreated: 20090427110042.0Z
whenChanged: 20100406221357.0Z
displayName: Tiago Cruz
uSNCreated: 555987
memberOf:: Q049QWRtaW5zLiBkbyBkb23DrW5pbyxDTj1Vc2VycyxEQz1kb21pbmlvMjAwNw==
memberOf: CN=Administradores,CN=Builtin,DC=everlinux
uSNChanged: 2331137
name: Tiago Cruz
objectGUID:: 39teBl62JUWwzZz36nNICw==
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 129150648344589017
lastLogoff: 0
lastLogon: 129150648382871002
pwdLastSet: 128853036428004858
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAAR0LCqonS5XyzPF2T+AQAAA==
adminCount: 1
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: tcruz
sAMAccountType: 80530263368
userPrincipalName: tcruz@everlinux
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=everlinux
mail: tiagocruz AT everlinux.com

Espero que com estas dicas fique mais fácil para você centralizar a autenticação de seus serviços, caso seja necessário integrar com um LDAP proprietário.

Dica rápida, sem muitas novidades. Apenas uma forma rápida de colocar um Squid 2.6.18 rodando em um Ubuntu 8.04 LTS para autenticar em um Windows 2003 Server, sem usar samba+winbind, dar join no domínio, usar ntp e etc.

A idéia é documentar uma árvore LDAP padrão do Windows, para servir como base para futuras implementações, visto que muitos admins de AD desconhecem esta informação :-)

No squid.conf, ficaria mais ou menos assim (o “\” é uma quebra de linha, porém o comando deve ficar em uma linha única):

...
acl diretoria src 10.10.10.9/32
http_access allow diretoria
 
# Autenticacao AD Windows
auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=dominio" -D "cn=tiago \
cruz,cn=users,dc=dominio" -w "senha" -f sAMAccountName=%s -h 10.10.10.10
auth_param basic children 5
auth_param basic realm Autenticacao
auth_param basic credentialsttl 5 minutes
acl ldapauth proxy_auth REQUIRED
http_access allow ldapauth
 
# White List
acl liberados dstdom_regex -i "/etc/squid/unblock.txt"
http_access allow liberados
...
# Rede Local LAN
acl rede_local src 10.10.10.0/24
http_access allow rede_local

Caso não funcione “de prima”, recomendo estes comandos para debugar o problema:

1-) Usando o LDAPSearch para ver se retorna OK:

$ ldapsearch -LLL -h 10.10.10.10 -P 3 -x -D "CN=Tiago Cruz,CN=Users,DC=Dominio" \
-W -b "DC=Dominio" "(&(&(objectClass=User)(objectCategory=Person))(sAMAccountName=tcruz))"
Enter LDAP Password: 
dn: CN=Tiago Cruz,CN=Users,DC=dominio
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Tiago Cruz
sn: Cruz
givenName: Tiago
initials: ti
distinguishedName: CN=Tiago Cruz,CN=Users,DC=dominio
instanceType: 4
whenCreated: 20090427110042.0Z
whenChanged: 20090427190603.0Z
displayName: Tiago Cruz
uSNCreated: 555987
....

2-) Simulando o LDAP_AUTH do Squid na mão, passando na mesma linha usuário e senha desejado para ver se funciona bem:

$ /usr/lib/squid/ldap_auth -R -b "dc=dominio" -D "cn=tiago \
cruz,cn=users,dc=dominio" -w "senha" -f sAMAccountName=tcruz -h 10.10.10.10
tcruz senhacorreta
OK
tcruz senhaerrada
ERR Success

Lembrando que se você estiver usando Proxy Transparente, você deverá configurar o endereço do Proxy diretamente no navegador do usuário pois a autenticação não funcionará.

Se você não sabe se usa Proxy Transparente, seria algo mais ou menos assim:

# No squid:
http_port 3128 transparent
 
# No firewall:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A PREROUTING -s 10.10.10.0/255.255.255.0 -p tcp --dport 80 -j REDIRECT --to-port 3128

A idéia é pegar todo o tráfego que vem da sua rede local com destino à porta 80/tcp e encaminhar para o squid na porta 3128/tcp, de forma transparente. Funciona muito bem, mas caso você queira autenticação será necessário mexer no browser no cliente.

Para fazer uma configuração automática, sugiro a utilização de um Script de Logon mais ou menos como este arquivo “todos.bat”:

@echo off
net use f: \\server\shared
net use h: /home
regedit /s \\server\netlogon\proxy.reg

Sendo que o proxy.reg seria algo mais ou menos assim:

REGEDIT4
 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyServer"="10.10.10.1:3128"
"ProxyEnable"=dword:00000001
"EnableAutodial"=dword:00000000
"NoNetAutodial"=dword:00000000
"MigrateProxy"=dword:00000001

Mais informações:
- Configuring Squid on Linux to authenticate with Active Directory
- Configuring a Squid Server to authenticate off Active Directory
- Squid autenticado no Active Directory com Winbind
- Autenticando o SQUID no Active Directory via NTLM
- SaMBa 3.x -> Tudo o que você precisa saber (e não tinha para quem perguntar :)

Abraços e até a próxima! 8)