Linux Hardenining: consejos para proteger tu distro y hacerla más segura

Hardening Linux dos tuxs, uno indefenso y otro con armadura

Se han publicado muchos artículos sobre las distribuciones Linux más seguras, como por ejemplo TAILS (que vela por tu privacidad y anonimato en la red), Whonix (un Linux para paranoicos de la seguridad) y otras distros orientadas a ser seguras. Pero claro, no todos los usuarios quieren utilizar estas distribuciones. Por eso en este artículo daremos una serie de recomendaciones para el “Linux Hardening“, es decir, hacer más seguro tu distro (sea cual sea).

Red Hat, SUSE, CentOS, openSUSE, Ubuntu, Debian, Arch Linux, Linux Mint, … qué más da. Cualquier distribución puede ser segura como las más seguras si la conoces en profundidad y sabes cómo protegerte de los peligros que te acechan. Y para ello se puede actuar en muchos niveles, no solo a nivel de software, también a nivel de hardware.

Conejos genéricos de seguridad:

Seguridad por hardware circuito con candado

En este apartado te daré algunos consejos muy básicos y sencillos que no necesitan de conocimientos informáticos para entenderlos, tan solo son de sentido común pero que a veces no llevamos a cabo por descuido o por dejadez:

  • No subas datos personales o sensibles a la nube. La nube, independientemente de si es libre o no y si es más o menos segura, es una buena herramienta para disponer de tus datos allá donde vayas. Pero intenta no subir datos que no quieras “compartir” con curiosos. Este tipo de datos más sensibles debes llevarlos en un medio más personal, como por ejemplo una tarjeta SD o pendrive.
  • Si usas un equipo para acceder a Internet y trabajas con datos importantes, por ejemplo, imagina que te has unido a la moda del BYOD y te has llevado unos datos empresariales a casa. Pues en este tipo de circunstancias, no trabajes online, intenta estar desconectado (¿para qué quieres estar conectado para trabajar por ejemplo con LibreOffice editando un texto?). Un ordenador desconectado es el más seguro, recuerdalo.
  • Relacionado con lo anterior, no dejes datos importantes en el disco duro local cuando trabajes conectado. Te recomiendo que dispongas de un disco duro externo u otro tipo de memoria (tarjetas de memoria, pendrives, etc) en la que tengas dicha información. Así pondremos una barrera entre nuestro equipo conectado y esa memoria “no conectada” donde están los datos importantes.
  • Haz copias de seguridad de los datos que consideres interesantes o no quieras perder. Cuando usan vulnerabilidades para introducirse en tu equipo y escalar privilegios, el atacante podrá borrar o manipular cualquier dato sin impedimentos. Por eso es mejor tener un respaldo.
  • No dejes datos sobre tus puntos débiles en foros o comentarios en las webs. Si por ejemplo tienes problemas de seguridad en tu equipo y tiene puertos abiertos que quieres cerrar, no dejes tu problema en un foro para que te ayuden, porque puede ser usado en tu contra. Alguien con malas intenciones puede usar esa información para buscar a su víctima perfecta. Es mejor que busques a un técnico de confianza que te ayude a resolverlos. También es frecuente que empresas pongan en Internet anuncios del tipo “Busco experto en seguridad informática” o “Se necesita personal para el departamento de seguridad”. Eso puede indicar una posible debilidad en dicha empresa y un ciberdelincuente puede usar este tipo de páginas para buscar víctimas fáciles… Tampoco es bueno que dejes información del sistema que utilizas y versiones, alguien podría usar exploits para explotar vulnerabilidades de dicha versión. Resumiendo, cuanto más desconozca el atacante de tí, mucho más difícil le será atacar. Ten en cuenta que los atacantes suelen realizar un proceso previo al ataque denominado “information gathering” y consiste en recolectar información sobre la víctima que pueda ser usada en su contra.
  • Mantén tu equipo actualizado con las últimas actualizaciones y parches, recuerda que en muchas ocasiones, éstas no solo mejoran las funcionalidades, también corrigen bugs y vulnerabilidades para que no sean explotadas.
  • Utiliza contraseñas seguras. Nunca pongas nombres que estén en el diccionario o contraseñas tipo 12345, puesto que con ataques de diccionario se pueden sacar rápidamente. Tampoco dejes contraseñas por defecto, puesto que son fácilmente detectables. Tampoco uses fechas de nacimiento, nombres de familiares, mascotas o sobre tus gustos. Ese tipo de contraseñas pueden ser fácilmente averiguadas por ingeniería social. Lo mejor es que uses una contraseña larga con números, letras mayúsculas y minúsculas, y símbolos. Tampoco uses contraseñas maestras para todo, es decir, si tienes una cuenta de correo y una sesión de un sistema operativo, no utilices la misma para ambos. Esto es algo que en Windows 8 han metido la pata hasta el fondo, puesto que la contraseña para iniciar sesión es la misma de tu cuenta de Hotmail/Outlook. Una contraseña segúra es del tipo: “auite3YUQK&&w-”. Por fuerza bruta se podría conseguir pero, el tiempo dedicado a ello, hace que no merezca la pena…
  • No instales paquetes de fuentes desconocidas y a ser posible. Usa los paquetes de código fuente desde la web oficial del programa que quieras instalar. Si los paquetes son dudosos, te recomiendo que utilices un entorno sandbox como Glimpse. Lo que conseguirás es que todas las aplicaciones que instales en Glimpse puedan ejecutarse con normalidad, pero al intentar leer o escribir datos, solo se reflejen dentro del entorno sandbox, aislando a tu sistema de problemas.
  • Utiliza los privilegios del sistema lo menos posible. Y cuando necesites privilegios para alguna tarea, es recomendable que utilices “sudo” preferiblemente antes que “su”.

Otros consejos algo más técnicos:

Seguridad Informática, candado sobre teclado

Además de los consejos vistos en el apartado anterior, también es muy recomendable que sigas los siguientes pasos para hacer aun más segura tu distro. Ten en cuenta que tu distribución puede ser tan segura como quieras, quiero decir, mientras más tiempo dediques a configurar y securizar, mucho mejor.

Suites de seguridad en Linux y Firewall/UTM:

Utiliza SELinux o AppArmor para fortificar tu Linux. Estos sistemas son algo complejos, pero puedes ver manuales que te ayudarán mucho. AppArmor puede restringir incluso aplicaciones sensibles a exploits y otras acciones no deseadas de procesos. AppArmor ha sido incluido en el kernel Linux a partir de la versión 2.6.36. Su fichero de configuración se almacena en /etc/apparmor.d

Cierra todos los puertos que no utilices frecuentemente. Sería interesante incluso que dispongas de un Firewall físico, eso es lo mejor. Otra opción es dedicar un equipo viejo o que no utilices para implementar un UTM o Firewall para tu red doméstica (puedes emplear distribuciones como IPCop, m0n0wall,…). También puedes configurar iptables para filtrar lo que no desees. Para cerrarlos puedes usar “iptables/netfilter” que integra el propio kernel Linux. Te recomiendo consultar manuales sobre netfilter e iptables, puesto que son bastante complejos y no se podrían explicar en un artículo. Puedes mirar los puertos que tienes abiertos tecleando en el terminal:

netstat -nap

Protección física de nuestro equipo:

También puedes proteger físicamente tu equipo por si no confías en alguien de tu entorno o tienes que dejar tu equipo en algún sitio al alcance de otras personas. Para ello puedes desactivar el arranque desde otros medios que no sean tu disco duro en el BIOS/UEFI y proteger con contraseña el BIOS/UEFI para que no puedan modificarlo sin ella. Así evitarás que alguien se lleve un USB booteable o disco duro externo con un sistema operativo instalado y pueda tener acceso a tus datos desde él, sin ni siquiera tener que iniciar sesión en tu distro. Para protegerla, accede al BIOS/UEFI, en la sección Security puedes añadir el password.

Igual puedes hacer con GRUB, protegiéndolo con contraseña:

grub-mkpasswd-pbkdf2

Introduce la contraseña para GRUB que deseas y se codificará en SHA512. Luego copia la contraseña codificada (la que aparece en “Your PBKDF2 is”) para usarla más adelante:

sudo nano /boot/grub/grub.cfg

Crea un usuario al inicio y ponle la contraseña cifrada. Por ejemplo, si la contraseña copiada anteriormente era “grub.pbkdf2.sha512.10000.58AA8513IEH723”:

set superusers=”isaac”
password_pbkdf2 isaac grub.pbkdf2.sha512.10000.58AA8513IEH723

Y guarda los cambios…

Menos software = más seguridad:

Minimiza el número de paquetes instalados. Solo instala los que necesites y si vas a dejar de utilizar alguno, lo mejor es desinstalarlo. Mientras menos software tengas, menos vulnerabilidades. Recuerdalo. Igual te aconsejo con los servicios o demonios de ciertos programas que se ejecutan al iniciar el sistema. Si no los usas, ponlos en modo “off”.

Borra información de forma segura:

Cuando borres información de un disco, tarjeta de memoria o partición, o simplemente un fichero o directorio, hazlo de forma segura. Aunque creas que lo has borrado, puede ser recuperado fácilmente. Al igual que físicamente no sirve tirar un documento con datos personales a la basura, porque alguien podría sacarlo del contenedor y verlo, por lo que hay que destruir el papel, en informática ocurre lo mismo. Por ejemplo, puedes llenar la memoria con datos aleatorios o nulos para sobrescribir los datos que no deseas exponer. Para ello puedes usar (para que funcione debes ejecutarlo con privilegios y sustituir /dev/sdax por el dispositivo o partición sobre la que quieras actuar en tu caso…):

dd if=/dev/zeo of=/dev/sdax bs=1M
dd if=/dev/unrandom of=/dev/sdax bs=1M

Si lo que quieres es borrar un fichero concreto para siempre, puedes usar “shred”. Por ejemplo, imagina que quieres borrar un fichero llamado contraseñas.txt donde tengas apuntadas contraseñas del sistema. Podemos usar shred y sobrescribir por ejemplo 26 veces encima para garantizar que no pueda ser recuperado tras su borrado:

shred -u -z -n 26 contraseñas.txt

Existen herramientas como HardWipe, Eraser o Secure Delete que puedes instalar para “wipear” (eliminar de forma permanente) memorias, particiones SWAP, RAM, etc.

Cuentas de usuario y contraseñas:

Mejora el sistema de contraseñas con herramientas como S/KEY o SecurID para crear un esquema de contraseñas dinámicas. Asegurate que no existe ninguna contraseña cifrada en el directorio /etc/passwd. Tenemos que usar mejor /etc/shadow. Para ello puedes usar “pwconv” y “grpconv” para crear usuarios y grupos nuevos, pero con contraseña oculta. Otra cosa interesante es editar el fichero /etc/default/passwd para dar caducidad a tus contraseñas y obligarte a renovarlas periódicamente. Así si logran una contraseña, no les durará eternamente, puesto que la cambiaras con frecuencia. Con el fichero /etc/login.defs también se puede fortificar el sistema de contraseñas. Editalo, buscando la entrada PASS_MAX_DAYS y PASS_MIN_DAYS para especificar el mínimo y máximo de días que puede durar una contraseña antes de caducar. PASS_WARN_AGE muestra un mensaje para avisarte que pronto caducará la contraseña en X días. Te aconsejo ver un manual sobre este fichero, puesto que las entradas son muy numerosas.

Las cuentas que no estén siendo utilizadas y estén presentes en /etc/passwd, tienen que tener la variable al Shell /bin/false. Si es otra, cambiala a ésta. De ese modo no podrán usarse para obtener un shell. También es interesante modificar la variable PATH de nuestro terminal para que no aparezca el directorio actual “.”. Es decir, tiene que pasar de ser “./user/local/sbin/:/usr/local/bin:/usr/bin:/bin” a “/user/local/sbin/:/usr/local/bin:/usr/bin:/bin”.

Sería recomendable que empleases Kerberos como método de autentificación en la red.

PAM (Pluggable Autentication Module) es algo parecido a Microsoft Active Directory. Aporta un esquema de autentificación común, flexible y con ventajas claras. Puedes echar un ojo al directorio /etc/pam.d/ y buscar información en la red. Es bastante extenso para explicarlo aquí…

Vigila los privilegios de los distintos directorios. Por ejemplo, /root debería pertenecer al usuario root y grupo root, con permisos “drwx – – – – – -”. Puedes buscar info en la red sobre que permisos debe tener cada directorio del árbol de directorios de Linux. Una configuración diferente podría ser peligrosa.

Encriptar tus datos:

Cifra el contenido de un directorio o partición donde tengas información relevante. Para ello puedes usar LUKS o con eCryptFS. Por ejemplo, imagina que queremos encriptar /home de un usuario llamado isaac:

sudo apt-get install ecryptfs-utils
ecryptfs-setup-private
ecryptfs-migrate-home -u isaac

Tras lo anterior, indica la passphrase o contraseña cuando te lo pida…

Para crear un directorio privado, por ejemplo llamado “privado” también podemos usar eCryptFS. En ese directorio podremos meter las cosas que queremos cifrar para quitarla de la vista ajena:

mkdir /home/isaac/privado
chmod 700 /home/isaac/privado
mount -t ecryptfs /home/isaa/privado

Nos hará preguntas sobre distintos parámetros. Primero nos dejará elegir entre contraseñas, OpenSSL,… y debemos elegir 1, es decir, “passphrase”. Luego introducimos la contraseña que queramos dos veces para verificar. Tras ello elegimos el tipo de cifrado que queramos (AES, Blowfish, DES3, CAST, …). Yo elegiría la primera, AES y luego introducimos el tipo de bytes de la clave (16, 32 o 64). Y finalmente contestamos a la última pregunta con un “yes”. Ahora puedes montar y desmontar este directorio para utilizarlo.

Si solo quieres encriptar ficheros concretos, puedes usar scrypt o PGP. Por ejemplo, un fichero que se llame contraseñas.txt, puedes usar los siguientes comandos para encriptar y desencriptar respectivamente (en ambos casos te pedirá una contraseña):

scrypt <contraseñas.txt>contraseñas.crypt
scrypt <contraseñas.crypt>contraseñas.txt

Verificación en dos pasos con Google Authenticator:

Google AUthenticator en terminal Ubutnu

Añade verificación en dos pasos en tu sistema. Así, incluso si roban tu contraseña no tendrán acceso a tu sistema. Por ejemplo, para Ubuntu y su entorno Unity podemos emplear LightDM, pero los principios pueden ser exportados a otras distros. Necesitarás un tablet o smartphone para ello, en él debes instalar Google Authenticator desde la Play Store. Luego en el PC, lo primero es instalar Google Authenticator PAM y ponerlo en marcha:

sudo apt-get install libpam-google-authenticator
google-authenticator

Cuando nos pregunte si las claves de verificación estarán basadas en el tiempo contestamos afirmativamente con una y. Ahora nos muestra un código QR para ser reconocido con Google Authenticator desde tu smartphone, otra opción es introducir la clave secreta directamente desde la app (es la que en el PC nos aparecía como “Your new secret is:”). Y nos dará una serie de códigos por si no llevamos el smartphone encima y que sería bueno tenerlos presente por si las moscas. Y seguimos contestado con y o n según nuestras preferencias.

Ahora abrimos (con nano, gedit, o tu editor de texto favorito) el fichero de configuración con:

sudo gedit /etc/pam.d/lightdm

Y añadimos la línea:

auth required pam_google_authenticator.so nullok

Guardamos y la próxima ver que inicies sesión nos pedirá la clave de verificación que nos generará nuestro móvil.

Si un día quieres quitar la verificación en dos pasos, solo tienes que borrar la línea “auth required pam_google_authenticator.so nullok” del fichero /etc/pam.d/lightdm
Recuerda, el sentido común y la precaución es el mejor aliado. Un entorno GNU/Linux es seguro, pero cualquier equipo conectado a una red deja de ser seguro por muy bueno que sea el sistema operativo que utilices. Si tienes alguna duda, problema o sugerencia, puedes dejar tu comentario. Espero que te sirva de ayuda…


Un comentario

  1.   Nuria dijo

    Hola buenas, mira te comento; he instalado google-authenticator en un Raspbian sin ningún problema y la aplicación en el móvil registra bien y me proporciona el código, pero a la hora de reiniciar la raspberry y volver a iniciar en el sistema no me pide que ingrese el codigo de doble autenticación, unicamente me aparece introducir usuario y contraseña.

    Muchas gracias. Un saludo.

Escribe un comentario