Memo

Configurar un VPS

Contexto

No soy profesor, estas son mis propias notas, las de un estudiante insignificante, Aaron (Iso) Pescasio.

Para practicar con Linux, decidí crear este script que preparará y asegurará un VPS completamente nuevo (alquilado de Netcup).

Gracias a las instantáneas, pude probar la ejecución del script múltiples veces y revertir a un VPS limpio cada vez, lo que me permitió realizar pruebas de forma segura.

Step-by-step Script Breakdown

Total script estimation: ~63s.

Inicialización del servidor

Conectarse al VPS vía SSH como root, luego actualizar la lista de paquetes y los paquetes para asegurar un entorno limpio y actualizado (~3 segundos).

Instalación de herramientas esenciales

Instalar paquetes esenciales como ufw para el firewall, fail2ban para protección contra ataques, y nginx para alojar un sitio web (~15 segundos).

Asegurar la cuenta root

Cambiar la contraseña de la cuenta root para mejorar la seguridad (~5 segundos).

Configuración de zona horaria

Actualizar la zona horaria a París para mejor legibilidad de logs y consistencia de tiempo (~2 segundos).

Personalización del terminal

Descargar un .bashrc personalizado incluyendo alias y marcas de tiempo de comandos en el historial para un entorno más ergonómico (~5 segundos).

Reforzar la seguridad SSH

Cambiar el puerto SSH por defecto a un puerto no estándar (49152–65535), deshabilitar el login root, y configurar desconexión automática después de 120 segundos de inactividad (~5 segundos).

Crear una cuenta de usuario personal

Crear una cuenta no-root con privilegios sudo, agregarla a la lista blanca SSH para restringir el acceso solo a usuarios autorizados (~5 segundos).

Configuración del firewall

Permitir el nuevo puerto SSH y tráfico web para Nginx, luego habilitar el firewall ufw para bloquear todo lo demás (~5 segundos).

Corrección para bug de NGINX

Agregar una configuración especial para evitar un error común al iniciar NGINX en algunos VPS (~5 segundos).

Configuración de Fail2ban para SSH

Crear el archivo de log /var/log/auth_fail2ban.log si es necesario, luego configurar una cárcel específica para SSH para proteger contra ataques de fuerza bruta (~10 segundos).

Cambiar a la cuenta de usuario

Iniciar sesión con la nueva cuenta de usuario, marcando el final de la configuración root y el inicio de la gestión segura del VPS (~3 segundos).

Bash Script

config-vps.sh
### © Aaron (Iso) Pescasio / www.apescasio.fr ###

### 1. Script para preparar y asegurar un VPS ###

### Prerrequisitos: -VPS Linux, -conexión SSH, -acceso 'root' ###

### Después de conectar al VPS con SSH, inicio sesión como 'root': 'sudo su' ###

### Actualizar la lista de paquetes ###

apt update

### Actualizar los paquetes ###

apt upgrade -y

### Instalar todos los paquetes necesarios para asegurar mi VPS y alojar mi sitio web ###

apt install -y wget ufw fail2ban nginx ### (fail2ban, mantengo la configuración por defecto) ###

### Crear el archivo de log de fail2ban ###

touch /var/log/auth_fail2ban.log

### Crear una cárcel específica para SSH ###

cat <<EOL > /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth_fail2ban.log
maxretry = 5
bantime = 3600
EOL

### Reiniciar el servicio fail2ban ###

systemctl enable fail2ban && systemctl restart fail2ban

### Cambiar la contraseña para la cuenta 'root' ###

echo "Ingrese una nueva contraseña para la cuenta 'root'"
passwd

### Actualizar la zona horaria del VPS ###

timedatectl set-timezone Europe/Paris

### Actualizar mi .bashrc (lo que agregué: mis atajos, cambios al comando history para mostrar la fecha junto a los comandos ejecutados) ###

#cd ~
#mv /etc/bash.bashrc /etc/bash.bashrc.backup
#wget -O /etc/bash.bashrc https://raw.githubusercontent.com/ApecioU/configfiles/main/bash.bashrc
#source /etc/bash.bashrc

### Cambiar el puerto de escucha SSH por defecto ###

while true; do
    read -p "Ingrese un número entre 49152 y 65535: " port
    if [[ "$port" -ge 49152 && "$port" -le 65535 ]]; then ### Para seguridad adicional, use un número entre 49152 y 65535. ###
        echo "Puerto válido: $port"
        break
    else
        echo "Puerto inválido. Por favor ingrese un número entre 49152 y 65535."
    fi
done

sed -i "s/^#Port 22/Port $port/" /etc/ssh/sshd_config

### Note que necesitará especificar el nuevo puerto para cada conexión SSH a su servidor, ej.: ###
### ssh usuario@VPS_IPv4 -p NuevoPuerto ###

### Deshabilitar el login 'root' en la configuración SSH ###

sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config

### Desconectar al usuario después de 120s de inactividad ###

sed -i 's/^#ClientAliveInterval 0/ClientAliveInterval 120/' /etc/ssh/sshd_config

### Definir una variable para crear una cuenta personal ###

read -p "Ingrese un nombre de usuario para crear una cuenta personal: " perso

### Modificar la configuración SSH para especificar los nombres de usuario permitidos para usar SSH; todos los demás usuarios son bloqueados ###

echo "AllowUsers $perso" | sudo tee -a /etc/ssh/sshd_config

### Reiniciar el servicio para aplicar cambios ###

systemctl restart sshd

### Antes de habilitar el firewall ufw, permitir conexiones SSH en el puerto seleccionado ###

ufw allow $port/tcp && ufw allow 'Nginx Full'  ### Este comando permite conexiones SSH y HTTP+S en los puertos seleccionados; todos los demás puertos son bloqueados :) ###

### Corregir el problema 'Invalid argument' con NGINX en la primera instalación ###

mkdir /etc/systemd/system/nginx.service.d
printf "[Service]\nExecStartPost=/bin/sleep 0.1\n" > /etc/systemd/system/nginx.service.d/override.conf
systemctl daemon-reload
systemctl restart nginx

### Ahora podemos habilitar el firewall después de permitir el nuevo puerto SSH ###

ufw enable

### Crear una cuenta personal y agregarla al grupo 'sudo' ###

sudo useradd -m -s /bin/bash -G sudo $perso && echo "Ingrese una contraseña para $perso" && passwd $perso && sudo usermod -c "$perso" $perso

### Iniciar sesión con la cuenta personal ###

su $perso

Última actualización: