Medidas de seguridad recomendadas para proteger a tus servidores

Introducción

La mayoría del tiempo, su enfoque principal estará en levantar y ejecutar sus aplicaciones en la nube. Como parte de su proceso de configuración y despliegue, es importante integrar medidas de seguridad robustas y detalladas para sus sistemas y aplicaciones antes de que estén disponibles al público. Implementar las medidas de seguridad descritas en este tutorial antes de desplegar sus aplicaciones asegurará que cualquier software que ejecute en su infraestructura tenga una configuración de base segura, en lugar de medidas ad hoc que puedan implementarse post-desplegue.

Este guía destaca algunas medidas de seguridad prácticas que puede adoptar mientras configura y establece su infraestructura de servidores. Esta lista no es una recopilación exhaustiva de todo lo que puede hacer parasegurar sus servidores, pero le ofrece un punto de partida que puede construir sobre él. Con el tiempo, puede desarrollar un enfoque de seguridad más personalizado que se ajuste a las necesidades específicas de sus entornos y aplicaciones.

Llaves SSH

SSH, o shell seguro, es un protocolo encriptado utilizado para administrar y comunicarse con servidores. Cuando trabajes con un servidor, probablemente pasarás la mayor parte de tu tiempo en una sesión de terminal conectado al servidor mediante SSH. Como alternativa a las loginas basadas en contraseñas, las claves SSH usan el cifrado para proporcionar una manera segura de acceder a tu servidor. Se recomienda el uso de claves SSH para todos los usuarios.

Con claves SSH se crea un par de claves privada y pública para el propósito de autenticación. La clave privada se mantiene secreta y segura por el usuario, mientras que la clave pública se puede compartir. Esto se conoce comúnmente como cifrado asimétrico, un patrón que podrías ver en otros lugares.

Para configurar la autenticación de claves SSH, necesitas colocar tu clave pública de SSH en la ubicación esperada del servidor (normalmente ~/.ssh/authorized_keys). Para obtener más información sobre cómo funciona la autenticación basada en claves SSH, leer Entendiendo el Proceso de Conexión y Encriptación de SSH.

¿Cómo Mejoran la Seguridad las Claves SSH?

Con SSH, cualquier tipo de autenticación, incluyendo la autenticación por contraseña, se encuentra completamente cifrada. Sin embargo, cuando se permiten las sesiones de inicio de sesión basadas en contraseña, los usuarios malintencionados pueden intentar automáticamente y repetidamente acceder a un servidor, especialmente si tiene una dirección IP pública. Aunque hay maneras de bloquear el acceso después de varios intentos fallidos provenientes del mismo IP, y los usuarios malintencionados se verán limitados en la práctica por la velocidad a la que pueden intentar iniciar sesión en tu servidor, cualquier circunstancia en la que un usuario pueda intentar obtener acceso a tu stack mediante ataques de fuerza bruta repetidos planteará un riesgo de seguridad.

Configurar la autenticación por clave SSH te permite deshabilitar la autenticación basada en contraseña. Las claves SSH generalmente tienen muchos más bits de datos que una contraseña — puedes crear una hash de clave SSH de 128 caracteres a partir de una contraseña de 12 caracteres — lo que las hace mucho más difíciles de forzar por fuerza bruta. Algunos algoritmos de cifrado sin embargo se consideran crackable intentando reverse-engineering las hash de contraseñas lo suficientemente veces en un ordenador lo suficientemente potente. Otros, incluyendo la clave RSA predeterminada generada por los clientes SSH modernos, no son aún plausibles para forzar.

Cómo Implementar Claves SSH

Las claves SSH son la forma recomendada para iniciar sesión en cualquier entorno de servidor Linux remoto. Un par de claves SSH se puede generar en tu máquina local usando el comando ssh, y luego puedes transferir la clave pública a un servidor remoto.

Para configurar las claves SSH en tu servidor, puedes seguir cómo configurar claves SSH para Ubuntu, Debian o CentOS.

Para cualquier parte de tu stack que requiera acceso con contraseña o sea susceptible a ataques de fuerza bruta, puedes implementar una solución como fail2ban en tus servidores para limitar el número de intentos de adivinanzas.

Es una práctica común no permitir que el usuario root loguee directamente sobre SSH. En cambio, loguee como un usuario sin privilegios y luego escalate los privilegios según sea necesario utilizando una herramienta como sudo. Este enfoque de limitación de permisos es conocido como principio de menos privilegio. Una vez que hayas conectado a tu servidor y hayas verificado que funciona con SSH, puedes deshabilitar las conexiones de root estableciendo la directiva PermitRootLogin no en /etc/ssh/sshd_config en tu servidor y luego reiniciar el proceso de SSH del servidor con un comando como sudo systemctl restart sshd.

Firewalls

Un firewall es un dispositivo o software que controla cómo se exponen los servicios al red y qué tipos de tráfico están permitidos dentro y fuera de un servidor dado o redes. Un firewall configurado adecuadamente garantizará que solo se puedan acceder a los servicios que deben estar disponibles públicamente desde fuera de tus servidores o la red.

En un servidor típico, varios servicios podrían estar corriendo por defecto. Estos se pueden clasificar en grupos como el siguiente:

  • Servicios públicos que pueden ser accesados por cualquier persona en la red, a menudo anónimamente. Un ejemplo de esto es el servidor web que sirve tu sitio web real.
  • Servicios privados que sólo deberían ser accesibles por una selección de cuentas autorizadas o desde determinadas ubicaciones. Por ejemplo, un panel de control de bases de datos como phpMyAdmin.
  • Servicios internos que sólo deberían estar accesibles dentro del propio servidor, sin exponer el servicio al internet público. Por ejemplo, una base de datos que solo admita conexiones locales.

Los firewalls pueden asegurarse de que el acceso a tu software sea restringido según las categorías mencionadas anteriormente con grados de granularidad variables. Los servicios públicos se pueden dejar abiertos y disponibles para la red internet, y los servicios privados se pueden restringir basándose en criterios diferentes, como tipos de conexión. Los puertos que no se estén usando se bloquean completamente en la mayoría de configuraciones.

¿Cómo mejoran la seguridad las firewalls?

Incluso si tus servicios implementan características de seguridad o están restringidos a las interfaz que les gustaría ejecutar, una firewall sirve como capa básica de protección al limitar conexiones hacia y desde los servicios antes de que el tráfico sea procesado por una aplicación. Un firewall configurado adecuadamente restringirá acceso a cualquier cosa excepto las funciones específicas que necesitas mantener abiertas, usualmente abriendo solo puertos asociados con esos servicios. Por ejemplo, SSH se ejecuta generalmente en el puerto 22, y la acceso a la web mediante un navegador HTTP/HTTPS usualmente se ejecuta en los puertos 80 y 443 respectivamente. Exposición sólo a pocos componentes reduce la superficie de ataque de tu servidor, limitando los componentes vulnerables a explotación.

Para implementar una firewall, hay muchos dispositivos disponibles para sistemas basados en Linux, y algunos son más complejos que otros. En general, deberías solo necesitar hacer cambios a tu configuración de firewall cuando hagas cambios en los servicios que ejecutas en tu servidor. Aquí hay algunos opciones para empezar:

Cómo implementar firewalls

– **ufw**: ufw es una firewall simple y muy flexible que está incluido en muchas distribuciones de Linux. Para usar ufw:
1. Instalar ufw si no lo tienes ya instalado.
2. Usando la terminal, inicia sesión como superusuario y ejecuta `sudo ufw`.
3. Configura la firewall permitiendo solo los puertos necesarios para los servicios que deseas mantener abiertos. Por ejemplo, si quieres permitir acceso a tu servidor SSH desde la red pública, puedes ejecutar `sudo ufw allow 22`.
4. Mantén la configuración actualizada. Este paso es crucial para asegurarte de que tu firewall siga protegiendo tu servidor contra posibles amenazas.
– **iptables**: iptables es una herramienta más avanzada y poderosa que requiere más configuración y conocimientos previos sobre networking y seguridad. Puedes encontrar guías detalladas sobre cómo configurar iptables en línea de comandos en varios sitios en línea.
– **NFTABLES**: NFTABLES es una alternativa moderna a iptables que ofrece mayor flexibilidad y performance. Si te sientes confiable con tu conocimiento de networking y de seguridad, puedes considerar migrar a NFTABLES.

Es importante recordar que cualquier cambio en tu firewall debe ser hecho con precaución y después de haber realizado una copia de seguridad de tu sistema, ya que una configuración erronea podría exponer tu servidor a amenazas externas.

  • UFW, o Uncomplicated Firewall, está instalado por defecto en algunas distribuciones de Linux como Ubuntu. Puedes aprender más sobre él en Cómo configurar un cortafuegos con UFW en Ubuntu 20.04

  • Si estás utilizando Red Hat, Rocky o Fedora Linux, puedes leer Cómo configurar un cortafuegos utilizando firewalld para utilizar sus herramientas predeterminadas.

  • Muchos cortafuegos de software, como UFW y firewalld, escribirán sus reglas configuradas directamente en un archivo llamado iptables. Para aprender a trabajar con la configuración de iptables directamente, puedes revisar Esenciales de Iptables: Reglas y Comandos Comunes de Cortafuegos
    . Ten en cuenta que algunos otros software que implementan reglas de puerto por su cuenta, como Docker, también escribirán directamente en iptables, y pueden entrar en conflicto con las reglas que crees con UFW, por lo que es útil saber cómo leer una configuración de iptables en casos como este.

Nota: Muchos proveedores de alojamiento, incluyendo DigitalOcean, le permitirán configurar un fuego en la frontera de la red usando herramientas administradas. Estas configuraciones, que se ejecutan como una capa externa sobre sus servidores en la nube, son a menudo menos complejas en práctica, pero pueden ser más difíciles de guiar y replicar. Puede referirse a la documentación de la firewall de DigitalOcean en la nube.Asegúrese de que la configuración predeterminada de su firewall bloquee el tráfico desconocido. De esta manera, cualquier nuevo servicio que deploye no estará accidentalmente expuesto a Internet. En cambio, tendrá que permitir acceso explícito, lo que obligará a evaluar cómo se ejecuta, accede y quién debería poder usarlo.

Redes VPC

Las redes Virtuales Privadas (VPC) son redes privadas para recursos de infraestructura. Las redes VPC proporcionan conexiones más seguras entre recursos porque las interfaces de la red no están disponibles desde la red pública.

Cómo Mejoran la Seguridad?

Las redes VPC mejoran la seguridad mediante la conectividad más segura entre los recursos debido a que las interfaces de la red no están disponibles para la red pública.

Algunos proveedores de hospedaje en la nube le asignarán, por defecto, una interfaz de red pública y otra privada a sus servidores en la nube. Deshabilitar la interfaz de red pública en partes de su infraestructura solo permitirá que estas instancias se conecten entre sí usando sus interfaces de red privadas sobre una red interna, lo que significa que el tráfico entre sus sistemas no será rerutado a través de la red pública donde podría estar expuesto o interceptado.

Con condicionalmente exponiendo solo unos pocos puertos de acceso dedicados al internet, también conocidos como ingresos gateways, como único punto de acceso entre los recursos de su red VPC y la red pública, tendrás más control y visibilidad sobre el tráfico público que llega a tus recursos. Los sistemas de orquestación de contenedores modernos como Kubernetes tienen muy bien definido el concepto de puertas de entrada, porque crean muchas interfaces de red privadas por defecto, las cuales necesitan ser expuestas seleccionadamente.

Implementación de redes VPC

Muchos proveedores de infraestructura en la nube te permiten crear y agregar recursos a una red VPC dentro de sus centros de datos.

Nota: Si estás usando DigitalOcean y deseas configurar tu propio gateway de VPC, puedes seguir la guía Cómo Configurar una Droplets como Gateway de VPC para aprender cómo hacerlo en servidores basados en Debian, Ubuntu y CentOS.

Configurar manualmente su propia red privada puede requerir configuraciones avanzadas de servidores y conocimientos en redes. Una alternativa a establecer una red VPC es utilizar una conexión VPN entre sus servidores.

VPN y Red Privada

Un VPN, o red privada virtual, es un método para crear conexiones seguras entre computadoras remotas y presentar la conexión como si fuera una red privada local. Esto proporciona una manera de configurar sus servicios como si estuvieran en una red privada y conectar servidores remotos sobre conexiones seguras.

Por ejemplo, las redes privadas de DigitalOcean permiten comunicación aislada entre servidores dentro de la misma cuenta o equipo en la misma región.

¿Cómo Mejoran la Seguridad los VPN?

El uso de una VPN es una forma de mapear una red privada que solo se vea a sus servidores. La comunicación será completamente privada y segura. Otras aplicaciones pueden configurarse para pasar su trafico sobre la interfaz virtual que el software VPN expone. De esta manera, sólo los servicios que se deben usar por clientes en la red pública necesitan estar expuestos en la red pública.

Cómo implementar VPNs

El uso de redes privadas generalmente requiere que tomes decisiones sobre tus interfaces de red al momento de desplegar tus servidores por primera vez, y configuras tus aplicaciones y cortafuegos para preferir estas interfaces. En comparación, la implementación de VPNs requiere instalar herramientas adicionales y crear rutas de red adicionales, pero generalmente se puede desplegar sobre la arquitectura existente. Cada servidor en una VPN debe tener los datos de seguridad y configuración compartidos necesarios para establecer una conexión VPN. Después de que la VPN esté funcionando, debes configurar las aplicaciones para usar el túnel VPN.

Si estás utilizando Ubuntu o CentOS, puedes seguir el tutorial Cómo configurar un servidor OpenVPN en Ubuntu 20.04.

Wireguard
es otra popular implementación de VPN. Generalmente, las VPNs siguen el mismo principio de limitar la entrada a tus servidores en la nube implementando una serie de interfaces de red privada detrás de unos pocos puntos de acceso, pero mientras que las configuraciones de VPC son usualmente consideraciones centrales de infraestructura, las VPNs se pueden implementar de manera más ad-hoc.

Auditoría de Servicios

Una buena seguridad implica analizar tus sistemas, comprender las superficies de ataque disponibles y asegurar los componentes lo mejor que puedas.

La auditoría de servicios es una manera de saber qué servicios están en ejecución en un sistema dado, que puertos están utilizando para la comunicación y qué protocolos están utilizando esos servicios. Esta información puede ayudarte a configurar qué servicios deben ser accesibles públicamente, ajustes de cortafuegos, supervisión y alertas.

¿Cómo Mejora la Auditoría de Servicios la Seguridad?

Cada servicio en ejecución, ya sea que esté destinado a ser interno o público, representa una superficie de ataque ampliada para los usuarios malintencionados. Cuanto más servicios tengas en ejecución, mayor es la probabilidad de que una vulnerabilidad afecte a tu software.

Una vez que tengas una buena idea de qué servicios de red están en ejecución en tu máquina, puedes comenzar a analizar estos servicios. Cuando realices una auditoría de servicios, te preguntes las siguientes preguntas sobre cada servicio en ejecución:

  • ¿Debería estar ejecutándose este servicio?
  • ¿Este servicio se está ejecutando en las interfaces de red que no debería estar ejecutándose?
  • Debería la funcionalidad de servicio estar vinculada a una interfaz de red pública o privada?
  • ¿Están mis reglas de fuego estructuradas para pasar el tráfico legítimo al servicio?
  • ¿Están mis reglas de fuego bloqueando el tráfico que no es legítimo?
  • ¿Tengo un método de recibir alertas de seguridad sobre vulnerabilidades para cada uno de estos servicios?

Este tipo de auditoría de servicios debe ser práctica estándar cuando se configure cualquier nuevo servidor en su infraestructura. Realizar auditorías de servicios cada pocos meses también ayudará a detectar servicios con configuraciones que puedan haber cambiado accidentalmente.

Cómo implementar la auditoría de servicios

Para auditar los servicios de red que están corriendo en tu sistema, utilice la comanda ss. Un ejemplo de comando que muestra el nombre del programa, PID y direcciones usadas para escuchar trafico TCP y UDP es:

  1. sudo ss -plunt

Las opciones p, l, u, n, y t funcionan como sigue:

  • p muestra el proceso específico que usa una conexión dada.
  • l muestra solo sockets que están actualmente escuchando conexiones.
  • u incluye sockets UDP (además de sockets TCP).
  • n muestra valores numéricos de tráfico.
  • El servidor incluye sockets TCP (además de sockets UDP).

Se mostrará una salida similar a esta:

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3)) tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=812,fd=4)) tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=69226,fd=7),("nginx",pid=69225,fd=7))

Las columnas principales que necesitan tu atención son la Netid, Dirección local:Puerto y nombre del proceso. Si la dirección es 0.0.0.0, entonces el servicio está aceptando conexiones en todos los interfaces de red IPv4. Si la dirección es [:], entonces el servicio está aceptando conexiones en todos los interfaces de red IPv6. En la ejemplo de salida anterior, SSH y Nginx están escuchando en ambas las pilas de red networking, tanto IPv4 como IPv6.

Puedes decidir si quieres permitir que SSH y Nginx escuchen en ambos interfaces o solo en uno u otro. Generalmente, deberías deshabilitar servicios que se ejecutan en interfaces no utilizadas. Normalmente, deberías desactivar servicios que se ejecuten en versiones antiguas y inseguras de software.

Actualizaciones sin intervención

La actualización de sistemas sin intervención permite que el sistema actualice la mayoría de paquetes automáticamente. Los servidores que corran versiones obsoletas y inseguras de software son responsables de la mayoria de incidentes de seguridad, pero las actualizaciones regulares mitigan vulnerabilidades y prevenen que los atacantes obtengan un punto de partida en tus servidores. Actualizaciones sin intervención permiten que el sistema actualice la mayoría de paquetes automáticamente.

¿Cómo mejoran la seguridad las actualizaciones sin atención?

El implementar actualizaciones sin atención, es decir automáticas, reduce el nivel de esfuerzo necesario para mantener seguras sus servidores y reduce el tiempo durante el cual pueden estar vulnerables a errores conocidos en los programas. En caso de una vulnerabilidad que afecta al software en sus servidores, sus servidores estarán expuestos hasta que ejecuten las actualizaciones. Las actualizaciones diarias automáticas garantizarán que no se pierdan paquetes y que cualquier software susceptible sea parcheado tan pronto como se disponga la corrección.

Cómo implementar actualizaciones sin atención

Puede consultar Cómo Mantener Servidores Ubuntu Actualizados para obtener una visión general sobre la implementación de actualizaciones sin atención en Ubuntu.

Infraestructura de claves públicas y encriptación SSL/TLS

La infraestructura de claves públicas, o PKI, se refiere a un sistema diseñado para crear, administrar y validar certificados para identificar a individuos y cifrar la comunicación. Los certificados SSL o TLS pueden ser utilizados para autenticar a diferentes entidades entre sí. Después de la autenticación, también se pueden usar para establecer comunicaciones encriptadas.

Cómo Mejora la Seguridad con PKI?

El establecimiento de una autoridad de certificados (CA) y la gestión de certificados para sus servidores permite que cada entidad dentro de su infraestructura validez las identidades de los miembros y cifre su trafico. Esto puede prevenir ataques en el medio donde un atacante imita un servidor en tu infraestructura para interceptar el tráfico.Cada servidor puede configurarse para confiar en una autoridad de certificados centralizada. Después de eso, cualquier certificado firmado por esta autoridad se puede confiar implícitamente.

Para implementar PKI, sigue estos pasos:

Cómo Implementar PKI

La configuración de una autoridad de certificados y la instalación de otras infraestructuras de seguridad pública pueden involucrar un esfuerzo considerable al principio. Además, administrar certificados puede crear una carga administrativa adicional cuando se necesitan nuevos certificados para firmar, expirar o revocar.

Para muchos usuarios, implementar una infraestructura de seguridad pública completamente podría sólo tener sentido cuando sus necesidades de infraestructura sean grandes. La seguridad de las comunicaciones entre componentes mediante una VPN podría ser mejor una medida intermedia hasta que llegue el punto en el que sea rentable la administración de costos adicionales de la autoridad de certificados.

Si desea crear su propia autoridad de certificados, puede consultar las guías Cómo Crear y Configurar una Autoridad de Certificados (CA) dependiendo de la distribución de Linux que esté utilizando.

Conclusión

Las estrategias proporcionadas en esta tutoría son un resumen de algunos de los pasos que puedes tomar para mejorar la seguridad de tu sistema. Es importante reconocer que las medidas de seguridad disminuyen en su efectividad cuanto más tarde lo hagas. La seguridad no debe ser un aspecto después de la cuenta y debe implementarse cuando primero provisiones tu infraestructura. Una vez que tengas una base de seguridad en la que construir, puedes comenzar a deployear servicios y aplicaciones con alguna asunciones de que están funcionando en un entorno seguro por defecto.

Aun con un entorno de inicio seguro, tenga en cuenta que la seguridad es un proceso continuo y iterativo. Siempre asegúrese de preguntarse qué implicaciones de seguridad podrían tener cualquier cambio, y qué pasos puede tomar para asegurarse de siempre crear configuraciones y entornos de software seguras por defecto.

Source:
https://www.digitalocean.com/community/tutorials/7-security-measures-to-protect-your-servers