20 de Abril de 2020 · 5 min de lectura
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.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
Crearemos un usuario el cual usaremos para conectar al servidor y lo asignamos al grupo sudo
:
# servidor
adduser <user>
usermod -aG sudo <user>
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á enCtrl
+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 consudo apt install xclip
.
# local
xclip -sel clip < ~/.ssh/<local_user>.pub
Creamos el directorio .ssh
para el usuario
# 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
conShift
+Ctrl
+V
, a continuación guardamos y cerramos el fichero.
Establecemos los permisos para el fichero authorized_keys
# servidor
chmod 600 ~/.ssh/authorized_keys
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 deOpenSSH
, para las versiones anteriores puedes utilizarno
owithout-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.
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
# 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 gruposudo
.
Si pudimos logear con par de claves y ejecutar una instrucción como sudo
, podremos dar por finalizada esta guía.
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, 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
. Siendolow
el nivel por defecto. Para cambiar el nivel ejecutar:sudo ufw logging low|medium|high
Los logs quedan almacenados en
/var/log/ufw.log
.