Instalare proxy Squid cu autentificare la Active Directory
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









