Seguridad en Linux

Bien ahora vamos a empezar con la seguridad en linux, y previamente como hackearlo, muy bien empezamos. Nada mas conectarse por defevto tienes todos los puertos habiertos, lo que tienes que hacer es lo siguiente: Edita el archivo /etc/inetd.conf y pon un ‘#’ delante de todos los servicios que no ofrezcas. Recuerda que esto se refiere los servicios que quieres DAR no a los que quieres ACCEDER, o sea que para entrar en un ftp no necesitas tener abierto el puerto ftp.

 

Truco: Lo que no sepas que hace ciérralo!
Truco: Puedes cerrar absolutamente todo. (Para entrar en algunas redes de IRC es necesario abrir el puerto auth)
Truco: Algunos ataques automatizados, tipo nukes y otros, buscan siempre el mismo puerto, por ejemplo el 139 (net-bios). Si te ves obligado a dar este tipo de servicios no seria una mala idea cambiar el puerto por defecto, esto se consigue modificando en el /etc/services la linea correspondiente al servicio, en nuestro caso podríamos substituir:

netbios-ssn 139/tcp nbssn

por:

netbios-ssn 140/tcp nbssn

Con esto pasamos a dar el servicio de net-bios por el puerto 140 y el 139 se cierra. Cuidado! Es muy probable que tengas que modificar los programas que usan net-bios para que sigan funcionando.

El passwd : 

En concreto /etc/passwd. Este es el archivo mas ansiado (junto con el de los passwords para internet) por los hackers, así que lo mejor será protegerlo.
Asegúrate que sus permisos son:

-rw-r–r– 1 roto roto 239 Oct 31 1997 passwd

Instala el paquete shadow-utils, este paquete protege los passwords encriptándolos en otro archivo al que sólo tiene acceso roto, por lo que hacerse con el /etc/passwd no sirve de nada. Ademas para los pies a la mayoría de crakeadores de passwords. Aunque parezca una tontería, usar shadow passwords es una de las protecciones mas eficaces contra logins indeseados.

Truco: Elige passwords difíciles de averiguar, que contengan letras, números y caracteres, y si puede ser que la palabra no tenga sentido en ningún idioma. Por ejemplo mAKew3t$ es un buen password.

Truco: Usa el programa John The Ripper para testear la seguridad de tus passwords, si es capaz de crakearlos en pocas horas es que tu password no es seguro.

Limitando el acceso de roto:

El usuario roto es siempre un peligro potencial. El sistema considera que roto sabe perfectamente lo que hace por lo que ni siquiera pedirá confirmación si por error formateamos el disco, imaginaos el desastre …
Reduciendo las vías de acceso de roto al sistema minimizamos riesgos a la vez que nos forzamos a nosotros mismos a dejar de trabajar con roto.

Edita el archivo /etc/securetty y deja solo las consolas en las que quieres que roto pueda entrar. Este archivo contiene una lista de terminales (tty) en las que puede entrar roto, una por linea. Eliminando las lineas que no deseemos evitamos el acceso de roto a ese terminal.

Conozco sistemas en los que roto no puede hacer ningún login y la única manera que tiene de entrar al sistema es mediante el comando "su" que además solo puede ser ejecutado por un grupo muy reducido de usuarios. Sin llegar a este extremo, algo recomendable es dejar por ejemplo las tres primeras consolas para el acceso de roto.

Lo mejor seria que nunca se hiciese login como roto, en lugar de esto podemos usar el comando su para tener privilegios de roto momentáneamente, cambiar lo que haga falta y teclear exit para volver a ser usuario normal sin peligro de estropear nada.

Truco: Nunca, nunca, nunca, dejes acceso por telnet a roto, elimina todas las entradas con ttyp?
Truco: Estas restricciones no protegen contra el uso del comando su!

Tcp_wrappers:

Para esto necesitas tener instalado el paquete tcp_wrappers, lo puedes encontrar en Cualquier ftp de linux y seguramente en el CD de tu distribución ya compilado y pre-configurado.
Este software permite filtrar todas las peticiones de acceso a tu máquina y permitirlas o no en función de unas reglas que tu mismo pones.

Es importante saber que el puerto permanece abierto, lo que se cierra son las conexiones no autorizadas, por lo que tcp_wrappers no nos protegerá contra ataques como nukes ni esconderá el puerto ante un escaneado.

Uso de tcp_wrappers: para filtrar un puerto a través de tcp_wrappers debes definir ese puerto en el /etc/inetd.conf con una linea parecida a esta:
ftp stream tcp nowait roto /usr/sbin/tcpd ftpd

Las reglas que permiten o no el acceso se definen en /etc/hosts.allow (para las conexiones aceptadas) y /etc/hosts.deny (para las rechazadas).
La sintaxis es muy simple: puerto: host: comando

Ejemplo:
ftpd: ALL: spawn ( /bin/echo -e " Intruso %a %n en %d" ; wave -l10 -d1 -f2000 ) &
Esta linea, en el /etc/hosts.allow filtra los accesos al puerto ftp (ftpd) de todo el mundo (ALL) y después de permitirle el acceso realiza los siguientes comandos (spawn):
/bin/echo -e " Intruso %a %n en %d": Saca por pantalla un mensaje indicando los datos del intruso y el puerto atacado.
wave -l10 -d1 -f2000: Emite un sonido por si no estas atento al mensaje.

Otro ejemplo (un sistema cerrado a lo bestia):
ALL: ALL: twist ( /usr/local/bin/teardrop %a ) &
Explicación: a los accesos a Cualquier puerto (ALL) por parte de Cualquier persona (ALL) deniega el acceso (twist) y lanza un teardop al curiosillo de turno.

Muchísima mas información en man inetd.conf, man tcpd, man hosts.allow

El orden en que se definen las reglas es importante, ya que tcp_wrappers las va examinado una a una desde la primera a la ultima hasta encontrar una regla que se cumple, momento en el que ejecuta el comando indicado. Por eso es necesario que las reglas estén ordenadas de mas permisivas a mas restrictivas, por ejemplo si en hosts.allow ponemos en la primera linea ALL: ALL: todas las conexiones serán aceptadas independientemente de que en lineas posteriores filtremos ciertos o no, captáis? si no e-mail me 🙂

Truco: Define en /etc/hosts.allow los puertos a los servicios que quieras ofrecer y pon en /etc/hosts.deny ALL: ALL
Truco: Los parámetros permiten hacer cosas al intruso usando spawn ( programa %a ) … deja volar tu imaginación.
Truco: La linea ALL: PARANOID detecta los intentos de spoof y similares

services:

Este archivo, localizado en /etc/services es una base de datos que contiene información sobre los puertos.

Es importante remarcar que no indica si un puerto esta abierto o cerrado, es solo una guía para que los programas sepan localizar los servicios y como responder a las peticiones. Por lo tanto en principio no debemos tocar nada de este archivo. El archivo donde se abren o cierran puertos es inetd.conf.

De forma "extraoficial" podemos comentar lineas para cerrar los puertos que definen. Atención! Este no es un método correcto y solo lo recomiendo en el caso de que el puerto implicado no sea definido en el inetd.conf y no podamos usar un firewall para protegerlo.

Podemos ver mas información en man services.

Nuevos puertos/servicios:

Juntando todo lo aprendido hasta aquí sobre servicios y puertos ya estamos en disposición de crear nuestros propios puertos con sus respectivos servicios.

Como sencillo ejemplo voy a crear un nuevo servicio en el puerto 22 que será atendido por un demonio telnet. Para distinguirlo del telnet normal (puerto 23) le llamaremos telnet2. Tenemos que modificar los siguientes archivos:

/etc/services: aquí añadimos el servicio, definiendo el puerto que usa y su nombre:

telnet2         22/tcp          telnet2             # Telnet 2

/etc/inetd.conf: aquí definimos las opciones y el demonio que atiende al nuevo servicio:

telnet2 stream  tcp     nowait  roto    /usr/sbin/tcpd  in.telnetd2

Usar in.telnetd2 en lugar de in.telnetd es un truquillo para poder distinguir fácilmente los dos servicios y poderlos configurar por separado, no olvides hacer un link de in.telnetd a in.telnetd2

/etc/hosts.allow: por supuesto, el nuevo servicio puede ser filtrado por tcp_wrappers para delimitar su accesibilidad:

in.telnetd2: ALL: twist ( echo -e "Acceso de %a en %d" > /dev/tty11 ) &

El firewall:

El firewall es uno de los sistemas de protección mas potente junto al uso de tcp_wrappers. Para usarlo necesitaremos soporte firewall en el kernel, esto se consigue fácilmente activando la casilla de
[*] Network firewalls
[*] IP firewalling
durante la configuración del kernel. Básicamente es solo esto Aunque dependiendo de cada uno pueden hacer falta activar otras opciones (soporte ethernet …)
Compaginar un firewall con la herramienta ipchains añade otro nivel de seguridad a nuestro sistema. Recordad que los puertos protegidos por firewall no se ven con un escaneado de puertos ni son sensibles a nukes ni exploits (algunos scanners como nmap son capaces de reconocer puertos protegidos por firewall) puesto que toda la información que se les envía es sencillamente eliminada.

Para usar ipchains pon estas lineas en tu /etc/rc.d/rc.local:

/sbin/ipchains -F
/sbin/ipchains -I input -p tcp -s 127.0.0.1
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 515 -j DENY

Esto nos permite acceso total a nuestra propia maquina y limita los accesos al puerto 515 (el de la impresora) cosa que no podíamos hacer con tcp_wrappers.
Gracias a Javi Polo por esto.

A partir de aquí las posibilidades de configuración son casi infinitas: detectar spoof, seleccionar los protocolos de entrada, salida, definir rangos de IPs "amigas" … sean cuales sean tus necesidades hay una forma de cubrirlas con ipchains. Lee el ipchains-howto y el man ipchains para mas información.

En el caso de usar antiguos kernels de la serie 2.0.x se utiliza la herramienta ipfwadm, si este es tu caso pon estas lineas en tu /etc/rc.d/rc.local:

/sbin/ipfwadm -I -f
/sbin/ipfwadm -I -a a -S 127.0.0.1
/sbin/ipfwadm -I -a d -P tcp -D 0.0.0.0/0 515

Truco: Un firewall permite tener control sobre puertos no definidos en el inetd.conf y por lo tanto fuera del alcance de tcp_wrappers.

Actualizate!:

Mantener un sistema actualizado previene contra el ataque de exploits provocados por bugs en el software.
Actualiza el kernel siempre que aparezca una nueva versión estable, por ejemplo el kernel 2.0.34 no es sensible a ninguno de los nukes conocidos a la hora de realizar este documento. Si tu kernel es anterior estudia seriamente la posibilidad de actualizarlo.
Actualiza los demonios de todos los servicios que ofrezca tu máquina para evitar sorpresas. La web de RootShell es un buen sitio donde mantenerse informado.

Truco: Por algún motivo el IMAP y el sendmail son especialmente sensibles a exploits. Si usas alguno de los dos asegúrate de tener siempre la ultima versión disponible.

Truco: Si te ves obligado a recibir conexiones por telnet estudia la posibilidad de substituir este servicio por el SSH (Sechure SHell) mucho mas seguro y con muchas posibilidades que el telnet tradicional.