Instalare proxy Squid cu autentificare la Active Directory

User Rating: ONONONONON / 5
Poor Best 
Written by Teodor Lupan

Instalare Squid cu autentificare la Active Directory in Slackware Linux


Scopul acestui tutorial este de a instala si configura un proxy server, facandu-se autentificarea userilor la un Active Directory Microsoft. Metoda de autentificare aleasa asigura un maximum de securitate la autentificare, cat si o usoara gestiune a utilizatorilor care se face din Active Directory.

Pe langa controlul utilizatorilor din Active Directory, tutorialul va prezinta mai multe modele de ACL-uri care permit controlul granular al utilizatorilor la paginile web. Va exista o categorie de utilizatori care vor avea acces la internet dar cu restrictii, nu for putea descarca fisiere .exe si .mp3, vor avea o limita de upload de cca. 5 MB, si o alta categorie de utilizatori care vor avea acces deplin. Veti descoperi posibilitatea de a bloca accesul la Yahoo Messenger folosind tot grupuri din Active Directory, si altele. Toate aceste facilitati se pot extinde si modela in functie de necesitatile voastre odata ce ati facut integrarea intre squid si Active Directory.

Am ales pentru exemplificare distributia linux Slackware intrucat este foarte potrivita pentru rolul de server, cat si pentru faptul ca vom avea ocazia sa compilam programele necesare si sa includem suport pentru anumite optiuni care vor face posibil acest setup. Pentru alte distributii va fi suficient in general sa instalati pachetele necesare prin package managerul oferit de distributia respectiva, fisierele de configurare vor fi modificate conform acestui tutorial.

Software-ul necesar:

1.     Squid Proxy Server
2.     SAMBA
3.     Open-LDAP
4.     MIT Kerberos


Intrucat in Slackware Linux nu sunt packete oficiale de Squid si Kerberos, iar packetul de Samba nu este compilat cu suport de Active Directory, toate aceste programe trebuiesc compilate din surse, cu optiunile necesare.

Inainte de a incepe, asigurati-va ca urmatoarele pachete sunt instalate:

openldap-client din slackware/n
cyrus-sasl din slackware/n
openssl din slackware/n
openssl-solibs din slackware/a
m4 din slackware/d



Mai intai vom compila si instala Kerberos:

tar zxvf krb5-1.6.tar.gz
cd krb5-1.6/src
./ configure --without-krb4 --prefix=/usr --sysconfdir=/etc/krb5 --with-ldap
make && make install

Daca nu am intampinat nici o eroare, putem trece la pasul urmator, instalarea Samba:

tar zxvf samba-3.2.5.tar.gz
cd samba-3.2.5/source
./configure --with-configdir=/etc/samba --sbindir=/usr/sbin --bindir=/usr/bin --sysconfdir=/etc/samba --libdir=/usr/lib/samba --with-piddir=/var/run --with-logfilebase=/var/log/samba --with-lockdir=/var/cache/samba --with-privatedir=/etc/samba/private --with-swatdir=/usr/share/swat --with-winbind --with-smbmount --with-ads --with-ldap --with-krb5=/usr

make && make install



In cazul in care apare eroarea ca libraria libkrb5 nu este gasita la comanda configure, se mai adauga optiunea  LDFLAGS=-L/usr/lib la comanda configure

Ultimul program pe care il vom instala este squid:

#tar jxvf  squid-2.6.STABLE22.tar.bz2
#cd squid-2.6.STABLE22
#./configure --enable-storeio=aufs,ufs,diskd,coss,null --enable-err-languages=English --enable-delay-pools --enable-auth=basic,ntlm --enable-ntlm-auth-helpers=SMB --enable-external-acl-helpers=ldap_group --enable-linux-netfilter --enable-arp-acl --enable-ssl --enable-basic-auth-helpers=NCSA,YP,multi-domain-NTLM,MSNT,SMB,getpwnam --with-large-files --enable-ntlm-fail-open --sysconfdir=/etc/squid --enable-removal-policies=lru,heap --enable-icmp --bindir=/usr/local/bin --sbindir=/usr/local/sbin --datadir=/usr/share/squid --localstatedir=/var/squid --libexecdir=/usr/libexec

#make && make install
#groupadd squid
#useradd squid –d /var/squid –s /bin/false
#chown squid:squid /var/squid –R
#chgrp squid /var/cache/samba -R


Mai departe vom trece la editarea fisierelor de configurare pentru programele instalate.

Este important sa pastrati numele de domeniu cu litere mari acolo unde apare, altfel autentificarea nu va functiona!

Inlocuiti ceea ce este scris cu rosu cu numele voastre de domeniu si controller de domeniu.


SAMBA

/etc/samba/smb.conf

[global]
realm = DOMENIU.ORG
workgroup = DOMENIU
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/krb5.conf

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

[libdefaults]
ticket_lifetime = 24000
default_realm = DOMENIU.ORG
default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc
default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc
dns_lookup_realm = false
dns_lookup_kdc = false

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

[domain_realm]
.domeniu.org = DOMENIU.ORG
domeniu.org = DOMENIU.ORG


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





SQUID

/etc/squid/squid.conf

http_port               ip_server:3128
cache_mem               128 MB
maximum_object_size     4096 KB
maximum_object_size_in_memory   16 KB
cache_effective_user    squid

#logfiles, cache dir
cache_dir ufs /var/squid/cache 512 16 256
cache_access_log /var/squid/logs/access.log

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
acl all src 0.0.0.0/0.0.0.0
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/squid/ym.txt"
acl noauth dstdomain "/etc/squid/filter_noauth_domain.acl"
acl im dst "/etc/squid/ym9.acl"

http_access allow noauth
http_access allow im

auth_param ntlm program /var/samba/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/libexec/squid_ldap_group -p 3268 -D -W /etc/squid/secret -b "DC=domeniu,DC=org" -h ip_domain_controller -f "(&(member=%v)(cn=%a)(objectClass=group))" -B "dc=domeniu,dc=org" -F "(sAMAccountName=%s)" -S

acl SquidLdapUsers proxy_auth REQUIRED

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

acl downloads urlpath_regex -i "/etc/squid/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/squid/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/squid/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/squid/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/squid/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/squid/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/squid/ym.txt

Se editeaza si se scrie in el:

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

2. se creeaza fisierul "/etc/squid/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/squid/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.139/24

4. se creaza fisierul /etc/squid/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/squid/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/squid/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/squid/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/squid/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/squid/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 –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/krb5 , apoi il importam in kerberos cu ajutorul utilitarului ktutil:


# ktutil
ktutil: rkt /etc/krb5/squidserver.keytab
ktutil: list
ktutil: wkt /etc/krb5/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/rc.d/rc.samba start

sau in cazul altei distributii linux porniti samba asa cum se recomanda la acea distributie, de exemplu pentru Fedora veti da comanda service samba start iar pentru Ubuntu /etc/init.d/samba start

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/

Valid starting Expires Service principal
03/09/09 12:49:06 03/09/09 19:29:06 krbtgt/




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/libexec/squid_ldap_group -p 3268 -D -W /etc/squid/secret -b "DC=domeniu,DC=org" -h ip_domain_controller -f "(&(member=%v)(cn=%a)(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

Last Updated Monday, 29 December 2008

Polls

Ce antivirus folositi?

Results

Who's online

We have 3 guests online