Proxy
Un proxy és un servidor intermediari. Per tant, és un servei que està col·locat entre l'emissor i el receptor de la informació. Les funcions d'un proxy poden ser diverses però bàsicament les podem resumir en dos grans objectius: permetre / denegar l'accés a una pàgina web i implementar memòria cau. Tot i que alguns proxys poden implementar altres protocols diferents al HTTP i HTTPS, per a realitzar les pràctiques utilitzarem l'aplicació squid, que està habilitat només per als serveis HTTP i HTTPS.
Característiques
- Reduir l'ús de l'ample de banda en les connexions a la WWW.
- Millora el rendiment en la descarrega de planes web (memòria cau)
- Estadístiques sobre el trànsit web
- Control sobre les pàgines visitadesd pels usuaris
- Limitar la navegació als usuaris autoritzats
- Reduir la càrrega dels servidors web propis
Configuració squid
El fitxer de configuració de squid és squid.conf, ubicat en la carpeta /etc/squid/ . Aquest fitxer, com a la majoria de fitxers en els sistemes Linux, està format per comentaris: línies que comencen amb el símbol #, i per directives amb els seus valors. Per a validar la configuració del servei proxi , quan aquest està implementat amb el software squid, utilitzem la comanda
squid -k check
Directives
Per a configurar el servei squid utilitzem diferents tipus de directives. Podem diferenciar dos grans blocs de directives, les llistes de control d'accés, les llistes per a configurar permissos i les directives de propòsit general.
cache_effective_user
Amb aquesta directiva podem especificar quin serà l'usuari que executarà el servei de squid . Com a mesura de seguretat cal executar el servei sempre amb un usuari diferent de root . Cal que aquest usuari disposi dels permissos mínims per a realitzar les funcions de proxi. Normalment s'utilitza l'usuari squid que es crea en el procés d'instal·lació de forma automàtica.
cache_effective_user squid
http_port
El port per defecte del servei proxy és el 3128. Per tant, en el fitxer de configuració s'haurà d'especificar que el servei estigui "escoltant" aquest port. Per fer-ho, utilitzem la directiva http_port. Aquesta directiva es pot especificar múltiples vegades per a tenir una llista de ports als quals està "escoltant" el servei de proxy.
http_port 3128
http_port 8080
En la configuració anterior, se li està especificant al proxy, que les connexions podran efectuar-se a través del port 3128 i del port 8080.
Llistes control d'accés - Introducció
Les llistes de control d'accés permeten agrupar els diferents criteris que han de determinar si una determinada petició se li concedeix l'accés o se li revoca l'accés. La configuració per defecte del servei proxy squid, denega totes les peticions d'accés a planes web. Per tant, caldrà realitzar canvis a la configuració posterior a la instal·lació per tal que els usuaris puguin accedir a Internet.
Podem classificar les llistes de control d'accés com a llistes ràpides i llistes lentes. Les llistes lentes es caracteritzen per a la necessitat de realitzar consultes alternatives per a determinar si l'accés s'ha de garantitzar o denegar. Així, per exemple, si una llista d'accés fa referència al nom d'un equip serà necessari una consulta adicional per part del proxy per a determinar la IP d'aquest equip. En canvi, si la llista de control d'accés fa referència a la IP d'un equip, el proxi ja disposa de tota la informació no essent necessàries consultes adicionals per a garantir o denegar l'accés.
Per a definir una llista d'accés utilitzem la directiva acl . El primer paràmetre d'aquesta directiva és el nom que volem donar a l'agrupació o que volem utilitzar per a referir-nos a la llista. A continuació cal especificar el tipus de la llista de control d'accés i els arguments associats a aquest tipus.
acl nomACL aclTipus argument ...
acl nomACL aclTipus "fitxer" ...
# quan utilitzem un fitxer, cal que cada línia del fitxer contingui un únic element de definició.
Funcionament general proxy
Primer definim les llistes de control d'accés que ens permeten agrupar els conceptes per a diferents criteris: segons l'origen, segons la destinació,... Una vegada fetes les agrupacions utilitzem la directiva http_access per a garantir o denegar l'accés al destí sol·licitat. Les directives d'accés s'inclouen de forma seqüencial en el fitxer: una darrera l'altra. L'ordre és important, ja que quan es localitza una directiva que compleix el criteri de la llista de control d'accés, el servei aplica la directiva sense tenir en compte les declaracions posteriors. En el cas que una directiva d'accés no s'apliqui ja que no es compleix la condició definida per la llista de control d'accés, el sistema avalua la següent directiva del fitxer fins a localitzar una directiva que compleixi amb la condició. Per aquest motiu és important que l'última directiva de configuració d'accés del servidor Proxy denegui l'accés a tothom i a tot. Si la connexió no compleix amb cap de les condicions anteriors, la petició serà denegada aplicant-se el criteri de màxima restricció.
Configuració accés a Internet
Per a obrir el nostre servidor proxy per tal que els clients puguin navegar per la web cal afegir aquestes dues línies en el fitxer de configuració de Squid
acl MyNetwork src 192.168.100.0/24
http_access allow MyNetwork
La primera línia defineix una llista de control d'accés identificada amb el nom de MyNetwork. Aquesta llista està definida mitjançant src per source (origen). Per tant, s'estan identificant tots els paquets de dades que tenen com a origen l'adreça de xarxa 192.168.100.0/24.
La segona línia determina que els paquets provinents de l'adreça de xarxa identificada per la llista de control d'accés MyNetwork, han de tenir accés ("allow") a Internet.
L'ubicació de les directives de configuració dins de l'arxiu és important. No és el mateix ubicar una directiva al principi del fitxer o al final. De forma general declararem totes les llistes de control d'accés al principi de l'arxiu , mentre que a continuació s'especificarà quins són els permisos (allow/deny) associats a cada llista de control d'accés.
acl All src 0/0
acl Manager proto cache_object
acl Localhost src 127.0.0.1/32
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
acl SSL_ports 443 563
acl CONNECT method CONNECT
acl MyNetwork src 192.168.0.0/16
http_access allow Manager Localhost
http_access deny Manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow MyNetwork
http_access deny All
Tipus ACL
El proxi Squid permet multitud de tipus de llistes de control d'accés (ACL). En aquest document només es tractaran les més importants i habituals en les diferents configuracions.
Tipus src
Amb src es determina que la llista de control d'accés fa referència a l'origen, o sigui, el client que està sol·licitant l'accés a un servei web. Un exemple de l'utilització d'aquesta directiva seria:
acl MyNetwork src 192.168.100.0/24
http_access allow MyNetwork
on MyNetwork és una referència a tots els equips de la xarxa 192.168.100.0 . Per tant, tots els equips de la xarxa 192.168.100.0/24 que utilitzen el servidor proxy amb aquesta configuració, tindran habilitat l'accés. Primer analitzarem els tipus d'ACL que fan referència a les direccions IP implicades, ja sigui com a origen o com a destinació. A continuació s'inclouran ACLs relacionades amb els dominis.
Tipus dst
Utilitzem dst quan es vol definir una adreça o rang d'adreces IP relacionades amb la destinació de la petició. Podem utilitzar el nom de l'equip o directament la IP per a referenciar la destinació.
acl search dst www.google.com
En el cas que la IP es resolgui a més d'una IP , totes les IPs formaran part de la definició de l'acl. Quan es volen realitzar regles a partir de la informació de destí del paquet és aconsellable utilitzar sempre el nom que identifica el destí. Cal tenir en compte que la IP del destí pot variar en qualsevol moment sense que en tinguem constància.
Tipus myip
Utilitzem myip quan el servidor proxy té configurades tres direccions IP: 2 direccions IP associades per a la xarxa interna i una altra direcció IP associada a la gateway o porta d'enllaç. Si m'interessa diferenciar les dues xarxes locals , ho puc fer de forma fàcil amb myip . Per exemple, en una escola hi ha una xarxa pels alumnes i una xarxa pels professors. Supsem que la xarxa dels alumnes és 172.16.0.0 mentre que la dels professors és 172.17.0.0 . En el proxi tenim configurades dues xarxes amb les direccions IP: 172.16.255.254 (adaptador de xarxa on es connecten els alumnes) i 172.17.255.254 (adaptador de xarxa on es connecten els professors). Utilitzant myip per a diferenciar les dues xarxes a nivell de proxy, podria crear les següents ACLs.
acl alumnat myip 172.16.255.254
acl professorat myip 172.17.255.254
Utilitzant alumnat i professorat puc parametritzar quins serveis ha d'utilitzar cada un dels col·lectius.
Exemples definició IP
En els següents exemples de declaracions, cada bloc de direccions contenen una declaració equivalent:
acl singleIP src 172.16.44.21/255.255.255.255
acl singleIP src 172.16.44.21/32
acl singleIP src 172.16.44.21
acl rangeIP src 172.16.55.32/255.255.255.248
acl rangeIP src 172.16.55.32/29
acl rangeIP src 172.16.66.0/255.255.255.0
acl rangeIP src 172.16.66.0/24
acl rangeIP src 172.16.66.0
També podem declarar rangs d'adreces que inclouen diferents adreces IP. Per exemple, la configuració següent
acl multiX src 172.16.16.0-172.16.18.0/24
inclou les adreces de xarxa 172.16.16.0/24, 172.16.17.0/24 i 172.16.18.0/24. Tot i que la declaració anterior és correcte el sistema és més eficient si utilitzem una acl per a cada xarxa
acl multiX src 172.16.16.0/24
acl multiX src 172.16.17.0/24
acl multiX src 172.16.18.0/24
Tipus per dominis
En un servidor proxy és habitual voler eliminar l'accés a un determinat domini. Per a poder definir quins dominis han de ser accessibles i quins no disposem de dstdomain.
acl google dstdomain www.google.com
L'exemple anterior defineix una acl pel domini "www.google.com" . Si deneguem l'accés utilitzant aquesta acl, les peticions a www.google.com seran denegades. Sí que podrem utilitzar altres direccions associades al domini google.com , com mail.google.com, drive.google.com, ... Per a definir una llista d'accés que inclogui tots els equips d'un determinat domini, cal incloure un "." a l'inici de la declaració del domini.
acl google dstdomain .google.com
Si deneguem l'accés utilitzant la definició de la llista de control d'accés anterior, totes les peticions associades a google.com: www.google.com, mail.google.com, drive.google.com, ... seran denegades.
Dominis amb expressions regulars
El problema de definir els dominis utilitzant dstdomain és la seva poca fexibilitat. Suposem que vull excloure tots els dominis que contenen la paraula "porn". Evidentment, hi ha molts dominis que contenen aquesta paraula i la seva inclusió 1 a 1 en la llista de distribució és poc pràctic i flexible. Per aquest motiu podem utilitzar expressions regulars per a definir el domini. Una expressió regular és una forma d'indicar quines característiques ha de complir un determinat text.
acl torrent_sites dstdom_regex -i porn
En l'exemple, observem l'ús de dstdom_regex (destination domain regular expression) per a indicar quins elements ha de tenir el text. Cal tenir en compte que el proxi SQUID és case-sensitive. Per tant, el text "Porn" i "porn" són dos textos diferents. Amb l'argument -i associada a l'ACL indiquem que la comparació s'ha de realitzar sense tenir en compte si el text està en majúscules o minúscules.
Tipus segons el port de comunicacions
Quan volem declarar regles segons el port al qual ens volem connectar , utilitzem el tipus de llista port.
acl noSSLPorts port 80 25 110
acl SSLPorts 443 465 995
acl Ports 1025-65535
Les dues primeres llistes defineixen un conjunt de ports indicant el número de port de forma individual. En canvi, l'ACL de nom Ports defineix un rang de ports, en realitat inclou tots els ports no privilegiats.
Mètodes HTTP
Per mètode HTTP entenem les diferents funcions implementades en el protocol HTTP o HTTPS. El servei proxy Squid permet fer una configuració personalitzada per als diferents mètodes implementats en el protocol de web: CONNECT, GET, POST...
Cal tenir en compte que tots els mètodes estan habilitats per defecte excepte el mètode connect que cal habilitar de forma explícita en el fitxer de configuració. Cal tenir en compte que aquesta configuració ja està inclosa en el fitxer de configuració de squid de forma predeterminada.
acl SSL_ports 443 563
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
Configuració per protocols
Apart del servei http o https, utilitzant el proxi podem limitar l'accés a altres protocols. Per a configurar la llistes de control d'accés relacionades amb els protocols utilitzem la paraula clau proto. Per exemple, si volem limitar l'accés al servei FTP o autoritzar-ne el seu ús utilitzarem la declaració
acl ftp_requests proto FTP
http_access deny ftp_requests
Segons el contingut del fitxer HTML
Amb el tipus d'acl rep_mime_type i req_mime_type el servidor proxy analitza la capçalera del fitxer HTML. Aquesta ACL inspecciona el contingut de la informació associada a content-type per a fer el filtre. En la imatge es pot veure el detall d'una capçalera d'un paquet html. En aquest cas, el tipus de contingut (content-type) és una imatge jpeg per la capçalera seleccionada. Cal tenir en compte que el filtre només es pot aplicar si el servidor web envia informació relacionada amb la capçalera
Podem utilitzar aquesta informació per a realitzar filtres en el nostre servidor proxi. Un exemple per a filtrar totes les imatges d'una plana web seria:
Per aplicar la directiva cal fer constar que estem utilitzant http-reply-access enlloc de http-access
ACL basada en el temps
Squid permet la restricció de l'accés basat en el temps. Per exemple, puc limitar l'accés a un servei a una franja horaria o a un dia determinat. Utilitzem el tipus de llista time per a realitzar aquest tipus de configuració.
acl ACL_NAME time [diaAbreviat] [h1:m1-h2:m2]
Els valors possibles pel paràmetre diaAbreviat són:
Nom | Abreviatura |
Sunday | S |
Monday | M |
Tuesday | T |
Wednesday | W |
Thursday | H |
Friday | F |
Saturday | A |
All Weekdays | D |
Per exemple, la següent declaració
acl dies time SMW
acl tarda time D 14:00-19:00
La llista de control d'accés dies defineix una llista d'accés pels dies: diumenge (S-Sunday), dilluns (M-Monday) i dimecres (W-Wednesday), mentre que tarda defineix una llista de control d'accés diaria de les 2 a les 7 de la tarda.
Màxim nombre de connexions per usuari
Per tal d'utilitzar de forma responsable els recursos, el servei proxy permet definir quin nombre màxim de connexions en paral·lel pot executar un usuari.
acl usuaris src 10.2.0.0/16
acl connexions maxconn 15
http_access deny usuaris connexions
Autenticació
Una de les formes de millorar la seguretat del nostre proxi és l'utilització de l'autentificació: així l'usuari haurà d'introduir un usuari i password per tal de poder accedir al servei a través del proxi. Per habilitar l'autentificació del proxi el primer que hem de fer és crear els usuaris. Igual com feiem amb el servei web implementat per Apache utilitzarem la comanda htpasswd per a crear els usuaris. Donat que el servidor proxy i el servidor web estan en equips diferents, haurem d'instal·lar el paquet apache_utils per tal de disposar de la comanda _htpasswd. Acte seguit, ja podem crear els usuaris i associar-los a un fitxer que haurem de referenciar en la configuració del servei squid.
Cal tenir en compte que el password s'enviarà amb text clar. Per tant, qualsevol usuari amb un "sniffer" podrà obtenir el password de l'usuari en el proxi. La configuració de l'enviament de la paraula clau encriptada és complexe, ja que no tots els clients web suporten la encriptació de la informació d'autentificació amb el proxi. La solució passa per a crear un canal xifrat entre el client i el servidor proxi. D'aquesta forma, tota la informació s'enviarà de forma xifrada: Més info
Cache
El servei squid en la seva configuració per defecte no utilitza la memòria cau. Per tant, no permet que l'usuari es beneficii de l'accés a planes web d'altres usuaris. Per a configurar la memòria cau hem d'utilitzar la directiva cache_dir . El format d'aquesta directiva és:
cache_dir Type Directory-Name size L1 L2 [options]
Type
Sistema de fitxers que s'utilitzarà per a emmagatzemar la informació. Cal tenir en compte que es poden afegir vàries directives cache_dir en el fitxer de configuració per a incloure diferents volumns on guardar la informació. Com a sistema de fitxers hi ha múltiples alternatives (ufs, aufs, diskd,...). En el nostre cas utilitzarem aufs.
Directory-Name
Ubicació on es guardarà la informació relacionada amb la cache. L'ubicació per defecte és /var/spool/squid . Cal que el directori existeixi en el sistema i que l'usuari amb el qual s'està executant el servei squid tingui permisos d'escriptura.
Size
Espai que es vol destinar per a la memòria cau. S'utilitzen MBs com a espai de mesura.
L1 i L2
La cache s'estructura en una sèrie de directoris i subdirectoris. Amb L1 s'especifica quants directoris principals s'utilitzen amb la cache, mentre que amb L2 s'especifiquen quants subdirectoris ha de tenir cada directori. Els valors per defecte són 16 per a L1 i 256 per a L2
Options
read-only : memòria cau de només lectura. S'utilitza aquest mode si es vol canviar l'ubicació de la memòria en una altra ubicació.
refresh_pattern
Utilitzem la directiva refresh_pattern per a indicar quins elements s'han d'emmagatzemar en memòria cau. Cal tenir en compte que una primera limitació en l'emmagatzematge de planes web en memòria cau depèn de la pròpia plana a la qual accedim. Així, per exemple, si a la plana que s'està accedint és configurada per a no utilitzar memòria cau, cal tenir en compte que el servidor proxi no emmagatzemarà aquest tipus de plana.
El format de Refresh_pattern és:
refresh_pattern [-i] regex min percent max [options]
'Min' és el temps en minuts que un objecte sense un temps explícit de caducitat ha de ser considerat fresc. El valor recomanat és 0 ja que un temps superior pot provocar uns resultats erronis excepte en el cas que el dissenyador de la plana web hagi configurat de forma oportuna la caducitat de l'objecte.
'Max' és el temps màxim que un objecte sense un temps explícit de caducitat serà considerat fresc.
'Percent' de temps que l'objecte serà vàlid. Aquest temps es calcula a partir de la data d'última modificació de l'objecte i en relació al percentatge. Si quan es descarrega un objecte aquest ha estat modificat fa 4 hores i s'indica un percentatge del 50%, aquest objecte serà vàlid per les dues properes hores.
- Si l'objecte porta més temps emmagatzemat que l'assignat al paràmetre max, cal tornar a carregar l'objecte del servidor web. L'objecte està caducat.
- Si el temps transcorregut és inferior:
l'objecte és considerat vàlid.(data emmagatzematge en memòria - data creació de l'objecte) * percent
- La resposta és vàlida si el temps guardat en memòria cau és menor que el temps expressat en el paràmetre min.
- En qualsevol altre cas, cal tornar a carregar l'objecte del servidor web. L'objecte està caducat .
En el següent link disposeu de més informació relacionada amb la directiva refresh_pattern : https://www.mnot.net/talks/bits-on-the-wire/refresh_pattern/
Per exemple, si volem utilitzar memòria cau en totes les imatges png podem utilitzar la següent configuració
refresh_pattern -i .png 120 50% 10800 ignore-no-cache override-expire override-lastmod reload-into-ims
Comprovació
Per a comprovar que el proxi està configurat està funcionant utilitzant la memòria cau, podem executar la comanda: tail -f /var/log/access.log
Quan s'accedeix a una mateixa plana des de dos navegadors diferents, el registre ha de mostrar una entrada per TCP_MEM_HIT
Log
Els arxius de log ens informen de com funciona el servei o de quins problemes hi ha durant l'arrencada o el funcionament del mateix. Cal revisar de forma periòdica els arxius de registre per a verificar que no hi ha anomalies en el funcionament del proxi: ni atacs en el mateix! La revisió dels fitxers de log també ens ha de permetre fer un seguiment dels recursos consumits pel servei i de l'eficiència del mateix.
Per exemple, en la imatge, podem observar informació relacionada amb la memòria cau del servidor proxi.
El servei squid disposa de dos fitxers de log.
- cache.log
- access.log
Per defecte aquests fitxers estan ubicats en la carpeta /var/log/squid/
Quan el sistema no estigui funcionant de forma adecuada, cal examinar el fitxer cache.log . En aquest fitxer trobarem informació detallada de què està fallant i del problema que ha causat l'error.
En el fitxer access.log disposem de la informació sobre qui s'està connectant al servidor proxi, a quins llocs està accedint, i el resultat de l'accés, tant si és denegat com si és acceptat. També és en aquest fitxer on es registra quins accessos s'han pogut resoldre mitjançant un accés a la memòria cau del servei o quins accessos s'han resolt accedint al servidor web.
Cal tenir en compte que no només es mostren els accessos denegats sinó també aquells que estan autoritzats. D'aquesta forma, podem saber cada usuari quines planes ha consultat, tant si estan permeses com si estan prohibides.
Si observem la captura del log de la imatge, observem que hi ha diferents valors separats per espais. Per tant, podem dividir aquest log amb diferents col·lumnes:
1a col·lumna: moment en què s'ha fet la petitició. Es tracta del número de segons que han transcorregut des de l'1 de gener de l'any 1970 a les 00:00 hores. Per internet hi ha múltiples conversors per a obtenir la data a que es correspon d'una forma més "humana" o bé utilitzant la comanda date de Linux
2a col·lumna: temps de resposta expressat en mil·lisegons. 3a col·lumna: IP del client que ha fet la petició 4a col·lumna: combinació de la resposta del servidor Squid i del servidor HTTP. 5a col·lumna: mida en bytes de la resposta associada a la petició. Aquest no és la mida de l'objecte, ja que s'inclou també la mida de les capçaleres. 6a col·lumna: mètode utilitzat per a fer la petició 7a col·lumna: URL associada a la petició 8a col·lumna: usuari que ha fet la petició. Només en el cas que hi hagi implementada l'autentificació en el nivell de proxi. 9a col·lumna: informació jeràrquica relacionada amb la resposta. En el nostre exemple, el valor HIER_NONE indica que no hi ha informació jeràrquica associada a la resposta. En el següent enllaç podeu trobar informació sobre els diferents tipus de resposta: https://wiki.squid-cache.org/SquidFaq/SquidLogs#Hierarchy_Codes 10a col·lumna: informació associada al content-type per la petició realitzada.
logformat
Amb la directiva logformat podem personalitzar la informació que volem registrar en el funcionament del nostre servei proxi.
El format d'aquesta directiva és:
logformat <name> <format specification>
Per a informació sobre els valors possibles relacionats a specification: http://www.squid-cache.org/Doc/config/logformat/
Per exemple, si volem canviar la data de registre de log de la notació "epoch" de Linux a un format més comprensible, podem canviar personalitzar el format del registre amb la comanda
Estadístiques amb SQUID
Per a obtenir les estadístiques d'utilització del proxi amb els fitxers de text que genera el servei , tot i que possible, és dificultós. Per aquest motiu utilitzarem la eina "squid-graph" que ens permetrà obtenir dades d'utilització del servei de forma gràfica.
Primer, però, serà necessari instal·lar l'eina. Per a instal·lar l'eina serà necessari instal·lar la llibreria que incorpora eines gràfiques amb PERL.
Instal·lació i execució squid-graph
1.- Descarregar l'eina d'internet. En aquest link https://www.linux.com/news/keeping-eye-your-web-proxy-usage-squid-graph hi ha un enllaç que ens permet la descarrega de l'eina.
2.- Descomprimir l'arxiu descarregat d'Internet
3.- Instal·lar el paquet libgd-perl
4.- Executar el programa. Tot i que el programa es pot instal·lar el podem executar directament des de la línia de comandes. Per la seva execució executarem l'arxiu squid-graph
5.- Obrir el fitxer resultat de l'execució del programa en un navegador web.