Ejercicio: Servidor Intermediario (Proxy) y cortafuegos con Shorewall.

Autor: Joel Barrios Dueñas Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/ Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2009 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Este ejercicio está diseñado para ser puesto en práctica en CentOS 5, Elastix 1.5, Red Hat Enterprise Linux 5 y Whitebox Enterprise Linux 5 o sistemas operativos similares, basados sobre Red Hat Enterprise Linux 5. Requiere haber estudiado en su totalidad los siguientes documentos:

•  Cómo configurar Squid: Parámetros básicos para servidor de intermediación (Proxy).
•  Cómo configurar Squid: Restricción de acceso a Sitios de Red.
•  Cómo configurar squid con soporte para direcciones MAC.
•  Cómo instalar y configurar la herramienta de reportes Sarg.
•  Cómo configurar un muro cortafuegos con Shorewall y tres interfaces de red.

Requiere también haber realizado los procedimientos descritos en el ejercicio Servidor DNS Dinámico y Servidor DHCP.

Política: cerrar todo y abrir solo lo necesario.

Durante este ejercicio se crearán solo tres listas de control de acceso para Squid. La lista que será denominada libres permitirá acceder libremente y sin restricciones hacia Internet. La lista que será denominada red-local solo podrá acceder a los sitios de Internet cuyos dominios estén definidos en la lista denominada sitios-libres. Es decir, se aplicará una política estricta que cerrará el acceso a quienes estén definidos en la lista red-local permitiendo solo acceder a lista lista de sitios de Internet controlada por el administrador.

El muro cortafuegos se configurará a través de Shorewall y solo permitirá la salida a la red de área local (LAN) para acceder a los servicios de DNS, NTP, FTP-Data, FTP, HTTP, HTTPS, SMTP, SMTP Submission, SMTPS, POP3, IMAP, POP3S e IMAPS.

El ejercicio considera que se dispone de dos interfaces de red en dos diferentes dispositivos y que eth0 se utiliza para acceder hacia Internet y eth1 se utiliza para acceder hacia la red de área local (LAN). Cualquier servicio distinto a DNS, NTP, FTP-Data, FTP, HTTP, HTTPS, SMTP, SMTP Submission, SMTPS, POP3, IMAP, POP3S e IMAPS, estará bloqueado hacia Internet para la red de área local (LAN). Es decir, estarán bloqueados para la red de área local (LAN) los diversos servicios de mensajería instantánea, redes entre iguales (P2P), BitTorrent, Limewire y muchos otros servicios más.

Equipamiento lógico necesario.

Ingrese al sistema como el usuario root.

Proceda a limpiar la configuración de cualquier ejercicio anterior, restaurando el archivo de configuración predeterminado de Squid y eliminando el directorio de listas, si acaso éste existiese:

cp -a /etc/squid/squid.conf.default /etc/squid/squid.conf
rm -fr /etc/squid/listas

Proceda a instalar los paquetes httpd, la versión mejorada de Vi (paquete vim-enhanced), la herramienta de descargas wget y el navegador para modo texto lynx:

yum -y install httpd wget lynx vim-enhanced

Proceda a configurar el depósito YUM de Alcance Libre que incluye el paquete modificado de squid con soporte para direcciones MAC:

cd /etc/yum.repos.d/
wget -N http://www.alcancelibre.org/al/server/AL-Server.repo
cd -

Proceda a instalar sarg, paquete que consiste en una herramienta de reportes para Squid, squid-arp, paquete modificado por Alcance Libre y que consiste en Squid con soporte para direcciones MAC, así como también el paquete shorewall, el cual será utilizado para configurar posteriormente el muro cortafuegos y el paquete webmin, herramienta que se utilizará al terminar todos los procedimientos para administrar el servidor completo desde una interfaz HTTPS.

yum -y install sarg squid-arp shorewall webmin

Procedimientos

Configuración de Squid.

  1. Configure la política de SELinux para permitir conexiones desde cualquier dirección:

    setsebool -P squid_connect_any 1
  2. Cambie al directorio /etc/squid

    cd /etc/squid
  3. Genere el subdirectorio listas:

    mkdir listas/
  4. Genere los archivos que se utilizarán para las listas de control de acceso y claves de acceso:

    touch listas/{libres,red-local,sitios-libres}
  5. Editar el archivo listas/libres:

    vim listas/libres
  6. Pulse la tecla Insert.

    Poner como único contenido la dirección MAC de su máquina (por ejemplo: 00:01:03:DC:67:23).

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  7. Pulse la tecla Insert.

    Editar el archivo listas/red-local y añadir a este todas las direcciones MAC del resto de los equipos de la red de área local (LAN):

    vim listas/red-local

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  8. Editar el archivo listas/sitios-libres:

    vim listas/sitios-libres
  9. Pulse la tecla Insert.

    Añada como contenido lo siguiente, sustituyendo los dominios en negrita por dominios reales:

    .red-local.net
    .mis-empresas.com.mx
    .mis-proveedores.com.mx
    .mis-clientes.com
    .mis-bancos.com
    .mis-fabricantes-de-computadoras.com
    .mis-periodicos-favoritos.com
    .mis-antivirus.com
    .google.com.mx
    .docs.google.com
    .maps.google.com
    .alcancelibre.org
    .centos.org
    .fedoraproject.org
    .redhat.com
    .clamav.net
    .mozilla.com
    .adobe.com
    .java.sun.com
    .wikipedia.org
    .edu.mx
    .gob.mx
    .windowsupdate.com

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  10. Editar el archivo squid.conf:

    vim squid.conf
  11. Desde vim, realice la búsqueda de la cadena http_port 3128 ejecutando:

    /http_port 3128

    Reemplazar por:

    #       If you run Squid on a dual-homed machine with an internal
    #       and an external interface we recommend you to specify the
    #       internal address:port in http_port. This way Squid will only be
    #       visible on the internal address.
    #
    # Squid normally listens to port 3128
    http_port 192.168.123.123:8080 transparent
    
    #  TAG: https_port
    #       Usage:  [ip:]port cert=certificate.pem [key=key.pem] [options...]
    #
    

    Donde 192.168.123.123 corresponde a la dirección IP para la red de área local (LAN) del servidor que se está configurando.

  12. Desde vim, realizar la búsqueda de la cadena 10 16 256 ejecutando lo siguiente:

    /100 16 256

    Reemplazar:

    # cache_dir ufs /var/spool/squid 100 16 256

    Por:

    cache_dir ufs /var/spool/squid 512 16 256
  13. Desde vim, realizar la siguiente búsqueda:

    /acl to_localhost dst 127.0.0.0
  14. Debajo de ésta línea que acaba de buscar y localizar, agregar lo siguiente:

    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 red-local arp "/etc/squid/listas/red-local"
    acl libres arp "/etc/squid/listas/libres"
    acl sitios-libres dstdomain "/etc/squid/listas/sitios-libres"
    
    acl SSL_ports port 443
    acl Safe_ports port 80-90 # http
    acl Safe_ports port 21 # ftp
    acl Safe_ports port 443 # https
  15. Desde vim, realizar la siguiente búsqueda:

    /http_access deny all
  16. Arriba de la línea que acaba de buscar y localizar, agregar lo siguiente:

    # Example rule allowing access from your local networks. Adapt
    # to list your (internal) IP networks from where browsing should
    # be allowed
    #acl our_networks src 192.168.1.0/24 192.168.2.0/24
    #http_access allow our_networks
    
    # And finally deny all other access to this proxy
    http_access allow localhost
    
    http_access allow sitios-libres red-local
    http_access allow libres
    
    http_access deny all
    
    #  TAG: http_access2
    #       Allowing or Denying access based on defined access lists
  17. Configure el soporte al español para los mensajes de error que mostrará Squid.

    Desde vim, realizar la siguiente búsqueda:

    /# error_directory

    Reemplazar lo siguiente:

    #error_directory /usr/share/squid/errors/English
    #
    #Default:
    # error_directory /usr/share/squid/errors/English
    
    #  TAG: maximum_single_addr_tries
    #       This sets the maximum number of connection attempts for a

    Por:

    #error_directory /usr/share/squid/errors/English
    #
    #Default:
    error_directory /usr/share/squid/errors/Spanish
    
    #  TAG: maximum_single_addr_tries
    #       This sets the maximum number of connection attempts for a

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  18. Reinicie o, en su defecto, inicie la configuración de Squid a fin de verificar si hubo errores fatales:

    service squid restart

    Si hay errores, corregirlos. Si no devuelve errores pero el servicio falla al iniciar, examinar /var/log/squid/squid.out y realizar correcciones:

    tail -f /var/log/squid/squid.out
  19. Recargar la configuración de Squid a fin de verificar si hubo errores no fatales:

    service squid reload

    Si hay errores, realizar correcciones pertinentes.

  20. Añada el servicio squid a los servicios de arranque del sistema:

    chkconfig squid on
  21. Realizar comprobaciones utilizando navegador en modo texto:

    Defina la dirección IP del servidor que acaba de configurar como el valor para la variable de entorno http_proxy:

    export http_proxy="http://192.168.123.123:8080/"

    Donde 192.168.123.123 corresponde a la dirección IP del servidor que acaba de configurar.

  22. Genere un alias para el mandato lynx que especifique se se acepten todas las galletas de todos los sitios cuando sea necesario:

    alias lynx="lynx -cookies -trace"
  23. Realice una prueba de búsqueda a través de Google México para la palabra sex:

    lynx "http://www.google.com.mx/search?q=sexo"

    Deberá permitir realizar la búsqueda e ingresar hacia cualquier sitio en Internet mientras que la dirección MAC del propio servidor esté incluida en la lista libres, es decir el archivo /etc/squid/listas/libres.

  24. Realice las comprobaciones para las restricciones de acceso que solo permiten acceder hacia los sitios de Internet cuyos dominios están definidos en la lista sitios-libres. Tiene una de dos opciones:

    1. Si existe otro servidor con idéntica configuración, defina ahora la dirección IP de éste como el valor de la variable de entorno http_proxy:

      export http_proxy="http://dirección IP otro servidor similar:8080/"
    2. Si solo existe el servidor que se acaba de configurar, edite de nuevo squid.conf:

      vim squid.conf

      Realice al siguiente búsqueda:

      /http_access allow libres

      Reemplace http_access allow libres por lo siguiente, a fin de que la lista libres solo pueda acceder a los sitios de Internet cuyo dominio esté en la lista sitios-libres, es decir el archivo /etc/squid/listas/sitios-libres:

      http_access allow sitios-libres libres

      Recargue la configuración de Squid.

      service squid reload

      Defina la dirección IP del servidor que acaba de configurar como el valor para la variable de entorno http_proxy:

      export http_proxy="http://192.168.123.123:8080/"

      Donde 192.168.123.123 corresponde a la dirección IP del servidor que acaba de configurar.

      NOTA: Al terminar las pruebas, es importante revierta este último cambio a fin de restablecer la política de salida libre a quienes estén en la lista libres.

  25. Utilice el navegador lynx realizando una búsqueda a través de Google México para la palabra sex:

    lynx "http://www.google.com.mx/search?q=sexo"

    Lo anterior deberá permitir realizar la búsqueda pero solo permitiendo el ingreso cualquier sitio de Internet cuyo dominio esté incluido en la lista sitios-libres, es decir el archivo /etc/squid/listas/sitios-libres.

  26. A fin de concluir el ejercicio, elimine los valores de la variable de entorno http_proxy:

    unset http_proxy

Configuración de Shorewall.

  1. Si todo lo anterior funcionó correctamente, continúe con la configuración de Shorewall. En caso contrario, regrese sobre los pasos que sean necesarios hasta hacer las correcciones necesarias.

  2. Cambie al directorio /etc/shorewall:

    cd /etc/shorewall
  3. Edite con vim el archivo shorewall.conf:

    vim shorewall.conf
  4. Pulse la tecla Insert.

    Cambie STARTUP_ENABLED=No por STARTUP_ENABLED=yes:

    STARTUP_ENABLED=Yes

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  5. Edite con vim el archivo zones.

    vim zones
  6. Pulse la tecla Insert.

    Debajo de la zona fw y antes de la última línea, la cual deberá respetar y jamás modificar o colocar datos después de ésta, añada las zonas net y loc definiendo que son del tipo ipv4:

    fw		firewall
    net		ipv4
    loc		ipv4
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
    

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  7. Edite con vim el archivo interfaces:

    vim interfaces
  8. Pulse la tecla Insert.

    Defina que la zona net corresponderá a la interfaz eth0, con auto-detección de dirección de difusión (broadcast) y con opciones de dhcp y blacklist (para el uso del archivo de lista negra). Repita del mismo modo para la zona loc, pero definiendo que corresponde a la interfaz eth1:

    net	eth0		detect		dhcp,blacklist
    loc	eth1		detect		dhcp,blacklist
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
    

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  9. Edite con vim el archivo masq:

    vim masq
  10. Pulse la tecla Insert.

    Defina que todo el tráfico proveniente de la interfaz eth1 será enmascarado con la dirección IP de la interfaz eth0:

    eth0		eth1
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
    

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  11. Edite con vim el archivo blacklist:

    vim blacklist
  12. Pulse la tecla Insert.

    Defina estará en lista negra la dirección IP 208.81.191.110, que corresponde a meebo.com, un servicio que ofrece un cliente HTTP para mensajería instantánea para el servicio MSN Messenger, bloqueando solo las conexiones TCP hacia éste a través de el puerto 443:

    208.81.191.110		tcp	80,443
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

    Nota: Puede repetir esta operación para otros sitios de Internet que ofrezcan clientes HTTP para los diversos servicios de mensajería instantánea a través de HTTPS (puerto 443).

  13. Edite con vim el archivo policy:

    vim policy
  14. Pulse la tecla Insert.

    Defina como políticas predeterminadas que la zona fw puede acceder hacia cualquier otra zona, que se descartarán (DROP) las conexiones provenientes desde la zona net hacia cualquier otra zona guardando en la bitácora del sistema toda la actividad descartada y que se rechazarán (REJECT) conexiones provenientes desde la zona loc hacia cualquier otra zona guardando en la bitácora del sistema toda la actividad rechazada.

    fw		all		ACCEPT
    net		all		DROP		info
    loc		all		REJECT		info
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  15. Edite con vim el archivo rules:

    vim rules
  16. Pulse la tecla Insert.

    Defina que todo el tráfico proveniente de la red de área local (LAN) (zona loc) será redirigido al puerto 8080 del servidor que acaba de configurar cuando las conexiones sean solo por TCP para pueto 80 (HTTP).

    REDIRECT	loc		8080		tcp	80
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
  17. Defina que la red de área local (LAN) (zona loc) podrá acceder hacia Internet (zona net) solo a los servicios de DNS, NTP, FTP-Data, FTP, HTTPS, SMTP, SMTP Submission, SMTPS, POP3, IMAP, POP3S e IMAPS.

    REDIRECT	loc		8080		tcp	80
    ACCEPT		loc		net		tcp	20,21,25,443
    ACCEPT		loc		net		tcp	25,465,587
    ACCEPT		loc		net		tcp	110,143,993,995
    ACCEPT		loc		net		tcp	53,123
    ACCEPT		loc		net		udp	53,123
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
  18. Defina que la red de área local (LAN) (zona loc) podrá acceder hacia el cortafuegos (zona fw) para a los servicios de SSH, DNS, HTTP y Webmin (en caso de estar instalado).

    REDIRECT	loc		8080		tcp	80
    ACCEPT		loc		net		tcp	20,21,25,443
    ACCEPT		loc		net		tcp	25,465,587
    ACCEPT		loc		net		tcp	110,143,993,995
    ACCEPT		loc		net		tcp	53,123
    ACCEPT		loc		net		udp	53,123
    ACCEPT		loc		fw		tcp	22,53,80,10000
    ACCEPT		loc		fw		udp	53
    #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

    Pulse la tecla Esc, guarde cambios y salga de vim pulsando la combinación de teclas :x y luego la tecla (ENTER).

  19. Inicie el servicio shorewall.

    service shorewall start
  20. Si el servicio shorewall inicio normalmente, proceda con el siguiente paso. Si hay fallas o errores, regrese en los pasos que sean necesarios y corrija los posibles errores antes de continuar.

  21. Si el servicio shorewall inició sin errores, utilice el mandato chkconfig para que el servicio shorewall inicie automáticamente la próxima vez que arranque el sistema.

    chkconfig shorewall on
  22. Para realizar pruebas, se necesita configurar un equipo que acceda desde la interfaz eth1 y que use la dirección IP del servidor que acaba de configurar como puerta de enlace predeterminada. Es importante recordar que cualquier servicio distinto a DNS, NTP, FTP-Data, FTP, HTTP, HTTPS, SMTP, SMTP Submission, SMTPS, POP3, IMAP, POP3S e IMAPS, estará bloqueado para la red de área local (LAN).

Instalar y configurar la herramienta de reportes Sarg.

Por favor, siga los procedimientos descritos en el documento titulado Cómo instalar y configurar la herramienta de reportes Sarg.