Servers


Primeros pasos en nuestro servidor

Objetivos

Se pretende establecer la configuración mínima para un servidor, para ello: crearemos un nuevo usuario, restringiremos el acceso al usuario root, eliminaremos el acceso mediante password, permitiendo solo el acceso mediante par de clave, limitaremos el número de fallos al intentar logear * y dejaremos un firewall instalado para cuando deseemos limitar puertos.

Importante: Aplicar restricciones de acceso conlleva perder el acceso al mismo salvo que se cumplan los requisitos (par de claves), por favor, deje siempre un terminal conectado al servidor hasta finalizar todo el procedimiento. Si requiere de acciones/comprobaciones en la máquina local, haga uso de un segundo terminal.

Cuando veas un bloque de comandos debes saber que utilizaré para referirme a una salida, la respuesta que nos dará el terminal.

Para facilitar la ejecución de las instrucciones, se han declarado a modo de constantes una serie de palabras reservadas para que el lector pueda realizar una búsqueda masiva y pueda reemplazar todas las cadenas encontradas, adaptando de esta manera los comandos al caso de uso del lector.

  • <server_ip>: Dirección IP del servidor que alojará nuestra web.
  • <user>: Usuario que tendrá acceso mediante SSH al servidor el cual pertenecerá al grupo sudo.
  • <local>: Nombre de la máquina local.
  • <local_user>: Usuario local de nuestra máquina.

Actualización e instalación de paquetes

Como primer paso, cambiaremos el password de root ya que vendrá uno por defecto:

# local
ssh root@<server_ip>

# servidor
passwd

Realizamos la actualización de paquetes y a continuación instalamos nuestras dependencias:

# servidor
sudo apt update
sudo apt upgrade
sudo apt install fail2ban ufw

Creación del usuario con acceso al servidor

Crearemos un usuario el cual usaremos para conectar al servidor y lo asignamos al grupo sudo:

# servidor
adduser <user>
usermod -aG sudo <user>

Configuración de autenticación por clave pública

Primero deberemos generar el par de claves en nuestra máquina local y a continuación añadir la clave pública al fichero authorized_keys del servidor.

Para generar el par de claves usaremos ssh-keygen, el cual nos pedirá que determinemos la ruta+nombre de nuestro par de claves (/home/<local_user>/.ssh/<local_user>) y a continuación un password para la misma:

# local
ssh-keygen
→ Generating public/private rsa key pair.
→ Enter file in which to save the key (/home/<local_user>/.ssh/id_rsa): /home/<local_user>/.ssh/<local_user>
→ Enter passphrase (empty for no passphrase): 
→ Enter same passphrase again: 
→ Your identification has been saved in /home/<local_user>/.ssh/<local_user>.
→ Your public key has been saved in /home/<local_user>/.ssh/<local_user>.pub.
→ The key fingerprint is:
→ SHA256:UKUUawEdYslmcXnGxOodzk0uijQaYoBZz+trsV69M6k <local_user>@<local>
→ The key's randomart image is:
→ +---[RSA 2048]----+
→ |     .==BOo      |
→ |  .  .==o+=      |
→ |.o o o. ++       |
→ |+   o  o. . .    |
→ | .   . .S+ =     |
→ |  o + o.. = o    |
→ | . o *.o.o .     |
→ |    =.. =.       |
→ |   oo.E..o       |
→ +----[SHA256]-----+

Usaremos xclip para copiar el contenido de la clave pública.

xclip almacenará en Ctrl + V el contenido del fichero especificado en el comando, por lo que dispondremos de la clave pública en el paso siguiente.

Si xclip no está instalado en nuestro sistema podemos instalarlo con sudo apt install xclip.

# local
xclip -sel clip < ~/.ssh/<local_user>.pub

Creamos el directorio .ssh para el usuario <user> y establecemos los permisos:

# servidor
su - <user>
mkdir ~/.ssh
chmod 700 ~/.ssh

Abrimos authorized_keys y pegamos la clave pública en el fichero:

# servidor
nano ~/.ssh/authorized_keys

pegamos el contenido en nano con Shift + Ctrl + V, a continuación guardamos y cerramos el fichero.

Establecemos los permisos para el fichero authorized_keys

# servidor
chmod 600 ~/.ssh/authorized_keys

Restricción de acceso root y obligatoriedad de uso del par de claves para el acceso

Los cambios serán realizados sobre el fichero /etc/ssh/sshd_config del servidor, para ello será necesario abrir dicho fichero con nano y cambiar los valores de algunas variables, a continuación muestro los valores que deben quedar establecidos en el fichero.

Eliminamos el acceso al usuario root:

# servidor: nano /etc/ssh/sshd_config
PermitRootLogin prohibit-password

En caso de que no haya actualizado la paquetería, mencionar que prohibit-password apareció como valor para el fichero de configuración a partir de la versión 7.0 de OpenSSH, para las versiones anteriores puedes utilizar no o without-password.

Habilitamos el acceso mediante par de claves y eliminamos el acceso por password:

# servidor: nano /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no

Aplicamos los cambios recargando la configuración de ssh:

# servidor
systemctl reload sshd

Importante: Tras validar los cambios las sesiones actualmente abiertas se mantendrán abiertas. En cambio, será imposible abrir nuevas sesiones como root. Por lo tanto, no desloguee el terminal que tenga abierto como root hasta finalizar toda la configuración.

Verificación de cambios

En un nuevo terminal intentaremos acceder como root:

# local
ssh root@<server_ip>
→ root@<server_ip>: Permission denied (publickey).

Obtendremos un mensaje de error, siendo imposible siquiera introducir el password.

Intentando acceder como <user>

# local
ssh <user>@<server_ip>

# servidor
sudo ls
exit

Si hemos podido acceder al servidor sin utilizar el password establecido para el usuario en el momento de su creación indicará que hemos podido acceder mediante el par de claves.

Si ls no retornó ningún error, querrá decir que pertenecemos al grupo sudo.

Si pudimos logear con par de claves y ejecutar una instrucción como sudo, podremos dar por finalizada esta guía.

fail2ban

La configuración que viene por defecto es totalmente válida para defender el servidor ante los posibles intentos de accesos no autorizados.

Mencionar que el fichero de configuración /etc/fail2ban/jail.conf, en el cual está toda la configuración de fail2ban, no debe ser modificado por el usuario pues puede ser actualizado automáticamente tras un upgrade de la paquetería.

Si se desea realizar algún cambio sobre la configuración de fail2ban deberán usarse el jail local, para ello crearemos el fichero /etc/fail2ban/jail.local copiando el contenido de jail.conf y será en el donde realicemos la configuración a medida.

# servidor
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

ufw

UFW, o Uncomplicated Firewall, es un frontend de IPTABLES bastante sencillo de utilizar.

Podemos conocer las aplicaciones disponibles a aplicar reglas con:

# servidor
sudo ufw app list
→ Available applications:
→   AIM
→   Bonjour
→   CIFS
→   DNS
→   Deluge
→   IMAP
→   IMAPS
→   IPP
→   KTorrent
→   Kerberos Admin
→   Kerberos Full
→   Kerberos KDC
→   Kerberos Password
→   LDAP
→   LDAPS
→   LPD
→   MSN
→   MSN SSL
→   Mail submission
→   NFS
→   Nginx Full
→   Nginx HTTP
→   Nginx HTTPS
→   OpenSSH
→   POP3
→   POP3S
→   PeopleNearby
→   SMTP
→   SSH
→   Socks
→   Telnet
→   Transmission
→   Transparent Proxy
→   VNC
→   WWW
→   WWW Cache
→   WWW Full
→   WWW Secure
→   XMPP
→   Yahoo
→   qBittorrent
→   svnserve

Para establecer una regla que permita el acceso mediante SSH deberíamos ejecutar:

# servidor
sudo ufw allow OpenSSH

Para habilitar ufw:

# servidor
sudo ufw enable

Para consultar las reglas existentes:

# servidor
sudo ufw status
→ Status: active
→ 
→ To                         Action      From
→ --                         ------      ----
→ OpenSSH                    ALLOW       Anywhere                  
→ OpenSSH (v6)               ALLOW       Anywhere (v6)             

Deshabilitar el firewall:

# servidor
sudo ufw disable

Habilitar logs:

# servidor
sudo ufw logging on

Hay tres niveles de log, low, medium, high. Siendo low el nivel por defecto. Para cambiar el nivel ejecutar: sudo ufw logging low|medium|high

Los logs quedan almacenados en /var/log/ufw.log.

Referencias externas