Una lista de los pasos que hago tras la instalación base de un servidor Linux, sea en local (raramente) o remoto (habitualmente). Esta lista es una generalización: no todos los pasos se aplican a todos los servidores y hay servidores que requieren otros pasos. Pero me sirve como guia de trabajo.

Aunque se trata de un post de 2016 lo sigo revisando y actualizando de vez en cuando. Última actualización: 26/3/2019

Lamento el poco detalle, es una lista de uso interno pero pese a ello he pensado que puede ser util en cierta medida y por eso lo publico.

Checklist de instalación

  • revisión fecha/hora/timezone: dpkg-reconfigure tzdata
  • actualización inicial de paquetes: apt update, apt upgrade
  • instalación de vim: apt install vim
  • configuración vim: vim /etc/vim/vimrc
  • ajuste del nombre del equipo: vim /etc/hostname
  • configuración apt: vim /etc/apt/sources.list
  • revisión del kernel instalado e instalación del kernel del paquete oficial de Debian
  • instalación generador de entropia: apt install haveged
  • securización SSH con ssh-audit
  • desactivación de validación con usuario y contraseña para SSH, sólo certificados
  • instalación fail2ban: apt install fail2ban
  • instalación firewall: apt install iptables-persistent
  • configuración firewall (ver anexo)
  • instalación msmtp-mta: apt install msmtp-mta
  • instalación de logcheck, revisar fichero de configuración principal
  • instalación de cron-apt (ver anexo)
  • instalación y configuración de actualizaciones de seguridad automáticas (ver anexo)

Anexo: cortafuegos

Utilizo netfilter-persistence para la gestión de la configuración del cortafuegos. Ya que también utilizo fail2ban para guardar los cambios hago una pequeña variación para eliminar las reglas de fail2ban que son dinàmicas.

sudo iptables-save | grep -v fail2ban | sudo tee /etc/iptables/rules.v4

sudo ip6tables-save | grep -v fail2ban | sudo tee /etc/iptables/rules.v4

La configuración inicial de base es la siguiente:

/etc/iptables/rules.v4

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:connection-tracking - [0:0]
:whitelist - [0:0]
-A INPUT -i lo -m comment --comment "permeto trafic loopback" -j ACCEPT
-A INPUT -j connection-tracking
-A INPUT -j whitelist
-A INPUT -p tcp -m tcp --dport 22 -m comment --comment "servei SSH" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m comment --comment "servei HTTP" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m comment --comment "servei HTTPS" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 113 -m comment --comment "Reject incoming AUTH/ident requests with RST" -j REJECT --reject-with tcp-reset
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 5/sec -m comment --comment "limitador de ping per DoS" -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m comment --comment "limitador de ping per DoS" -j DROP
-A connection-tracking -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A connection-tracking -m conntrack --ctstate INVALID -j DROP
-A connection-tracking -m conntrack --ctstate NEW -j RETURN
-A connection-tracking -j LOG --log-prefix "CONNSTATE BARF: " --log-level 2
-A connection-tracking -j DROP
-A whitelist -s 1.2.3.0/24 -j ACCEPT
-A whitelist -s 5.6.7.8/32 -j ACCEPT
COMMIT

/etc/iptables/rules.v6

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:connection-tracking - [0:0]
-A INPUT -i lo -m comment --comment "permeto trafic loopback" -j ACCEPT
-A INPUT -p ipv6-icmp -m comment --comment "permeto trafic ICMPv6" -j ACCEPT
-A INPUT -j connection-tracking
-A INPUT -p tcp -m tcp --dport 80 -m comment --comment "servei HTTP" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m comment --comment "servei HTTPS" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 113 -m comment --comment "Reject incoming AUTH/ident requests with RST" -j REJECT --reject-with tcp-reset
-A connection-tracking -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A connection-tracking -m conntrack --ctstate INVALID -j DROP
-A connection-tracking -m conntrack --ctstate NEW -j RETURN
-A connection-tracking -j LOG --log-prefix "CONNSTATE BARF: " --log-level 2
-A connection-tracking -j DROP
COMMIT

Anexo: cron-apt

Añadir algunas opciones al fichero de configuración principal: /etc/cron-apt/config

MAILTO="sargue@gmail.com"
MAILON="upgrade"
SYSLOGON="error"

Anexo: actualizaciones automáticas

Opcionalmente configurar el servicio de actualizaciones de seguridad automáticas de Debian.

Algunas de las opciones de configuración interesantes.

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed. E.g. "user@example.com"
Unattended-Upgrade::Mail "webmaster@sargue.net";
Unattended-Upgrade::Sender "vps42@mg.sargue.net";

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";

// Automatically reboot even if there are users currently logged in.
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";