oeee oe oeee Linux mola y es mazo fácil

Guías rápidas de sistemas - Pello Xabier Altadill Izura - Número 003
pello@pello.info
  Seguridad básica  

Ver:

www.linuxsecurity.com


O de como poner (y no exponer) un servidor linux en internet.

Linux es un sistema tan seguro como lo puede ser cualquier otro; y digo como cualquier otro porque si a un Linux no le cambiamos la configuración que trae por defecto es tan hackeable como un WinDOS.

En este boletín se enumeran los pasos básicos para mantener seguro un host linux. La seguridad se sustenta en tres pilares básicos:

  • Backups
  • Actualizaciónes de sistema
  • Auditorías y mantenimiento

* Antes de iniciar la rutina de mantenimiento en una máquina, conviene dejar a punto el sistema operativo. Se suponque que la maquina estará destinada a un uso concreto (servidor web, repositorio de ficheros, proxy, gestor de bbdd), por tanto de lo que se trata es de cerrar programas y puertos TCP/UDP que no sean necesarios y optimizar los recursos de sistema. Supongamos que tenemos un linux recien instalado y queremos adecuarlo a su uso concreto.

Hagamos un chequeo rapido del sistema:
ps -auxf (o ps -fea, o top):veremos los procesos que se arrancan por defecto.
df -h :veremos el porcentaje de disco duro que tenemos ocupado
free :veremos el uso de la memoria RAM y del espacio Swap
netstat -ln
:muy interesante: veremos los puertos que estan en escucha. (si no funciona usamos netstat -a | grep LISTEN)

En general, solo nos debemos preocupar si el disco duro ocupa casi todo el espacio (aunque dependiendo del uso que se de a Linux no importa estar con el disco al 80%), si se usa memoria swap, si hay procesos que ocupen valores de ocupación de cpu de 60%,70%. Lo normal es que los procesos no chupen mucho recursos.

 

1.- Con el servidor desconectado de la red, lo primero que haremos será detener los servicios de sistema que no se van a utilizar y configurar el sistema para que NO inicie esos servicios cuando se vuelva a arrancar. Dependiendo de la distribución esto cambia un poco, lo normal es que haya enlaces a los script de inicio dentro de /etc/rc.d/rc3.d En redhat podemos usar el comando setup y configurar los procesos que se iniciaran al arrancarse el sistema. En freeBSD tendremos el /etc/rc.local o /usr/local/etc . Especial cuidado hay que tener con el servicio inetd o xinetd, ya que es un superdaemon que inicia otros procesos. Se puede deshabilitar del todo o configurar de forma precisa para que solo habilite lo que le digamos.

2.- Es de suponer que el sistema será gestionado por un grupo concreto de personas o una entidad X, por tanto se debe habilitar algun servicio para la gestión remota del sistema de forma segura. Tenemos varias alternativas, entre las que destacan: SSH y webmin con SSL. No podemos ahorrar algunos intentos de ataque y pasar de largo scaneos de puertos si simplemente cambiamos el puerto por defecto del servicio SSH. También no estaría de más cambiar el banner que muestra SSH cuando te conectas a su puerto. Aunque lo más eficiente sin duda, es filtrar esos puertos con el sistema de firewall de Linux, y más vale que lo hagamos, habida cuenta de los agujeros casi tradicionales de SSH y de openssl.

3.-Lo dicho: poner en marcha el firewall de sistema. En linux el firewall viene integrado en el kernel y ponerlo en marcha no es mas que añadir reglas. Dependiendo de la distribución y la versión tendremos un sistema concreto aunque por lo general todo se reduce a reglas como esta:

todo lo que venga de ip1 el puerto ssh permitir
todo lo que venga de cualquier otro sitio a ssh cerrar
todo lo que venga de cualquier ip al puerto web permitir
todo lo que venga de cualquier ip del puerto 1 al 1024 cerrar
... etcetera

Los sistemas más conocidos en linux son ipchains e iptables (herederos de ipchains en los nuevos kernels). Merece la pena un vistazo al enlace de netfilter y ejem, ejem, a este tutorial introductorio.

4.- Comprobar!! llegados a este punto, comprobamos que realmente se han aplicado los cambios, para eso ejecutamos los mismos comandos de antes
ps -auxf (o ps -fea, o top):veremos los procesos que se arrancan por defecto.
df -h :veremos el porcentaje de disco duro que tenemos ocupado
free :veremos el uso de la memoria RAM y del espacio Swap
netstat -ln
:muy interesante: veremos los puertos que estan en escucha. (si no funciona usamos netstat -a | grep LISTEN)
iptables -L -n (o ipchains -L -n): veremos las reglas de firewall que estan aplicadas.

5.- Enchufamos el linux a la red, le damos salida a internet, y realizamos la primera actualización de sistema. Dependiendo de la distribución Linux tendremos un sistema u otro, tanto en los debian como en redhat disponemos de apt-get, muy comoda. Oficialmente en redhat tenemos up2date, pero esta sujeta a los caprichos de redhat, y solo permiten descargarse el software desde ellos. Aunque hay proyectos alternativos. Con apt-get bastaria con hacer:

apt-get update
apt-get -y upgrade
(asume la respuesta SI por defecto, si no nos mostraria la lista de paquetes que se actualizan antes de proceder).

6.- Ya tenemos el sistema preparado y funcionando. ¿Pero qué pasa si se reinicia el sistema? ¿Se aplica el firewall? ¿se inician los servicios que se tienen que iniciar? Comprobemoslo: reiniciamos el sistema y volvemos a ejecutar los comandos básicos de que nos muestran el estado del sistema.

Hacemos los ajustes y volvemos a reiniciar hasta que el sistema haga todo lo que tiene que hacer. Ahora estamos en condiciones de pasar a las rutinas básicas para mantener el servidor seguro.


  • Backups: a ver chavales en mayusculas: EL BACKUP ES LA ACCIÓN DE SEGURIDAD MÁS BÁSICA, IMPORTANTE Y PRIMORDIAL de cualquier sistema. Sin backup no hay nada. ¿Para qué queremos una BD proteguida a prueba de hackers si un fallo en el disco duro hace desaparece todo? Lo que debemos identificar en primer lugar es que nos interesa conservar. Dónde guardarlo y como ya es otro problema aparte. Sea cual sea el uso de nuestro sistema, sin lugar a dudas hay un directorio que guardaremos a toda costa: el /etc . Hay tenemos toda la configuracion mas básica, cuentas de usuarios, etc.. Teniendo este directorio guardado, por ejemplo seriamos capaces de restrablecer un servidor de correo sendmail en el tiempo que cueste instalar un sistema nuevo. Aquí daremos un ejemplo de backup simple: se comprimen ciertos directorios y se envían a otra maquina via FTP.

     

    #!/bin/sh

    # Script que realiza un backup y envia el fichero a un servidor remoto por FTP
    # (c) Pello Xabier Altadill Izura - pello@pello.info
    # Para especificar QUE es lo que guardamos usamos la variable BACKUP

    # Variables
    HOST_FTP=mi.host.backup.com
    USUARIO_FTP=backupuser
    PASSWORD_FTP=backuppass
    FICHERO_BACKUP=backup.sistema.tar.gz
    BACKUP="/etc /var/lib/mysql /var/www"

    # Compresion
    tar zcfp $FICHERO_BACKUP $BACKUP && echo "[OK]" || exit

    # Sesion FTP automatizada
    echo "OK conectando... $HOST_FTP usuario $USUARIO_FTP "

    # poner opcion v para verbose
    ftp -inv << BASTA
    open $HOST_FTP
    user $USUARIO_FTP $PASSWORD_FTP
    hash
    put $FICHERO_BACKUP
    BASTA

    #Borramos fichero de backup
    rm -f $FICHERO_BACKUP


    Obviamente hay otras maneras más elegantes de hacer backup sin la necesidad de crear una "pelota" (un fichero de backup gordo) en el propio sistema. Si queremos pasar de cintas, podemos simplemente replicar el contenido del sistema en otro disco. Un opcion muy interesante, sencilla y que simplemente funciona es el serv icio rsync.
    NOTA: generalmente una copia a lo bestia de ficheros para recuperar datos puede funcionar en un sistema linux. Podemos comprimir todo el linux en un tar.gz y descomprimirlo y hacerlo funcionar (lo unico seria el arranque, la primera vez habría que hacerlo con diskette). Mas concretamente, podemos coger el directorio /var/lib/mysql o /var/lib/pgsql y sobreescribirlo con uno de backup y funciona (pero en fin, esto ultimo solo para casos desesperados)

  • Actualizaciónes de sistema: generalmente, con las herramientas de actualización de sistema podemos generar tareas periódicas para que el sistema se actualice solo. De todas formas NO ES MUY recomendable, ya que no siempre una actualización es beneficiosa. Es preferible tener alguna maquina de desarrollo, o una maquina virtual en la que podamos realizar las actualizaciones y comprobar si el sistema se sigue comportando de la misma manera, para luego actualizar el servidor que tengamos en producción.

  • Auditorías y mantenimiento: Bien, ya tenemos nuestra máquina parcheada, superactualizada y con las reglas de firewall filtrando el acceso no deseado. ¿Estamos seguros de que es asi? Conviene hacer un escaneo rapido sobre nuestra máquina con herramientas como nmap:
    nmap -sS -vv -p1-65535 -P0 mi.maquina.com
    Con ese comando escaneamos todos los puertos e intentamos adivnar el sistema operativo, así nos podemos hacer una idea de como ven los posibles hackers nuestra máquina, y sobretodo nos aseguramos de que lo que tiene que estar cerrado efectivamente lo esta.
    Pero con eso no basta. Si es necesario tener ciertos servicios abiertos "al publico" es imprescindible saber si las versiones de software de los servicios son seguras. Para ello debemos hacer dos cosas: acudir al fabricante o desarrollador para ver que dicen y ademas auditar la máquina con herramientas como nessus.
    Por supuesto nunca esta de más estar al día en temas de seguridad, podemos acudir a hispasec, securityfocus, y un largo etc.

    Pero en resumen, lo importane es ser muy constante hasta la rutina con estas operaciones; si se puede automatizar es mejor, pero hasta cierto punto, por que hay que revisar manuamente las auditorias, emails de confirmación de actualizaciones o backups, etc. En este documento se ha cubierto la seguridad de maquinas linux desde fuera. La seguridad interna del entorno multiusuario ya es otro cantar.

 

Hasta la proxima

 
© 2003 - Pello Xabier Altadill Izura - www.pello.info