Protección de servidor Linux. ¿Qué hacer primero?

Protección de servidor Linux. ¿Qué hacer primero?
Habib M’henni / Wikimedia Commons, CC BY-SA

Hoy en día, poner en marcha un servidor en el hosting es cuestión de minutos y unos pocos clics. Pero justo después de su lanzamiento, entra en un entorno hostil, ya que está abierto a toda la internet como una chica inocente en una discoteca de rock. Pronto será detectado por escáneres y encontrado por miles de bots programados automáticamente que recorren la red en busca de vulnerabilidades y configuraciones incorrectas. Hay varias cosas que se deben hacer inmediatamente después del lanzamiento para garantizar una protección básica.

Contenido

Usuario sin privilegios de root

Lo primero que hay que hacer es crear un usuario sin privilegios de root. La cuestión es que el usuario root tiene privilegios absolutos en el sistema, y si se le permite la administración remota, estarás haciendo la mitad del trabajo para un hacker, dejándole un nombre de usuario válido.

Por lo tanto, se debe crear otro usuario y desactivar la administración remota por SSH para el root.

El nuevo usuario se crea con el comando useradd:

useradd [options]

Luego se le asigna una contraseña con el comando passwd:

passwd

Finalmente, este usuario debe ser agregado a un grupo que tenga derecho a ejecutar comandos con privilegios elevados. sudoDependiendo de la distribución de Linux, estos pueden ser diferentes grupos. Por ejemplo, en CentOS y Red Hat, se agrega al usuario al grupo wheel:

usermod -aG wheel

En Ubuntu, se agrega al grupo sudo:

usermod -aG sudo

Claves en vez de contraseñas SSH

El ataque por fuerza bruta o la filtración de contraseñas son vectores de ataque estándar, por lo que es mejor desactivar la autenticación por contraseñas en SSH (Secure Shell) y en su lugar utilizar la autenticación por claves.

Hay varios programas para implementar el protocolo SSH, tales como lsh y Dropbear, pero el más popular es OpenSSH. Instalación del cliente OpenSSH en Ubuntu:

sudo apt install openssh-client

Instalación en el servidor:

sudo apt install openssh-server

Iniciar el demonio SSH (sshd) en el servidor bajo Ubuntu:

sudo systemctl start sshd

Iniciar automáticamente el demonio en cada arranque:

sudo systemctl enable sshd

Cabe señalar que la parte del servidor de OpenSSH incluye al cliente. Es decir, a través de openssh-server se puede conectar a otros servidores. Además, desde su máquina cliente puede iniciar un túnel SSH desde el servidor remoto a un host externo, y entonces el host externo considerará al servidor remoto como la fuente de las solicitudes. Una función muy conveniente para ocultar su sistema. Para más detalles, consulte el artículo «Consejos prácticos, ejemplos y túneles SSH».

En la máquina cliente generalmente no tiene sentido instalar un servidor completo para evitar la posibilidad de conexiones remotas a la computadora (por razones de seguridad).

Así que, para su nuevo usuario, primero necesita generar claves SSH en el ordenador desde el cual accederá al servidor:

ssh-keygen -t rsa

La clave pública se almacena en un archivo .pub y se ve como una cadena de caracteres aleatorios que comienza con ssh-rsa.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

Luego, como root, cree un directorio SSH en el directorio home del usuario en el servidor y agregue la clave pública SSH al archivo authorized_keys, usando un editor de texto como Vim:

mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keys

vim /home/user_name/.ssh/authorized_keys

Finalmente, establezca los permisos correctos para el archivo:

chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keys

y cambie la propiedad a este usuario:

chown -R username:username /home/username/.ssh

En el lado del cliente, debe especificar la ubicación de la clave privada para la autenticación:

ssh-add DIR_PATH/keylocation

Ahora puede iniciar sesión en el servidor como el usuario usando esta clave:

ssh [username]@hostname

Después de la autorización, puede usar el comando scp para copiar archivos, la utilidad sshfs para montar remotamente sistemas de archivos o directorios.

Es recomendable hacer varias copias de seguridad de la clave privada, porque si desactiva la autenticación por contraseña y la pierde, no tendrá ninguna manera de acceder a su propio servidor.

Como se mencionó anteriormente, en SSH es necesario desactivar la autenticación para root (por esta razón creamos un nuevo usuario).

En CentOS/Red Hat encontramos la línea PermitRootLogin yes en el archivo de configuración /etc/ssh/sshd_config y la cambiamos a:

PermitRootLogin no

En Ubuntu, agregamos la línea PermitRootLogin no en el archivo de configuración 10-my-sshd-settings.conf:

sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

Después de verificar que el nuevo usuario se autentica con su clave, se puede desactivar la autenticación por contraseña para evitar el riesgo de filtración o fuerza bruta. Ahora, para acceder al servidor, un atacante necesitaría obtener la clave privada.

En CentOS/Red Hat encontramos la línea PasswordAuthentication yes en el archivo de configuración /etc/ssh/sshd_config y la cambiamos de la siguiente manera:

PasswordAuthentication no

En Ubuntu, agregamos la línea PasswordAuthentication no en el archivo 10-my-sshd-settings.conf:

sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

Consulta las instrucciones para habilitar la autenticación de dos factores por SSH en. aquí.

Cortafuegos

El firewall garantiza que solo el tráfico permitido por los puertos que has autorizado directamente llegue al servidor. Esto protege contra la explotación de puertos que se han habilitado por accidente con otros servicios, es decir, reduce significativamente la superficie de ataque.

Antes de instalar el firewall, es necesario asegurarse de que SSH esté en la lista de excepciones y no sea bloqueado. De lo contrario, después de iniciar el firewall, no podremos conectarnos al servidor.

La distribución de Ubuntu viene con Uncomplicated Firewall (ufw), mientras que CentOS/Red Hat incluye firewalld.

Permitir SSH en el firewall de Ubuntu:

sudo ufw allow ssh

En CentOS/Red Hat usamos el comando firewall-cmd:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Después de este procedimiento, se puede iniciar el firewall.

En CentOS/Red Hat, iniciamos el servicio systemd para firewalld:

sudo systemctl start firewalld
sudo systemctl enable firewalld

En Ubuntu usamos el siguiente comando:

sudo ufw enable

Fail2Ban

El servicio Fail2Ban analiza los registros en el servidor y cuenta el número de intentos de acceso desde cada dirección IP. En la configuración se especifican las reglas sobre cuántos intentos de acceso se permiten en un intervalo determinado, después de lo cual dicha dirección IP es bloqueada por un tiempo establecido. Por ejemplo, permitimos 5 intentos fallidos de autenticación por SSH en un intervalo de 2 horas, después de lo cual bloqueamos esa dirección IP durante 12 horas.

Instalación de Fail2Ban en CentOS y Red Hat:

sudo yum install fail2ban

Instalación en Ubuntu y Debian:

sudo apt install fail2ban

Inicio:

systemctl start fail2ban
systemctl enable fail2ban

El programa tiene dos archivos de configuración: /etc/fail2ban/fail2ban.conf y /etc/fail2ban/jail.conf. Las restricciones para el bloqueo se especifican en el segundo archivo.

El jail para SSH está habilitado por defecto con la configuración inicial (5 intentos, intervalo de 10 minutos, bloqueo por 10 minutos).

[DEFAULT]
ignorecommand =
bantime = 10m
findtime = 10m
maxretry = 5

Además de SSH, Fail2Ban puede proteger otros servicios en el servidor web nginx o Apache.

Actualizaciones de seguridad automáticas

Como es conocido, todas las aplicaciones constantemente encuentran nuevas vulnerabilidades. Después de la publicación de esta información, los exploits se añaden a paquetes de exploits populares, los cuales son utilizados masivamente por hackers y adolescentes al escanear todos los servidores de forma continua. Por eso, es muy importante instalar las actualizaciones de seguridad tan pronto como aparezcan.

En un servidor Ubuntu, en la configuración por defecto, se activan las actualizaciones automáticas de seguridad, por lo que no se requieren acciones adicionales.

En CentOS/Red Hat, es necesario instalar la aplicación dnf-automatic y activar el temporizador:

sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer

Verificando el temporizador:

sudo systemctl status dnf-automatic.timer

Cambio de puertos por defecto

SSH fue desarrollado en 1995 para reemplazar telnet (puerto 23) y ftp (puerto 21), por lo que el autor del programa, Tatu Ylönen elegió el puerto 22 como predeterminado, y fue aprobado por la IANA.

Naturalmente, todos los delincuentes son conscientes de en qué puerto opera SSH, y lo escanean junto con otros puertos estándar para conocer la versión del software, para comprobar contraseñas estándar de root, y así sucesivamente.

Cambiar puertos estándar — ofuscación — reduce considerablemente el volumen de tráfico basura, el tamaño de los registros y la carga del servidor, así como también disminuye la superficie de ataque. Aunque algunos critican este método de "protección a través de la oscuridad" (security through obscurity). La razón es que esta técnica se opone a la fundamental protección arquitectónica. Por lo tanto, por ejemplo, el Instituto Nacional de Estándares y Tecnología de EE. UU. en "Las Directrices de Seguridad del Servidor" indica la necesidad de una arquitectura de servidor abierta: "La seguridad del sistema no debe depender de la oscuridad de la implementación de sus componentes", se menciona en el documento.

Teóricamente, cambiar puertos por defecto contradice la práctica de una arquitectura abierta. Pero en la práctica, el volumen de tráfico malicioso realmente se reduce, por lo que es una medida simple y efectiva.

El número de puerto puede configurarse modificando la directiva Port 22 en el archivo de configuración /etc/ssh/sshd_config. También se especifica con el parámetro -p en sshd. El cliente SSH y los programas sftp también admiten el parámetro -p.

Parámetro -p se puede utilizar para indicar el número de puerto al conectarse a través del comando ssh en Linux. En sftp y scp se utiliza el parámetro -P (título P). La instrucción desde la línea de comandos anula cualquier valor en los archivos de configuración.

Si hay muchos servidores, casi todas estas acciones para proteger el servidor Linux se pueden automatizar en un script. Pero si solo hay un servidor, es mejor controlar el proceso manualmente.

Publicidad

¡Pide y comienza a trabajar de inmediato! Creación de VDS de cualquier configuración y con cualquier sistema operativo en un minuto. La configuración máxima permitirá rendir al máximo: 128 núcleos de CPU, 512 GB de RAM, 4000 GB de NVMe. Epic 😄

Protección de servidor Linux. ¿Qué hacer primero?

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster