| Guía de Administración de Redes con Linux | ||
|---|---|---|
| Anterior | Capítulo 12. Características Importantesde Red | Siguiente |
Desde que un ordenador tiene acceso a la red implica algunos riesgos de seguridad, las aplicaciones estan diseñadas para protegerse contra muchos tipos de ataques. Algunas caracteristicas de seguridad, sin embargo, pueden haber fallos (muchos demostrados por el RTM Internet worm, los cuales dejan agujeros en un numero de programas, incluyendo viejas versiones de sendmail mail daemon), o no distinguen entre hosts seguros desde los cuales se pueden atender peticiones de servicios particulares y hosts no seguros a los que se deben rechazar las peticiones. Veremos brevemente los servicios finger y tftp . Los administradores de red que quieran limitar el acceso de estos servicios a “trusted hosts” solamente, esto es imposible con el setup general, por esto inetd ofrece este servicio a todos los clientes o a ninguno.
Una útil herramienta para manejar acceso host-specific es tcpd, a menudo llamado el demonio “wrapper.”[1] Para servicios que usted quiere monitorizar o proteger, es invocado en vez del programa servidor. tcpd chequea si el host remoto tiene permitido usar el servicio, y sólo tendrá éxito si ejecuta el programa servidor real. tcpd tambien deja log de las peticiones al demonio syslog . Apuntar que no funciona para servicios basados en UDP.
Por ejemplo, para encapsular el demonio finger , usted debe cambiar la correspondiente línea en inetd.conf de esta forma:
# unwrapped finger daemon
finger stream tcp nowait bin /usr/sbin/fingerd in.fingerd |
# wrap finger daemon
finger stream tcp nowait root /usr/sbin/tcpd in.fingerd |
Sin añadir ningún control de acceso, al cliente le parecerá el usual finger setup, excepto que todas las peticiones son anotadas hacia la instalación syslog auth.
Dos ficheros llamados /etc/hosts.allow y /etc/hosts.deny implementan el control de acceso. Contienen entradas que permiten y deniegan acceso a ciertos servicios y hosts. Cuando tcpd maneja una petición para un servicio como finger desde un hosts cliente llamado biff.foobar.com, se escanean hosts.allow y hosts.deny (en este orden) buscando una entrada que se corresponda con el servicio y el host cliente. Si se encuentra una entrada que se corresponde en el hosts.allow, se autoriza el acceso y tcpd no consulta el fichero hosts.deny . Si no se encuentra una correspondencia en el fichero hosts.allow, pero se encuentra en el hosts.deny, la petición es rechazada cerrando la conexión. La petición es aceptada si no hay correspondencias en niguno de los ficheros.
Las entradas en los ficheros de acceso son de este tipo:
servicelist: hostlist [:shellcmd] |
servicelist es una lista de nombres de servicio del /etc/services, o la palabra clave ALL. Para corresponder todos los servicios excepto finger y tftp, se usa ALL EXCEPT finger, tftp.
hostlist es una lista de hostnames, direcciones IP, o de palabras clave ALL, LOCAL, UNKNOWN o PARANOID. ALL corresponde cualquier host, mientras que LOCAL corresponde hostnames que no contienen un punto.[2] UNKNOWN corresponde cualquier hosts cuyo nombre o dirección lookup falle. PARANOID corresponde cualquier host cuyo hostname no se resuelva en su dirección IP. [3] Un nombre que empiza por un punto relaciona todos los host cuyo dominio es igual a este nombre. Por ejemplo, .foobar.com relaciona biff.foobar.com, pero no nurks.fredsville.com. Un patrón que que termina con un punto relaciona cualquier host cuya dirección IP empieza con el patron proporcionado, sin embargo 172.16. relaciona 172.16.32.0, pero no 172.15.9.1. Un patrón de la forma n.n.n.n/m.m.m.m es tratado como una dirección IP y máscara de red, sin embargo debemos especificar nuestro anterior ejemplo como 172.16.0.0/255.255.0.0 en su lugar. Finalmente, cualquier patrón que empieza por un caracter “/” nos permite especificar un fichero que presuntamente contiene una lista de nombres de host o patrones de direcciones IP, cualquiera de las cuales estan permitidas a relacionarse. Sin embargo un patrón que se bloquea como /var/access/trustedhosts puede causar que el demonio tcpd lea este fichero, verificando si alguna de sus líneas coincide con host conectados.
Para denegar acceso al copmando finger y servicios tftp a todos menos al host local, ponga lo siguiente en /etc/hosts.deny y deje vacío /etc/hosts.allow:
in.tftpd, in.fingerd: ALL EXCEPT LOCAL, .your.domain |
El campo opcional shellcmd puede contener una shell de comandos para ser invocada cunado la entrada coincida. Esto se usa para establecer traps que pueden suponer ataques potenciales. El siguiente ejemplo crea un fichero de log que lista el usuario y el host que se conecta, y si el host no es vlager.vbrew.com será añadido a la salida de un finger hacia ese host:
in.ftpd: ALL EXCEPT LOCAL, .vbrew.com : \
echo "request from %d@%h: >> /var/log/finger.log; \
if [ %h != "vlager.vbrew.com:" ]; then \
finger -l @%h >> /var/log/finger.log \
fi |
El %h y argumentos %d son expandidos por tcpd hacia el hostname cliente y nombre de servicio, repectivamente. Por favor dirígase a la página de manual hosts_access(5) para detalles.
| [1] | escrito por Wietse Venema, wietse@wzv.win.tue.nl. |
| [2] | Habitualmente sólo hostnames locales obtenidos del /etc/hosts no contienen puntos. |
| [3] | Mientras este nombre sugiere una medida extrema, la palabra clave PARANOID es buena por defecto, y le protege contra hosts malicios que pretenden hacerse pasar por lo que no son. No todos tcpd se proporcionan con PARANOID en su compilación; si no es su caso, usted debe recompilar tcpd para usarlo. |