Proxy

Squid with Active Directory authentication on Ubuntu

apt-get install squid3 samba winbind krb5-user ntp
usermod -G winbindd_priv --append proxy

SAMBA
/etc/samba/smb.conf:

[global]
realm =
DOMENIU.ORG                 #SUBDOMENIU.DOMENIU.ORG
workgroup = DOMENIU                 #SUBDOMENIU
security = ads
netbios name =
squidproxy
debug timestamp = yes
encrypt passwords = yes
winbind use default domain = yes
winbind uid = 10000-20000
password server =
dc1.domeniu.org
idmap uid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
winbind gid = 10000-20000
max log size = 50000
winbind separator = \\
client lanman auth = no
lanman auth = no
client ntlmv2 auth =
yes #in functie de ce suporta DC-ul
ntlm auth = no
restrict anonymous = 2
log level = 3 passdb:5 auth:10 winbind:5
log file = /var/log/samba/samba.log
socket options = TCP_NODELAY SO_RCVBUF=16384 SO_SNDBUF=16384

KERBEROS
/etc/krb5.conf:

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
#allow_weak_crypto=true                               #in functie de server trebuie decomentat link
ticket_lifetime = 24000
default_realm =
DOMENIU.ORG                           #SUBDOMENIU.DOMENIU.ORG
default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc     #in functie de server trebuie comentate
default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc     #in functie de server trebuie comentate
dns_lookup_realm = false
dns_lookup_kdc = false

[realms]
DOMENIU.ORG = {                                       #SUBDOMENIU.DOMENIU.ORG
kdc =
dc1.domeniu.org:88
admin_server =
dc1.domeniu.org:749
default_domain =
domeniu.org                          #SUBDOMENIU.DOMENIU.ORG
}

[domain_realm]
.domeniu.org = DOMENIU.ORG
domeniu.org
= DOMENIU.ORG
#.subdomeniu.domeniu.org = SUBDOMENIU.DOMENIU.ORG
#
subdomeniu.domeniu.org = SUBDOMENIU.DOMENIU.ORG

[kdc]
profile = /etc/krb5/kdc.conf

SQUID
/etc/squid3/squid.conf

shutdown_lifetime 3 seconds

http_port 3128
cache_mem 128 MB
maximum_object_size 4096 KB
maximum_object_size_in_memory 16 KB
cache_effective_user proxy

#logfiles, cache dir
coredump_dir none
cache_dir ufs /var/spool/squid3 512 16 256
access_log /var/log/squid3/access.log common
cache_store_log none

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 1025-65535 # unregistered ports

acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl ym dstdomain "/etc/squid3/ym.txt"
acl noauth dstdomain "/etc/squid3/filter_noauth_domain.acl"
acl im dst "/etc/squid3/ym9.acl"

http_access allow noauth
http_access allow im

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp -d0
auth_param ntlm children 120
#pe o singura linie
external_acl_type ldap %LOGIN /usr/lib/squid3/squid_ldap_group -p 3268 -D
lookup@domeniu.org -W /etc/squid3/secret -b "DC=domeniu,DC=org" -h ip_domain_controller -f "(&(member=%u)(cn=%g)(objectClass=group))" -B "dc=domeniu,dc=org" -F "(sAMAccountName=%s)" -S
#external_acl_type ldap %LOGIN /usr/lib/squid3/squid_ldap_group -p 3268 -D lookup@domeniu.org -W /etc/squid3/secret -b "DC=subdomeniu,DC=domeniu,DC=org" -h ip_domain_controller -f "(&(member=%u)(cn=%g)(objectClass=group))" -B "dc=subdomeniu,dc=domeniu,dc=org" -F "(sAMAccountName=%s)" -S

acl SquidLdapUsers proxy_auth REQUIRED

acl ldap_ALL external ldap "/etc/squid3/usrall.acl"
acl ldap_BAD external ldap "/etc/squid3/badall.acl"
acl ldap_gold external ldap "/etc/squid3/gold.acl"
acl ldap_im_block external ldap "/etc/squid3/imgroup.acl"
acl block dstdomain "/etc/squid3/filter_block_domain.acl"

acl downloads urlpath_regex -i "/etc/squid3/block_files.acl"

#limitare upload la ~5MB
acl UPLIMIT req_header Content-Length [5-9][0-9]{6} [0-9]{8,}

http_access deny ldap_im_block ym
http_access allow UPLIMIT ldap_gold
#deny_info ERR_UPLIMIT_FILES UPLIMIT
http_access deny UPLIMIT
http_access allow ldap_gold downloads
#deny_info ERR_BLOCKED_FILES downloads
http_access deny downloads
http_access allow ldap_gold block
#deny_info ERR_BLOCKED_SITES downloads
http_access deny block
#deny_info ERR_BLOCKED_USERS downloads
http_access deny ldap_BAD

http_access allow SquidLdapUsers ldap_ALL
http_access deny all

Dupa cum se observa mai sus, pe langa autentificarea userilor la Active Directory, putem crea mai multe reguli bazandu-ne pe grupurile din AD, care ne vor permite sa acordam acces granular utilizatorilor.

Sa le luam pe rand ca sa vedem ce putem face cu fiecare ACL:

1. acl ldap_ALL external ldap “/etc/squid3/usrall.acl”

Prin acest ACL, acordam acces membrilor unui grup din AD la accesarea paginilor web prin proxy. In acest grup se vor regasi toti utilizatorii care au acces “normal” la internet.

2. acl ldap_BAD external ldap “/etc/squid3/badall.acl”

Prin acest ACL ne vom folosi de un grup din AD in care membrii grupului nu vor avea acces la internet.

3. acl ldap_gold external ldap “/etc/squid3/gold.acl”

Prin acest ACL, vom putea acorda acces extins la membrii unui anumit grup de utilizatori din AD, de exemplu la administratorii de sistem, care nu vor mai avea restrictii la descarcarea fisierelor .exe sau .mp3 etc.

4. acl ldap_im_block external ldap “/etc/squid3/imgroup.acl”

Prin acest ACL ne vom folisi de un grup din AD in care membrii grulului nu vor avea acces la Yahoo Messenger

Directivele deny_info din fisierul de configurare ne permit sa definim cate o pagina personalizata care va aparea utilizatorului cand acesta va declansa un anumit ACL. De exemplu, cand va incerca sa descarce un fisier .exe, se poate afisa o pagina html in care sa se prezinte motivele pentru care accesul la aceste fisiere este restrictionat. Fiecare pagina se va crea in directorul /etc/squid3/errors/ ( pe care va trebui sa-l creati ), iar numele paginii va fi exact acela din directiva ( de ex. ERR_BLOCKED_FILES ).

Sa luam pe rand acum fisierele ACL pe care le vom crea si rolul lor:

Un caz aparte care necesita doua ACL-uri este accesul la Yahoo Messenger, care in varianta mai veche de 9.0 se conecteaza la servere gen *.msg.yahoo.com, iar in varianta mai mare de 9.0 se conecteaza la serverele yahoo dupa IP, deci nu mai putem folosi nume de domenii. Pentru a acoperi ambele situatii vom crea doua ACL-uri.

1. se creaza fisierul /etc/squid3/ym.txt

Se editeaza si se scrie in el:

.login.yahoo.com
.msg.yahoo.com

2. se creeaza fisierul /etc/squid3/filter_noauth_domain.acl

Se foloseste pentru site-urile la care se conecteaza diverse aplicatii care nu stiu sa se autentifice corect si atunci permitem accesul fara autentificare. Din experienta, aplicatiile java nu stiu sa furnizeze proxy-ului userul si parola pentru autentificare. Un caz particular este Yahoo messenger versiuni mai vechi de 9.0, care nu stie sa furnizeze detaliile de autentificare proxy-ului.

Se editeaza fisierul si se trec domeniile necesare, fiecare pe o linie noua:

.msg.yahoo.com
.aaa.com

3. se creeaza fisierul /etc/squid3/ym9.acl

Se editeaza si in el se trec IP-urile serverelor de yahoo. Din practica, cele de mai jos au dovedit ca sunt suficiente pentru functionarea fara probleme a lui YM v. 9 , daca mai descoperiti altele puteti sa le treceti in lista:

98.136.112.0/24
216.155.193.0/24
68.180.219.0/24
76.13.6.0/24

4. se creaza fisierul /etc/squid3/usrall.acl

Trecem acum la fisierele care definesc grupurile din Active Directory. In fisierul de mai sus trecel Grupul din AD care permite accesul utilizatorilor obisnuiti la internet ( si care vor avea anumite restrictii, definite mai jos)

Spre exemplu, cream un grup in AD denumit Acces Internet in care trecem toti userii care vor avea acces la internet. Trecem numele grupului in fisierul nou creat:

Acces Internet

5. se creaza fisierul /etc/squid3/badall.acl

In acest fisier vom trece numele grupului din AD in care utilizatorii membri nu vor avea acces la proxy.

6. se creaza fisierul /etc/squid3/gold.acl

Asa cum spuneam mai sus, avem posibilitatea sa acordam acces fara nici un fel de restrictii unor utilizatori care sunt membri ai unui grup sau mai multe, de exemplu Domain Admins, sau VIP Users etc. . Numeme grupurilor se trece in acest fisier.

7. se creaza fisierul /etc/squid3/imgroup.acl

Se va crea un grup in AD in care vor fi trecuti userii care nu vor avea acces la Yahoo Messenger, de exemplu NoYahhUsers. Numele grupului va fi trecut in acest fisier.

8. se creaza fisierul /etc/squid3/block_files.acl

In acest fisier se pot introduce restrictii de download pentru utilizatorii obisnuiti, de exemplu blocam descarcarea fisierelor .exe si .mp3 ; introducem in fisierul nou creat urmatoarele:

\.exe$
\.mp3$

Pe acest model se poate face un ACL cu rep_mime_type care sa blocheze stream-urile audio/video.

Restrictiile trecute in acest ACL vor fi doar pentru utilizatorii obisnuiti, utilizatorii din grupurile speciale trecute in fisierul gold.acl vor trece peste aceste restrictii.

9. se creaza fisierul /etc/squid3/filter_block_domain.acl

In acest fisier se pot introduce domeniile ce vor fi blocate de ex:

aabb.com

10. se creaza fisierul /etc/squid3/secret

In acest fisier trecem parola userului de AD prin intermediul caruia squid va putea sa interogheze baza de date AD dupa nume de utilizatori si grupuri.

Urmatorul pas este generarea unui fisier keytab pentru ca autentificarea prin Kerberos la Active Directory sa fie permanenta, fara a fi nevoie de a introduce un username/parola la fiecare pornirea a serviciilor.

De retinut faptul ca ora si data trebuiesc sincronizate cu cele de pe AD, si serverul Proxy trebuie sa aibe inregistrare in DNS valida, pentru ca kerberos sa functioneze. De asemenea, utilitarul ktpass de pe un server Windows 2003 SP1 nu genereaza un keytab valid! Mai multe informatii despre aceasta problema gasiti la adresa http://support.microsoft.com/kb/919557

Operatiunile se vor face pe DC folosind contul cu drepturi administrative:

1. Folositi Active Directory Users and Computers pentru a crea un cont de user pentru serverul de linux:
• Selectati folderul Users, click dreapta si selectati New, apoi user.
• Introduceti numele serverului de linux (ex squidserver)

Contul de user pentru serverul de linux poate fi creat in orice container, dar este indicat sa se creeze un nou OU (Organizational Unit) si sa creati contul aici. Userul nu necesita nici un fel de drepturi speciale, trebuie doar sa poata interoga baza de date LDAP.
2. Urmati aceasi procedura pentru a crea contul lookup cu parola lookup1$#D sau ce altceva doriti, important este sa le notati si sa le folositi in fisierele de configurare al proxy-ului squid. Acest cont va fi folosit pentru autorizarea grupurilor prin intermediul LDAP.

3. Folositi ktpass pentru a crea un fisier keytab si a seta contul pentru serverul de linux apoi copiati acest fiser pe serverul de linux in folderul /etc/krb5:

C:> ktpass -princ host/squidserver.domeniu.org@DOMENIU.ORG -mapuser squidserver -pass password /crypto DES-CBC-MD5 -out squidserver.keytab

Inlocuiti squidserver cu numele serverului dvs. de linux si password cu parola setata la pasul anterior.

Copiem fisierul keytab de pe controllerul de domeniu pe serverul squid in directorul /etc/ , apoi il importam in kerberos cu ajutorul utilitarului ktutil:

# ktutil
ktutil: rkt /etc/squidserver.keytab
ktutil: list
ktutil: wkt /etc/krb5.keytab
ktutil: q
# kinit –k –t squidserver.keytab

Daca kerberos este corect configurat, ora este sincronizata, exista inregistrare DNS valida, dupa ce dati aceasta comanda nu ar trebui sa primiti nici un mesaj de eroare.

In cazul in care serverul AD este subdomeniu intr-un domeniu mai mare, este posibil ca comanda kinit sa dea eroare, in acest caz trebuie specificata identitatea serverului ( principal ):

kinit -k -t squidserver.keytab host/squidserver.subdomain.domain.org@SUBDOMAIN.DOMAIN.ORG

Urmatoarea etapa consta in adaugarea serverului proxy ca membru in domeniul Windows AD:

#net ads join -U AdminAccount -S dc1.domeniu.org

In loc AdminAccount folositi contul cu drepturi administrative si parola aferenta acestuia. Rezultatul comenzii de mai sus este crearea unui cont de computer in AD.
In acest moment putem porni serverul samba:

#/etc/init.d/samba restart
#/etc/init.d/winbind restart

Teste si verificari care se pot face in acest moment:

a) testam existenta ticket-ului in Kerberos:

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: host/
squidserver.domeniu.org@DOMENIU.ORG

Valid starting Expires Service principal
03/09/09 12:49:06 03/09/09 19:29:06 krbtgt/
DOMENIU.ORG@DOMENIU.ORG

b) verificam daca Samba poate citi userii si grupurile din AD:

#wbinfo –t
checking the trust secret via RPC calls
succeeded
#wbinfo –u
......apar userii din domeniu
#wbinfo –g
..... apar grupurile din domeniu

c) verificam daca Squid se integreaza cu Samba:

#/usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
DOMAIN\username password
utils/ntlm_auth.c:check_plaintext_auth(292)
NT_STATUS_OK:
Success (0×0)
OK

/usr/lib/squid3/squid_ldap_group -p 3268 -D lookup@domeniu.org -W /etc/squid3/secret -b "DC=domeniu,DC=org" -h ip_domain_controller -f "(&(member=%u)(cn=%g)(objectClass=group))" -B "dc=domeniu,dc=org" -F "(sAMAccountName=%s)" –S –d 10
user group

Connected OK
user filter '(&(sAMAccountname=username)(objectClass=User))', searchbase 'dc=domain,dc=org'
group filter '(&(member=CN=Nume\5c, Prenume,OU=IT Users,OU=Users,OU=SDC,DC=domeniu,DC=org)(cn=Acces Internet)(objectClass=group))', searchbase 'DC=domeniu,DC=org'
OK

Daca grupul care se testeaza contine spatii, acestea se va inlocui cu “%20”. De exemplu testam userul “teste” care este membru in grupul AD Acces Internet:

teste Acces%20Internet

Other info:

For Windows 7 you have to use at least Ubuntu Server 9.10 or use this hack:
1. In HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

If it doesn’t exist, create a DWORD value named LmCompatibilityLevel and set the value to 1 to use LM NTLM and NTLMv2 if is negociated, this is

Also it works establishing the value to 0, and 3 though for more safety the value using 3 though with old operating systems it will not work on having used obligatorily NTLMv2.

2. Reboot
http://old.nabble.com/Windows-7-beta-and-NTLM-td21377271.html

For live messenger:

1.     Start Internet Explorer.
2.     On the Tools menu, click Internet Options.
3.     On the Advanced tab, in the Security section, make sure that the Check for server certificate revocation check box is cleared. Also, make sure that the Use SSL 2.0 and the Use SSL 3.0 check boxes are selected.
4.     Click OK.
Check your Internet Explorer security settings


Original Slackware version
here

By WladyX on 17 November, 2009 | General, Proxy, Ubuntu | A comment?

How to set human readable date and time in squid logs

By WladyX on 7 August, 2009 | General, Proxy | A comment?

metropolitan

#!/bin/bash                                                                                                                                   
cd /admin                                                                                                                                     
wget http://monitor.cyberspace.ro/routes.txt -O /admin/metropolitan.temp                                                                      
mipclasses < metropolitan.temp > metropolitan.txt                                                                                             
rm -f metropolitan.temp                                                                                                                       
squid -k reconfigure     

By WladyX on 20 February, 2008 | Proxy | A comment?

Squid

To translate the timestamps in Squid’s access.log pipe the data through: perl -pe 's/^\d+\.\d+/localtime($&)/e;'
E.g. tail -f /var/log/squid/access.log | perl -pe 's/^\d+\.\d+/localtime($&)/e;'

By WladyX on 12 November, 2006 | Proxy | 1 comment