Rocky Linux es un sistema operativo open source de nivel enterprise. Su principal peculiaridad es estar diseñado y mantenido a la par de Red Hat Enterprise Linux, es decir, ser 100% compatible bug a bug. En esta guía vamos a realizar una primera puesta en seguridad, básica, de un VPS Rocky Linux recién instalado. Estos primeros pasos sencillos deberán completarse luego con otros posibles mecanismos de seguridad, según los servicios que quieras instalar.
Dado el origen común (Red Hat), esta guía vale también para los sistemas operativos CentOS 7 y 8.
Requisitos previos
- Un VPS Rocky Linux
- Un usuario con privilegios adecuados, es decir, root
- Un editor de texto; en nuestro ejemplo usaremos nano
- El gestor de paquetes dnf, normalmente incluido en el sistema operativo
- [Recomendado] Un firewall; en nuestro ejemplo usaremos firewalld
Comprobemos qué sistema operativo está instalado
Al tratarse de una distribución Linux que sigue a Red Hat EL, en caso de problemas conviene estar seguros de la versión sobre la que se trabaja. Para ello podemos lanzar el comando:
# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.0 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.0"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.0 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.0"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.0"
En nuestro ejemplo la versión es la 9.0, denominada Blue Onyx.
Actualiza tu sistema operativo
Para comprobar si hay actualizaciones usamos el comando dnf con el parámetro check-update:
# dnf check-update
Este comando mostrará la lista de todos los paquetes por actualizar. Llegados a este punto es posible elegir entre actualizar todo lo sugerido o, de forma selectiva, solo algunos paquetes. En el primer caso bastará con lanzar el comando:
# dnf -y update
El parámetro -y sirve únicamente para preconfirmar la voluntad de actualizar todos los paquetes, sin pedir ninguna confirmación. Si en cambio queremos proceder con una actualización selectiva, actualizando por tanto un paquete determinado, bastará con lanzar el comando:
# dnf update cockpit.x86_64
En nuestro ejemplo actualizamos el paquete cockpit, dejando de lado los demás.
Creación de un usuario con privilegios limitados
Como regla general de seguridad, conviene no utilizar el usuario root para las actividades diarias en el VPS. Con ese fin vamos a crear un usuario con privilegios limitados, pero que en caso de necesidad pueda actuar temporalmente como el usuario root. Para crear un nuevo usuario se utiliza el comando useradd:
# useradd mio_utente
Una vez creado el usuario, le asignamos una contraseña utilizando el comando passwd:
# passwd mio_utente
Changing password for user mio_utente
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Aunque el usuario recién creado no tendrá demasiadas posibilidades de causar daños en el sistema, evitemos utilizar contraseñas débiles (al menos 8 caracteres alfanuméricos, caracteres especiales incluidos). Llegados a este punto podemos utilizar el usuario recién creado para conectarnos al VPS, pero por ahora no podremos ejecutar comandos que requieren los privilegios del usuario root.
Para ejecutar comandos que requieren los privilegios de root es posible proceder de dos maneras:
- utilizar el comando
$ su root, para actuar como el usuario root; - añadir el usuario recién creado al grupo de los sudoers (los usuarios que pueden ejecutar comandos con privilegios de root): cuando haga falta, bastará con escribir
$ sudo comando_con_privilegi(ejemplo$ sudo dnf update).
Si en el primer caso el usuario no privilegiado deberá conocer la contraseña de root para poder operar, en el segundo estará en cambio preautorizado — razón de más para no subestimar la calidad de la contraseña elegida. Mejor sería evitar exponer SSH en el puerto estándar y, mejor aún, utilizar claves cifradas para conectarse en lugar del mero sistema usuario/contraseña.
Para añadir el usuario creado al grupo de los sudoers, accedemos al VPS como usuario root y usamos el comando:
# usermod -aG wheel mio_utente
El grupo «wheel» es un grupo especial, usado en algunos sistemas Linux para controlar qué usuarios pueden utilizar el comando sudo. Ahora, si accedemos al VPS por SSH con el usuario sin privilegios, utilizando sudo seguido del comando que requiere privilegios podremos ejecutar actividades que normalmente exigen los permisos de root, por ejemplo:
$ sudo dnf check-update
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for mio_utente:
Obviamente la contraseña solicitada es la del usuario creado anteriormente, no la de root. De este modo podremos crear usuarios para colaboradores externos sin difundir la contraseña de root.
Gestión del firewall
Un aspecto importante para la seguridad del VPS es la gestión del firewall. En Rocky Linux el firewall está activo por defecto y tiene una configuración básica que permite conectarse por SSH (puerto estándar TCP 22) y a la consola web Cockpit (puerto TCP 9090); este último servicio no está activo, así que si intentas conectarte a la dirección https://ip_vps:9090 no recibirás respuesta alguna. A diferencia de los sistemas operativos derivados de Debian (por ejemplo Ubuntu Server), Rocky Linux utiliza firewalld: en consecuencia, los comandos para su configuración son distintos de los de ufw (quien usa habitualmente Ubuntu sabe de qué estamos hablando).
Como primer paso, asegurémonos de que el firewall esté en ejecución:
$ sudo firewall-cmd --state
Dado que estás utilizando un usuario no root, se te pedirá la contraseña. Si todo va según lo previsto, la salida será un simple «running».
Para comprobar la configuración actual del firewall usamos el comando:
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Desde aquí podemos ver que la zona activa se llama public (active), que a dicha zona está asignada la interfaz de red eth0, que están permitidas las comunicaciones entrantes para los servicios cockpit, dhcpv6-client y ssh y que están permitidas las respuestas ICMP — icmp-block-inversion: no (ejemplo: las respuestas al comando ping).
La zona public bloquea por defecto cualquier comunicación entrante, salvo que se especifique lo contrario. Un concepto fundamental de firewalld es que todas las modificaciones hechas a la configuración son temporales, a menos que se utilice el parámetro --permanent antes del comando. Esto significa que si, por ejemplo, quisiéramos abrir el puerto 443 para permitir el acceso por HTTPS con el siguiente comando:
$ sudo firewall-cmd --zone=public --add-service=https
en el primer reinicio del VPS esta regla ya no estaría presente. Si en cambio quisiéramos hacerla permanente, bastará — como hemos dicho:
$ sudo firewall-cmd --permanent --zone=public --add-service=https
Modificar el puerto del servicio SSH
Como diría el genial escritor contemporáneo Ken Follett sobre la confianza: «Confiar en alguien es como sostener agua en las manos cerradas en forma de cuenco…»; si hablamos de seguridad informática, imagina sostener el agua en las manos con los dedos completamente abiertos. Dado que no podemos conocer al «alguien» que intentará conectarse a tu VPS, no le demos ninguna confianza. Un consejo ya dado en otros artículos es modificar el puerto estándar del servicio SSH: esta sencilla operación reduce los intentos de acceso no autorizados por parte de scripts que, de forma automática, prueban a conectarse al puerto 22.
Antes de empezar la configuración decidamos qué puerto utilizar: en este ejemplo hemos elegido el puerto 4322/TCP.
Paso 1 — Configuremos el firewall. Añadamos a la configuración del firewall el puerto 4322/TCP:
$ sudo firewall-cmd --permanent --zone=public --add-port=4322/tcp
Como puedes observar, hemos usado el parámetro para hacer permanente la configuración. Llegados a este punto recarguemos todos los parámetros y asegurémonos de que no haya errores:
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports
En la salida aparecerá nuestro 4322/tcp.
Paso 2 — Configuremos el servicio SSH. El procedimiento para modificar el puerto por defecto es bastante sencillo: basta con modificar el archivo /etc/ssh/sshd_config cambiando el número del puerto y, a continuación, reiniciar el servicio. Para modificar el archivo usaremos el editor nano:
$ sudo nano /etc/ssh/sshd_config
En este archivo todo lo que empieza por «#» indica un comentario y el sistema no lo tiene en cuenta; al mismo tiempo, sin embargo, nos dice cuál es el valor por defecto. Busquemos la línea que empieza por #Port 22, eliminemos el símbolo «#» y modifiquemos el valor del puerto — o bien añadamos una línea justo debajo del comentario con nuestro nuevo puerto SSH: Port 4322. Solo queda guardar el cambio con CTRL+X e Y para confirmar.
Para que los cambios surtan efecto hay que reiniciar el servicio:
$ sudo systemctl restart sshd.service
A partir de este momento, si intentas conectarte por SSH a tu VPS recibirás el mensaje ssh: connect to host IP_VPS port 22: Connection refused. Para poder conectarte es necesario añadir al comando la opción -p seguida del nuevo puerto:
ssh mio_utente@IP_VPS -p 4322
Desactivar el acceso root por SSH
Para una mayor seguridad de tu VPS es muy recomendable no permitir al usuario root el acceso por SSH: con ese fin hemos creado anteriormente un usuario con privilegios limitados, pero que en caso necesario puede convertirse en root. Ahora vamos a impedir el acceso por SSH a root. También en este caso deberemos modificar el archivo de configuración del servicio SSH, como hicimos para el cambio del puerto estándar.
Abrimos el archivo /etc/ssh/sshd_config con el editor nano ($ sudo nano /etc/ssh/sshd_config), buscamos la cadena «PermitRootLogin yes» y la establecemos en «no»:
# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
Guardamos el cambio con CTRL+X e Y para confirmar. Reiniciamos el servicio para que los cambios surtan efecto:
$ sudo systemctl restart sshd.service
Aunque pueda parecer incómodo impedir a root conectarse por SSH, es un paso importante para elevar el nivel de seguridad del VPS. Si necesitas conectarte directamente a la máquina con el usuario root, siempre podrás utilizar la consola web desde el panel de control de tu cuenta VPS GREEN.
Guía publicada originalmente en el blog de VPS GREEN, el servicio VPS en nuestro cloud privado green.