TCP Wrapper ("Envolvedor de TCP") es un sistema de red ACL que trabaja en terminales y que se usa para filtrar el acceso de red a servicios de protocolos de Internet que corren en sistemas operativos (tipo UNIX), como ser Linux o BSD. Permite que las direcciones IP, los nombres de terminales y/o respuestas de consultas ident de las terminales o subredes sean usadas como tokens sobre los cuales filtrar para propósitos de control de acceso.
El código original fue escrito por Wietse Venema de la Universidad Tecnológica de Eindhoven, Países Bajos, entre los años 1990 y 1995. Desde el 1ro de junio de 2001, el programa es lanzado bajo su propia licencia tipo BSD.
El tarball incluye una biblioteca llamada libwrap que implementa la funcionalidad en sí. Inicialmente, solo aquellos servicios que se creaban a partir de cada conexión a un super servidor (como inetd) eran envueltos (de ahí su nombre) utilizando el programa 'tcpd'. Sin embargo, los demonios de servicio de red más comunes de hoy en día pueden ser enlazados contra libwrap en forma directa. Los demonios que operan sin crear descendientes de un super servidor usan esto, o un proceso único maneja conexiones múltiples. Caso contrario, solo el primer intento de conexión se chequearía contra sus ACLs.
Al compararse con las directivas de control de acceso de una terminal, que comúnmente se encuentran en los archivos de configuración de los demonios, TCP Wrappers tienen el beneficio de una reconfiguración de ACL en tiempo de ejecución (es decir, los servicios no necesitan ser cargados nuevamente o reiniciados) y de una aproximación genérica a la administración de redes.
Si bien fue escrito para proteger servicios de aceptación de TCP y UDP, también existen ejemplos de uso para filtrado de ciertos paquetes ICMP (tales como 'pingd' – el contestador de pedidos de pings del espacio de usuario).
En el punto 13.4 hablábamos de los servicios ofrecidos desde nuestra máquina; allí comentamos que cualquiera de ellos es una potencial puerta de entrada para un atacante, por lo que es muy recomendable cerrar todos los que no necesitemos; vimos un esquema todo o nada: u ofrecíamos un servicio a toda la red o lo denegábamos, pero no había término medio.
Hay una serie de servicios como telnet o ftp que habitualmente no vamos a poder cerrar, ya que los usuarios necesitarán conectar al servidor para trabajar en él o para transferir ficheros; en estos casos es peligroso permitir que cualquier máquina de Internet tenga la posibilidad de acceder a nuestros recursos, por lo que se suele utilizar un programa denominado TCP Wrappers ([Ven92]) para definir una serie de redes o máquinas autorizados a conectar con nosotros. Aquí veremos como instalar este software - en su versión 7.6 - y su configuración básica para que no todo el mundo pueda contactar con nosotros. Actualmente, cualquier administrador que desee un mínimo de seguridad ha de instalar TCP Wrappers en sus equipos; incluso algunos Unices como Linux o BSDI lo ofrecen por defecto al instalar el operativo. Cabe decir que la configuración del programa puede ser muy elaborada y con muchas opciones; aquí veremos la forma más básica, que suele ser automática mediante make install 22.2. Para configuraciones más avanzadas se recomienda consultar los ficheros de ayuda.
En nuestro caso vamos a instalar TCP Wrappers sobre una máquina Silicon Graphics corriendo IRIX 6.2:
llegona_(/) # uname -a
IRIX64 llegona 6.2 06101031 IP28
llegona_(/) #
No vamos a entrar aquí en como compilar el software (para ello se puede consultar el fichero README); asumiremos que ya lo tenemos compilado y el resultado está, por ejemplo, en el directorio /tmp/tcp_wrappers_7.6/. Tras compilar el software se habrán generado una serie de ficheros ejecutables que hemos de copiar a un destino definitivo, por ejemplo a /etc/usr/sbin/:
llegona_(/tmp/tcp_wrappers_7.6) # cp `find . -type f -perm -700` /usr/sbin/
llegona_(/tmp/tcp_wrappers_7.6) #
Una vez en su destino definitivo, hemos de modificar el fichero /etc/inetd.conf para indicarle a inetd que ha de utilizar el demonio tcpd (la parte más importante de TCP Wrappers) a la hora de servir peticiones; para ello, una entrada de la forma
telnet stream tcp nowait root /usr/etc/telnetd
se convertirá en una como
telnet stream tcp nowait root /usr/sbin/tcpd /usr/etc/telnetd
Como vemos, en lugar de que inetd ejecute directamente el demonio correspondiente a cada servicio, ejecuta el wrapper, y es éste el encargado de controlar la ejecución del demonio real.
Tras haber modificado convenientemente /etc/inetd.conf hemos de configurar los servicios que vamos a ofrecer a diferentes máquinas o redes; seguiremos una política restrictiva: todo lo no explícitamente permitido, está negado. Para ello, en el archivo /etc/hosts.allow indicamos que servicios ofrecemos y a dónde lo hacemos22.3, de la siguiente forma:
demonio: maquinas
Donde `demonio' es el nombre del demonio encargado de atender el servicio correspondiente
(sendmail, telnetd, fingerd...), y `maquinas' es la especificación de los hosts a los que les está permitida la conexión a cada servicio; se trata de una lista separada por espacios donde podemos incluir desde nombres de sistemas o direcciones IP hasta subdominios, pasando por palabras reservadas como ALL. Así, si por ejemplo queremos ofrecer todo a las máquinas .dsic.upv.es, telnet a andercheran.aiind.upv.es y luisvive.euiti.upv.es, y ftp a toda la UPV, tendremos un /etc/hosts.allow de la forma siguiente:
llegona_(/) # cat /etc/hosts.allow
ALL: .dsic.upv.es
telnetd: andercheran.aiind.upv.es luisvive.euiti.upv.es
ftpd: .upv.es
llegona_(/) #
Acabamos de configurar los sistemas con acceso a ciertos demonios; para indicar a TCP Wrappers que nuestros servicios no van a ser ofertados a nadie más, creamos el fichero /etc/hosts.deny y denegamos todo a todos:
llegona_(/) # cat /etc/hosts.deny
ALL: ALL
llegona_(/) #
Run with -[Ff] option to fix
Una vez hemos configurado todo, hemos de hacer que inetd relea su fichero de configuración enviándole la señal SIGHUP, por ejemplo con la orden killall -HUP inetd22.4. A partir de ese momento los cambios han tenido efecto; en función de nuestro /etc/syslog.conf, pero generalmente en archivos como /var/adm/SYSLOG o /var/adm/messages vamos a poder ver las conexiones aceptadas y las rehusadas:
Dec 2 02:16:47 llegona ftpd[18234]: refused connect from bill.microsoft.com
Dec 2 02:45:23 llegona telnetd[18234]: connect from corbella.dsic.upv.es
Cuando alguien desde una máquina que tiene permiso para acceder a cierto servicio conecte a él no notará nada raro, pero si lo hace desde un equipo no autorizado, la conexión se cerrará:
anita:~# telnet llegona.dsic.upv.es
Trying 158.42.49.37...
Connected to llegona.dsic.upv.es
Escape character is '^]'.
llegona login: Connection closed by foreign host.
anita:~#
0 comments:
No insertes enlaces clicables, de lo contrario se eliminará el comentario. Si quieres ser advertido via email de los nuevos comentarios marca la casilla "Notificarme". Si te ayudé con la publicación o con las respuestas a los comentarios, compártelo en Facebook, Twitter, Tumblr, Google +, Pinterest o Instagram. Gracias.