|
|
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
| |