Práctica 1 - Configuración Inicial
Introducción
SSH (Secure Shell) es un protocolo de red que permite acceder de forma segura a un servidor remoto mediante una conexión cifrada. Se utiliza habitualmente para administrar servidores de manera segura, ofreciendo autenticación y cifrado de datos. En este artículo veremos cómo configurar SSH en dos servidores VPS (o droplets) de DigitalOcean, configurando diferentes puertos de escucha y siguiendo buenas prácticas de seguridad.
Configuración de SSH
En este tutorial, vamos a aprender a configurar SSH en dos servidores VPS o droplets de DigitalOcean, específicamente para permitir conexiones SSH en puertos diferentes para cada servidor, mejorando así la seguridad al evitar ataques de fuerza bruta.
Nota: Antes de realizar esta configuración, si deseas integrar protección de firewall interno y baneo de ips, deberas de consultar el artículo de Configuraciones Adicionales, ya que antes de cambiar los puertos de SSH deberas configurar dichos apartados. De no ser así, podrías quedar bloqueado de tu servidor.
Cambio de Puertos
- Edita el archivo de configuración:
1
nano /etc/ssh/sshd_config
- Cambia el puerto para el droplet 1:
1
Port 55113
- Cambia el puerto para el droplet 2:
1
Port 60112
Reiniciar el Servicio SSH
- Reinicia el servicio:
1
systemctl restart sshd
O alternativamente:
1
service sshd restart
- Verifica el estado:
1
systemctl status sshd
O:
1
service sshd status
Ambos métodos son válidos.
Creación de Usuarios
Para mayor seguridad, crea un usuario distinto de root para acceder por SSH. Ejecuta estos pasos en ambos droplets:
- Crear un usuario:
1
adduser {usuario}
- Asignar una contraseña:
1
passwd {usuario}
- Cambiar al usuario para probar el acceso:
1
su {usuario}
- Ir al directorio home:
1
cd
- Salir del usuario:
1
exit
Comandos extras y/o opcionales
- Borrar un usuario:
1
userdel -r {usuario}
- Agregar el usuario al grupo
wheel
para usarsudo
:1
gpasswd -a {usuario} wheel
- Eliminar el usuario del grupo
wheel
:1
gpasswd -d {usuario} wheel
- Asignar el directorio home:
1
chown -R {usuario}:{usuario} /home/{usuario}
- Borrar un usuario:
Configura los accesos y demás ajustes con root; los usuarios creados solo podrán conectarse por SSH. Se debera crear un usuario para acceso SSH y otro con permisos de sudo para cada droplet.
Configuración de la Carpeta .SSH y Acceso entre Droplets
Crear la carpeta
.ssh
y el archivoauthorized_keys
en ambos droplets:- Puedes crear la carpeta de
.ssh
dentro del directorio home del usuario:1 2
mkdir ~/.ssh cd ~/.ssh
- Otra opción es crear la carpeta de forma personalizada dentro del directorio home del usuario (no recomendado):
1 2 3 4
mkdir ~/{carpeta-personalizada} cd ~/{carpeta-personalizada} mkdir .ssh cd .ssh
- Luego crear el archivo
authorized_keys
y copiar la clave pública del usuario:1
touch authorized_keys
- Una opción es asignar el contenido del archivo
authorized_keys
de root al que acabas de crear:1
cat /root/.ssh/authorized_keys > ~/{ruta_ssh}/authorized_keys
- O copiar el archivo
authorized_keys
de root al nuevo usuario y ajustar los permisos:1
cp /root/.ssh/authorized_keys ~/{ruta_ssh}/authorized_keys
- Asigna los permisos adecuados:
1 2
chmod 700 -R ~/{ruta_ssh} chmod 600 ~/{ruta_ssh}/authorized_keys
- Puedes crear la carpeta de
Configurar el archivo
sshd_config
:Añade o modifica estas líneas:
1 2 3 4 5 6 7 8
AddressFamily inet PermitRootLogin no AllowUsers {usuario-creado-para-ssh} MaxAuthTries 3 MaxSessions 3 # Ubicación del archivo de claves: AuthorizedKeysFile /home/{usuario-creado-para-ssh}/{ruta_ssh}/authorized_keys
Reinicia el servicio SSH:
1
systemctl restart sshd
Creación de Llaves SSH
Generar la llave SSH en el droplet 1:
- Ingresa al usuario creado:
1
su {usuario}
- (Opcional) Genera la llave con nombre personalizado:
1
ssh-keygen -f {ruta_ssh/nombre_archivo} -C "{tu-comentario}"
- Genera la llave por defecto:
1
ssh-keygen -C "{tu-comentario}"
- Sal de la sesión del usuario y ajusta los permisos:
1 2 3
exit chmod 644 ~/{ruta_ssh}/nombre_archivo.pub chmod 600 ~/{ruta_ssh}/nombre_archivo
- Ingresa al usuario creado:
Copiar la llave pública al droplet 2:
- Ingresa al usuario creado:
1
su {usuario}
- (Opcional) Usar ssh-copy-id para copiar la llave
1
ssh-copy-id -i ~/{ruta_ssh}/nombre_archivo.pub {usuario}@{ip_privada_droplet_2}
- O copiar manualmente, ejecuta cat para mostrar la llave y copia el contenido:
1
cat {ruta_ssh}/nombre_archivo.pub
- Ingresa al usuario creado:
Reinicia el servicio SSH:
1
systemctl restart sshd
Configuración del Acceso SSH entre Droplets
Modificar
sshd_config
:- En el droplet 1, asegúrate de que SSH escuche en todas las interfaces:
1 2 3
#ListenAddress 0.0.0.0 ListenAddress 0.0.0.0 #ListenAddress ::
- En el droplet 2, especifica la IP privada:
1
ListenAddress {ip_privada_droplet_2}
- En el droplet 1, asegúrate de que SSH escuche en todas las interfaces:
Reinicia el servicio en ambos droplets:
1
systemctl restart sshd
Configuración de Google Authenticator
Nota: Antes de continuar, asegúrate de haber aumentado la capacidad RAM a 2GB, ya que de no ser así, la instalación podría fallar y arrojar un mensaje de error como por ejemplo:
Killed
, a causa de la falta de memoria. También asegúrate de tener instalado Google Authenticator en tu dispositivo móvil.
- Instalar las dependencias necesarias:
1
dnf install epel-release && dnf update -y
1
dnf install google-authenticator qrencode qrencode-libs
- Generar la llave de Google Authenticator:
1
google-authenticator -s ~/{ruta_ssh}/google_authenticator
Durante el proceso se te harán varias preguntas:
- ¿Deseas que los tokens sean basados en tiempo? (responde: y)
- ¿Quieres que se actualice el archivo de configuración? (responde: y)
- ¿Deshabilitar el uso múltiple del mismo token? (responde: y)
- ¿Aumentar la ventana de tiempo? (responde: n)
- ¿Habilitar rate-limiting? (responde: y)
Es recomendable realizarla solo una vez por usuario, aunque no hay problema si eliminas el archivo
google_authenticator
y lo vuelves a generar. Verifica que SELinux no esté bloqueando el acceso a la carpeta.ssh
. Realizar respaldos y ajustar SELinux:
- Restaurar el contexto de SELinux en la carpeta .ssh
1
restorecon -Rv ~/{ruta_ssh}/
- Respaldar el archivo PAM para sshd
1
cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
- Respaldar sshd_config
1
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- Restaurar el contexto de SELinux en la carpeta .ssh
Configurar PAM para Google Authenticator:
- Edita
/etc/pam.d/sshd
y reemplaza (o agrega) lo siguiente:1 2 3
#auth substack password-auth auth required pam_google_authenticator.so secret=/home/${USER}/{ruta_ssh}/google_authenticator nullok auth required pam_permit.so
El “secret” debe apuntar a la ubicación (absoluta o relativa) del archivo
google_authenticator
.- Edita
- Configurar SSH para usar Google Authenticator:
- Edita
/etc/ssh/sshd_config.d/50-redhat.conf
y ajusta:1
ChallengeResponseAuthentication yes
Luego, en
/etc/ssh/sshd_config
, cambia:1 2 3
PasswordAuthentication no KbdInteractiveAuthentication yes AuthenticationMethods publickey,password publickey,keyboard-interactive
- Edita
- Reinicia el servicio SSH y verifica errores:
1
sudo journalctl -u sshd
Prueba el acceso SSH con Google Authenticator:
Una vez autenticado, prueba la conexión al droplet 2:
1
ssh {usuario}@{ip_privada_droplet_2} -p {puerto_ssh_droplet_2} -i ~/{ruta_ssh}/nombre_archivo
También puedes configurar un archivo
config
en la carpeta.ssh
:1 2 3 4 5 6 7 8
Host * ServerAliveInterval 60 Host {nombre_host} HostName {ip_privada_droplet_2} Port {puerto_ssh_droplet_2} User {usuario} IdentityFile ~/{ruta_ssh}/nombre_archivo
Conclusiones
En este tutorial, hemos configurado SSH en dos servidores VPS de DigitalOcean, cambiando los puertos de escucha y siguiendo buenas prácticas de seguridad. También hemos creado usuarios, configurado la carpeta .ssh
y el acceso entre droplets, y configurado Google Authenticator para autenticación de dos factores del primer droplet, puedes integrar eso mismo al segundo si gustas.
Cualquier duda o comentario, agregarla en la sección de comentarios abajo de cada publicación.