Securizar un servidor
Vamos al lío sin rodeos :)
Nueva contraseña para root:
$ passwd
Si nos devuelve un error parecido a este:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "es_ES.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Ejecutamos:
$ export LANGUAGE=en_US.UTF-8 $ export LANG=en_US.UTF-8 $ export LC_ALL=en_US.UTF-8 $ locale-gen en_US.UTF-8 $ dpkg-reconfigure locales
El editor que viene por defecto es nano, yo prefiero vim, para cambiarlo:
$ update-alternatives --config editor
Añadimos un usuario con el que trabajaremos normalmente:
$ adduser deploy
Y algo bastante importante, darle permiso para hacer sudo:
$ visudo
Y añadimos:
deploy ALL=(ALL) ALL
Configuramos el acceso por ssh para el usuario:
$ mkdir /home/deploy/.ssh
Creamos el fichero authorized_keys y en este tendremos que guardar nuestra clave publica. Si no sabes que es eso, buscalo en google.
$ vim /home/deploy/.ssh/authorized_keys
Le damos los permisos oportunos:
$ chown -R deploy:deploy /home/deploy/.ssh $ chmod 700 /home/deploy/.ssh $ chmod 600 /home/deploy/.ssh/authorized_keys
Modificamos el fichero de configuración del ssh:
$ vim /etc/ssh/sshd_config
Yo aquí lo que cambio normalmente es:
LoginGraceTime 900 # Esto depende de cada uno PermitRootLogin no # Para evitar el login como root PasswordAuthentication no # Para evitar que puedan loguarse con contraseña, la idea es que se identifique mediante clave publica/privada AllowUsers deploy git # Hacer que solo se pueda loguear este usuario
Configuramos las ip tables y cargamos el siguiente fichero en /etc/iptables.up.rules
*filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You can modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows SSH connections # # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE # -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT
Le decimos a iptables que use las nuevas reglas:
$ /sbin/iptables-restore < /etc/iptables.up.rules
Ahora solo queda decirle que cargue las mismas reglas siempre que reinicie:
vim /etc/network/if-pre-up.d/iptables
Y pegamos:
#!/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules
Cerramos y le aplicamos los permisos para que se ejecute:
$ chmod +x /etc/network/if-pre-up.d/iptables
Reinicia el servidor ssh y no cierres las consola hasta que compruebes que puedes loguearte como el usuario ‘deploy’ o como le hayas llamado y hacer sudo. Si has podido loguearte con ‘deploy’ ya puedes cerrar la sesión con root.
$ /etc/init.d/ssh reload
Ahora logueados como ‘deploy’ vamos hacer algunas tareillas previas con el server para dejarlo a punto:
$ sudo aptitude update $ sudo aptitude safe-upgrade $ sudo aptitude install build-essential
Y con esto listo, ya tenemos una securización básica del servidor y listo para darle caña.
Algunos además preferirán cambiar el puerto por defecto del ssh, si quieres puedes hacerlo en /etc/ssh/sshd_config y no olvides reconfigurar las iptables para el nuevo puerto.