La seguridad de un sistema operativo es un asunto importante. Muchos archivos pueden contener información reservada o privada y restringir el acceso puede ser necesario y a veces obligatorio. Aquí vamos a abordar algunos aspectos generales de seguridad en Debian.
Advertimos que muchas veces la seguridad se ve comprometida por el descuido de los usuarios y prácticas poco inteligentes. Es rol del administrador del sistema informar y enseñar a los usuarios sobre aspectos de seguridad del sistema tal de minimizar posibles desastres.
Una de las maneras más frecuentes de entrar a un sistema es mediante el robo de claves. Esto se hace con un sniffer instalado en un computador controlado por el intruso. El sniffer busca ("olfatea"), en el flujo de datos de una interfase de red, paquetes asociados a passwd, login y su para luego registrar los datos que siguen (una clave). Lo que generalmente busca un intruso es la clave de root, o vulnerabilidades del sistema, para apoderarse de los recursos del computador.
Es también bastante frecuente que los intentos de entrar a un sistema se hagan directamente ingresando claves al azar. Se recomienda no usar como clave palabras que puedan estar en algún diccionario, ni tampoco sobrenombres, nombre de alguna mascota o fechas como cumpleaños, aniversarios, etc. Este tipo de claves son tan comunes que son las primeras que un intruso prueba. El intruso en este caso utiliza información personal que a veces por descuido hacemos pública. Recuerda que una clave debe ser difícil de adivinar, que debe concebirse como un instrumento de seguridad y no para ser fácil de recordar. Una buena práctica es incluir en la clave a lo menos una letra en mayúsculas y un número.
Linux es un sistema operativo que tiene incorporado soporte de red en el núcleo mismo. Este es el motivo por el cual Linux es capaz de prestar todo tipo de servicios de red en forma natural. Sin embargo, la red también puede poner al computador en riesgo de intrusión. Si un intruso se apodera de los recursos del sistema puede usarlo para fines ilegales y en el mejor de los casos para fines de dudosa moralidad.
Cada servicio tiene asociado un protocolo que especifica las reglas de comunicación, un programa para manejar la comunicación llamados daemon y un puerto (port) identificado con un número por el cual se envían y reciben paquetes de datos con una estructura definida por el protocolo. Existen muchos tipos de protocolos, los más comunes son Transmission Control Protocol (TCP), User Datagram Protocol (UDP) e Internet Control Message Protocol (ICMP). El archivo /etc/services define el puerto y tipo de cada protocolo. Ejemplos son:
FTP (File Transfer Protocol, puerto 21, tipo TCP) SSH (Secure Shell, puerto 22, tipo TCP) TELNET (TELNET Protocol, puerto 23, tipo TCP) SMTP (Simple Mail Transfer Protocol, puerto 25, tipo TCP) HTTP (Hyper Text Transfer Protocol, puerto 80, tipo TCP) POP3 (POP3, puerto 110, TCP) NTP (Network Time Protocol, puerto 123, UDP) IMAP3 (IMAP3, puerto 220, TCP) HTTPS (HTTP sobre TLS/SSL, puerto 443, TCP)
Los paquetes de datos que viajan por la red y llegan a la interfase del computador (eth0, ppp0) tienen un encabezado que indica el emisor y destinatario (sus números IP), puerto, el tipo y protocolo del paquete. Luego el daemon asignado al protocolo, si es que está instalado y corriendo, negocia la comunicación con el emisor del paquete antes de que continúe la transferencia de datos. La negociación puede requerir una contraseña.
Algunos daemon están corriendo constantemente, "escuchando" (listen) la red. Otros corren cuando se ha establecido un requerimiento. Estos últimos los maneja otro daemon llamado inetd que corre constantemente, escuchando la red, para luego remitir cualquier requerimiento al respectivo daemon de acuerdo al protocolo y puerto del paquete recibido. El archivo de configuración /etc/inetd.conf define los protocolos manejados por inetd y los daemon asociados. Este tipo de super daemon se conocen como tcp wrappers.
Existen dos archivos de configuración que son consultados cada vez que algún daemon recibe un requerimiento de conexión por red. Estos son:
/etc/hosts.deny /etc/hosts.allow
El primero define aquellos daemon, usuarios, dominios o números IP que no tienen permiso de conexión. El segundo, de igual manera, define aquellos que sí tienen permiso.
Lo más fácil es denegar todo permiso en /etc/hosts.deny y luego dar permisos individuales, por grupo o globales en /etc/hosts.allow.
Ingresa a root, por ejemplo, corriendo un "Terminal de <Root>" en el menú "Aplicaciones/Accesorios" o, en el mismo menú, un "Terminal" y luego el comando su (super user).
Edita el archivo /etc/hosts.deny,
# nano /etc/hosts.deny
para que lea,
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system. # See the manual pages hosts_access(5), hosts_options(5) # and /usr/doc/netbase/portmapper.txt.gz # # Example: ALL: some.host.name, .some.domain # ALL EXCEPT in.fingerd: other.host.name, .other.domain # # If you're going to protect the portmapper use the name "portmap" for the # daemon name. Remember that you can only use the keyword "ALL" and IP # addresses (NOT host or domain names) for the portmapper. See portmap(8) # and /usr/doc/portmap/portmapper.txt.gz for further information. # # The PARANOID wildcard matches any host whose name does not match its # address. # # You may wish to enable this to ensure any programs that don't # validate looked up hostnames still leave understandable logs. In past # versions of Debian this has been the default. # ALL: PARANOID ALL: ALL
La última línea van a negar todo acceso. Ahora edita el archivo /etc/hosts.allow,
# nano /etc/hosts.allow
y agrega la línea al final,
# /etc/hosts.allow: list of hosts that are allowed to access the system. # See the manual pages hosts_access(5), hosts_options(5) # and /usr/doc/netbase/portmapper.txt.gz # # Example: ALL: LOCAL @some_netgroup # ALL: .foobar.edu EXCEPT terminalserver.foobar.edu # # If you're going to protect the portmapper use the name "portmap" for the # daemon name. Remember that you can only use the keyword "ALL" and IP # addresses (NOT host or domain names) for the portmapper, as well as for # rpc.mountd (the NFS mount daemon). See portmap(8), rpc.mountd(8) and # /usr/share/doc/portmap/portmapper.txt.gz for further information. # ALL: localhost
Esta línea da todo tipo de permisos al computador local (localhost) y debe siempre ser incluida.
Da permisos de la siguiente manera:
daemon[,daemon]: dominio [,dominio]
ALL (todos) es equivalente a *. A modo de ejemplo,
ALL: servidor.debian.dominio.cl sshd: .debian.dominio.cl, 100.10.0. imapd, ipop3d: ALL
Esta forma de bloquear servicios puede ser considerado como la segunda línea de defensa ante ataques de red. Si deseas incrementar la seguridad, puedes configurar un cortafuego de primeros principios.
This document was generated using AFT v5.097