Servidor proxy con AV
Tipo | Manual (How To) |
Categoria | Linux |
Plataforma | All GNU/Linux |
Dificultad | ![]() ![]() ![]() |
Contenido
Introducción
El propósito de este manual es describir la instalación y configuración del squid 2.7 (proxy http) + antivirus (ClamAV) + Dansguard (filtrado de paginas web + integración con ClamAV) en una Ubuntu 8.04.
No sé entrará demasiado en explicar cada aplicación que se va a instalar, se deja el tema de profundizar a discreción del lector ;)
Se presuponen ciertos conocimientos sobre administración linux y los componentes que esta guia explica su instalación.
Así pues empecemos con la instalación y configuración de la solución proxy + filtrado + antivirus.
Requisitos
Antes de proceder a la instalación se instalarán algunos requisitos previos para llevar a cabo la instalación de los componentes, teniendo en cuenta que el squid y el dansguardian se instalan desde fuentes y todas las opciones de compilación que se van a usar.
Así pues pasamos a instalar todo lo necesario
Paquetes/programas
Primero instalamos los paquetes necesarios
aptitude install gcc make perl build-essential libldap2-dev libsasl2-dev libpam0g-dev zlib-bin zlib1g-dev libpcre3-dev pkg-config
Parámetros kernel
Para un mejor funcionamiento se debe configurar una serie de parámetros en el kernel o comprobar que estén configurados con unos valores correctos.
Empecemos con los descriptores de ficheros, que por defecto solo se permiten en las sesiones bash 1024 ficheros abiertos, un número muy bajo para un squid con una carga moderada.
Por tanto se van a subir ese valor a algo más razonable como es 8192. Esto sólo se hará a nivel de sesión bash ya que el kernel el número de descriptores es bastante alto en la ubuntu 8.04
cat /proc/sys/fs/file-max 49910
Para configurar el número de descriptores basta con ejecutar el comando
ulimit -HSn 8192
Si queremos comprobar el valor de los descriptores basta con ejecutar el comando
ulimit -n
Por último hay que comprobar que el número de puertos dinámicos de cliente es suficientemente alto
cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
Instalación y configuración
A continuación pasaremos a instalar el primer componente, el antivirus clamav, necesario para bloquear los virus en la navegación web a través del proxy squid.
ClamAV
Optaremos por instalar el antivirus usando el sistema de paquetes de Ubuntu.
aptitude install clamav-daemon
Nota: Si estamos detrás de un proxy para acceder a internet se deberán configurar correctamente HTTPProxyUsername y HTTPProxyPassword en el fichero de configuración /etc/freshclam.conf
Una vez instalado basta que actualicemos manualmente la base de datos del ClamAV ejecutando el comando
freshclam
De forma predeterminada la base de datos de virus se actualiza cada hora.
Nota: Vigilar de vez en cuando que la versión del clamav sea lo suficiente reciente para soportar la detección de toda la base de datos de virus
A continuación se pasa a instalar el proxy squid versión 2.7
Squid
Primero de todo se baja y descomprime la última versión estable a día de hoy (04/04/09), la versión 2.7-estable6
wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE6.tar.gz tar zxvf squid-2.7.STABLE6.tar.gz cd squid-2.7.STABLE6
A continuación se va a pasar a compilar e instalar el squid (por defecto se instala en /usr/local/squid). Hay que tener en cuenta que antes de hacer el configure se debe configurar el número de descriptores de ficheros abiertos a 8192
ulimit -HSn 8192 ./configure --enable-storeio="aufs coss diskd ufs null" --enable-coss-aio-ops --with-aio --enable-removal-policies="heap,lru" \ --with-large-files --enable-large-cache-files --enable-delay-pools --enable-snmp --enable-linux-netfilter \ --enable-auth="basic digest negotiate ntlm" --enable-basic-auth-helpers="DB LDAP MSNT NCSA PAM POP3 SASL SMB squid_radius_auth YP" \ --enable-follow-x-forwarded-for && make && make install
Notas:
Se va a usar el método de almacenamiento de cache aufs, ya que el coss tarda varios minutos en arrancar la cache, provocando prácticamente un DoS de acceso a disco (I/O) en el disco duro del servidor durante ese tiempo.
Si se quisiera usar el coss se debe tener en cuenta que el tamaño máximo de objeto "cacheable" debe ser menor que el valor
del coss-membuf que se puede configurar en la compilación con la opción --enable-coss-membuf-size=COSS_MEMBUF_SIZE.
Comentar también que se puede ajustar el número de hilos que use el aufs mediante el parámetro de compilación --with-aufs-threads=NUMERO_HILOS
A continuacón debemos configurar el fichero /usr/local/squid/etc/squid.conf.
El de mi instalación queda así
########################### # Squid 2.7 configuration # ########################### # Listen port http_port 3128 # Cache cache_mem 512 MB maximun_object_size 1000000 bytes cache_dir aufs /opt/squid/squidcache/ 5000 16 256 #cache_dir coss /opt/squid/squidcache/coss 4000 max-size=1000000 #cache_dir coss /opt/squid/squidcache/coss 50000 max-size=1000000 maxfullbufs=4 membufs=20 block-size=4096 #cache_swap_log /opt/squid/log/cache_swap_log cache_log /opt/squid/log/cache.log cache_store_log /opt/squid/log/store.log # Net config client_netmask 255.255.255.255 ftp_user [email protected] ftp_list_width 64 # Auth #auth_param basic program /usr/local/squid/libexec/squid_ldap_auth -b "ou=People,dc=empresa,dc=com" -f "uid=%s" -v2 -h 192.168.1.1 #auth_param basic children 5 #auth_param basic realm Squid proxy-caching web server #auth_param basic credentialsttl 2 hours #auth_param basic casesensitive off #authenticate_ip_ttl 1800 seconds acl Authenticate proxy_auth REQUIRED acl CONNECT method CONNECT # Clients ACL (OR) 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 Lan src 192.168.0.0/255.255.0.0 acl Local dst 192.168.0.0/255.255.0.0 # Ports acl SSL_ports port 443 acl Safe_ports port 80 81 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-5221 # unregistered acl Safe_ports port 5223-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 119 # multiling http acl Safe_ports port 666 # multiling http acl Safe_ports port 777 # multiling http # Allow/deny (AND) #http_access allow Authenticate http_access allow Lan http_access allow Manager Localhost http_access allow Localhost http_access deny Manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny All no_cache deny Local # Dansguardian follow_x_forwarded_for allow localhost acl_uses_indirect_client on log_uses_indirect_client on # Other http_reply_access allow all icp_access allow all max_filedescriptors 8192 hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin \? cache deny QUERY acl apache rep_header Server ^Apache broken_vary_encoding allow apache #cache_effective_user squid #cache_effective_group squid #high_response_time_warning 1500 (Median response time) # LOGS & CORE # #logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt #logformat squidmime %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt [%>h] [%<h] #logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st %Ss:%Sh #logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh logformat squidlog %tl %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt logfile_rotate 5 coredump_dir /opt/squid/spool/squid access_log /opt/squid/log/access.log squidlog
Comentar que la cache y los logs "cuelgan" todos debajo del directorio /opt/squid
A continuación se van a crear los directorios y ficheros necesarios
mkdir -p /opt/squid/squidcache;chown nobody.nogroup /opt/squid/squidcache mkdir -p /opt/squid/log/;chown nobody.nogroup /opt/squid/log/ mkdir -p /opt/squid/spool/squid;chown nobody.nogroup -R /opt/squid/spool/
A continuación se debe generar la estructura de directorio de la cache del squid ejecutando el comando
/usr/local/squid/sbin/squid -z -D -N -X
Si queremos lanzar el proceso de squid pero no como demonio (para realizar pruebas), podemos usar el comando
/usr/local/squid/sbin/squid -D -N -X
Ahora se pasa a crear el fichero de arranque del squid y configurar que el squid arranque el inicio del sistema. El fichero squid que se muestra a continuación se ubica en el directorio /etc/init.d
#! /bin/sh export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" case "$1" in start) ulimit -HSn 8192 /usr/local/squid/sbin/squid -D ;; stop) /usr/local/squid/sbin/squid -k shutdown ;; restart) /usr/local/squid/sbin/squid -k shutdown /bin/sleep 5 /usr/local/squid/sbin/squid -D ;; *) log_action_msg "Usage: /etc/init.d/squid {start|stop|restart}" exit 1 esac exit 0
Que arranque al inicio del sistema
chmod 755 /etc/init.d/squid update-rc.d squid defaults 40
Por último comentar que es factible (y aconsejable) dedicar una partición aparte para la cache del squid. Se recomienda que esa partición siempre tenga un espacio libre de aproximadamente un 20-30% para tener un mejor redimiento.
Si se desea saber cuanta memoria necesita el squid en base a la instalación y configuración de algunos parámetros esta es la sencilla formula proporcionada por uno de los desarrolladores del squid :)
size of cache_mem + (size of cache * 0.05) == RAM needed
Solo resta iniciar el squid con el comando
/etc/init.d/squid start
A continuación se pasa a explicar la instalación y configuración de la aplicación dansguardian, que permite realizar las tareas de filtrado de webs y bloqueo de virus durante la navegación web de los clientes.
Dansguardian
Ahora se va a instalar y configurar la aplicación que realiza el filtrado de las webs mediante lista de dominios o por ciertas palabras que aparecen en las webs, por ejemplo pornográficas. También se encarga de bloquear los virus mediante el antivirus ClamAV.
Esta aplicación escuchará en el puerto 8080, pasará las peticiones web al squid que escucha en el puerto 3128 y después envía a los clientes web los objetos que cachea el squid.
Por tanto en los navegadores se debe configurar la IP del servidor y el puerto 8080.
Primero vamos a crear el directorio dónde se ubicarán los logs del dansguardian
mkdir -p /var/log/dansguardian chown clamav.clamav /var/log/dansguardian
A continuación vamos a bajar y compilar el programa, teniendo en cuenta de crear el grupo nobody si no existe
wget http://dansguardian.org/downloads/2/Stable/dansguardian-2.10.0.3.tar.gz tar zxvf dansguardian-2.10.0.3.tar.gz cd dansguardian-2.10.0.3 groupadd nobody ./configure --prefix=/usr/local/dansguardian --enable-clamd && make && make install
A continuación se deben realizar algunos ajustes y comprobar que algunas configuraciones esten correctas en el dansguardian y el clamav.
En el clamav tiene que estar así configurado el socket en el fichero /etc/clamav/clamd.conf
LocalSocket /var/run/clamav/clamd.ctl User clamav
Se configuran los siguientes parámetros en el fichero de configuración de dansguardian (/usr/local/dansguardian/etc/dansguardian/dansguardian.conf)
forwardedfor = on daemonuser = 'clamav' daemongroup = 'clamav' contentscanner = '/usr/local/dansguardian/etc/dansguardian/contentscanners/clamdscan.conf' loglocation = '/var/log/dansguardian/access.log' logfileformat = 3
A continuación se deja asi el fichero /usr/local/dansguardian/etc/dansguardian/contentscanners/clamdscan.conf
clamdudsfile = '/var/run/clamav/clamd.ctl'
Se configuran según convengan las weightedphraselist, banedextensionlist y bannedmimetypelist ubicadas en el directorio /usr/local/dansguardian/etc/dansguardian/lists
Por último sólo queda que se cree el fichero de arranque del dansguardian (/etc/init.d/dansguardian) en el inicio del sistema y se haga que arranque al inicio del sistema
#!/bin/sh # Script startup para Dansguardian PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/dansguardian/sbin/dansguardian NAME=dansguardian DESC="DansGuardian" CONFFILELOCATION=/usr/local/dansguardian/etc/dansguardian/dansguardian.conf set -e case "$1" in start) echo -n "Iniciando $DESC: " $DAEMON -c $CONFFILELOCATION echo "$NAME." ;; stop) echo -n "Deteniendo $DESC: " $DAEMON -q echo "$NAME." ;; reload) echo "Recargando los archivos de configuracion de $DESC." $DAEMON ;; restart|force-reload) echo -n "Reiniciando $DESC: " $DAEMON -Q echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Utilizar: $N {start|stop|restart|force-reload}" exit 1 ;; esac exit 0
chmod 755 /etc/init.d/dansguardian update-rc.d dansguardian defaults 45
Sólo queda iniciar el dansguardian mediante el comando
/etc/init.d/dansguardian start
y después configurar los navegadores web de los clientes que apunten a la IP del servidor proxy al puerto 8080 del dansguardian! :)
TODO
Aunque la solución descrita en este manual es bastante completa, se podría configurar algo más y/o instalar alguna herramienta más como por ejemplo:
- Estadísticas (Sarg)
language Spanish access_log /var/log/squid/access.log temporary_dir /tmp output_dir /var/www/squid-reports Editaremos /etc/apache/httpd.conf y añadiremos estas lineas: <Directory "/var/www/squid-reports"> AuthName "Squid Reports" AuthType Basic AuthUserFile /etc/.htpasswdsquidreports require valid-user Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
- El gestor de la cache (Cache Manager)
- Snmp
- Rotación de logs con logrotate o con "squid -k rotate"
- Optimizaciones en el sistema de ficheros de la partición dedicada a la cache del squid??