Cuidar el Software Podemos ver todos los programas instalados usando:
# dpkg --list
Y obtener más información con:
# dpkg --info packageName
Por ultimo lo eliminamos si no es necesario.
# apt-get remove packageName
Tener todo el sofware actualizado:
# apt-get update && apt-get upgrade
Para actualiza de forma automática el sistema podemos usar "unattended-upgrades"
# apt-get install unattended-upgrades
Existen varios ficheros de configuración para indicar distintas acciones, por ejemplo para que el sistema te envíe un mail informando de un "Upgrade" editamos el parametro Unattended-Upgrade de:
# nano /etc/apt/apt.conf.d/50unattended-upgrades
Para poder activar este programa deberemos editar el fichero APT:
# nano /etc/apt/apt.conf.d/10periodic
APT::Periodic::Unattended-Upgrade "1";
Instalar Software que nos defienda
Bloquea las IPs con intentos de acceso fallidos
# apt-get install fail2ban
El fichero de configuración de Fail2Ban se encuentra en:
# nano /etc/fail2ban/fail2ban.conf
# nano /etc/fail2ban/jail.conf
Detecta rootkits y cambios del sistema
# apt-get install tripwire
Para recibir los reportes en por correo.
# nano /etc/tripwire/twpol.txt
MAIL_TO = "user@host";
Y Añadimos "emailto = $(MAIL_TO)" en cada política.
# twadmin --create-polfile /etc/tripwire/twpol.txt
# tripwire --init # tripwire --check
# apt-get install rkhunter unhide mailutils
# nano /etc/rkhunter.conf
SSH_CONFIG_DIR=/etc/ssh
MAIL-ON-WARNING="correo@mail"
DISABLE_TESTS=""
PKGMGR=DPKG
ALLOWHIDDENDIR="/dev/.udev"
ALLOWHIDDENFILE="/dev/.initramfs"
MAIL_CMD=sendmail -s "[rkhunter] Warnings found for ${HOST_NAME}" -A /var/log/rkhunter.log
# rkhunter --propupd
# rkhunter --check
Para no tener problemas de falsos positivos tras actualizar deberemos hacer:
# rkhunter --propupd
# tripwire --init --local-passphrase
Monitoriza los logs
# apt-get install logwatch
# nano /etc/logwatch/conf/logwatch.conf
Output = mail
Format = html
MailTo = you@mail
MailFrom = correo@mail.example
Detail = High
Detectar ataques a puestos UDP y TCP mediante: # apt-get install portsentry
Para configurar correctamente portsentry y que no nos bloque debemos añadir el puerto 22 a:
# nano /etc/portsentry/portsentry.conf
#FTP,SSH,Telnet,SMTP,DNS,Time,Whois,Mail,Http,POP3,SQL,NTP,IMAP,SMB,ModBus,SHELL,SMTP,SOCKS,OpenVPN,IPsec,Cpanel,MySQL,PostgreSQL,VNC,
TCP_PORTS="20,21,22,23,25,37,43,56,57,80,8080,8000,8443,443,110,118,123,143,445,502,514,587,1080,1194,1293,2082,2083,2095,2096,3306,5432,5500,5800,5900"
#WoL
UDP_PORTS="9,20,23,37,56,118,123,502,1194,1293,3306,5432"
ADVANCED_EXCLUDE_TCP="22,80,113,139"
Si tenemos Apache:
# apt-get install libapache2-modsecurity
# a2enmod security2# cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
# nano +7 /etc/apache2/conf-enabled/security.conf
SecRuleEngine On
# apt-get install libapache2-mod-spamhaus
# a2enmod spamhaus # a2enmod headers
# a2enconf security
# nano +26 /etc/apache2/conf-enabled/security.conf
ServerTokens Prod
#ServerTokens OS ServerSignature Off
#ServerSignature On
Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Siendo más estrictos
Usando IpTables podemos hacer más seguro nuestro server restringiendo los puestos que pueden recibir y enviar datos.
Borramos la configuración anterior
# iptables -F
Permitimos las conexiones existentes
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitimos la conexiones por el puerto 22
# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
Permitimos las conexiones locales
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
Cambiamos las políticas por defecto
# iptables -P FORWARD DROP
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
!!Tened en cuenta que si queremos que se acceda a los puertos de PortEntry, hay que abrirlos
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
Para tener conectividad hay que permitir el trafico DNS y la salida de trafico http/s
# iptables -A OUTPUT -p TCP --dport 53 -j ACCEPT
# iptables -A OUTPUT -p UDP --dport 53 -j ACCEPT
# iptables -A INPUT -p TCP --sport 53 -j ACCEPT # iptables -A INPUT -p UDP --sport 53 -j ACCEPT# iptables -A OUTPUT -p TCP --dport 80 -j ACCEPT
# iptables -A OUTPUT -p TCP --dport 443 -j ACCEPT
Mostramos el los logs las conexiones rechazadas
# iptables -A INPUT -j LOG --log-level debug --log-prefix "Drop INPUT:"
# iptables -A OUTPUT -j LOG --log-level debug --log-prefix "Drop OUTPUT: " --log-uid
Debemos denegar el acceso a "root", debe existir al menos otro usuario:
# nano +28 /etc/ssh/sshd_config
PermitRootLogin no
# useradd NuevoUsuario
# passwd NuevoUsuario
# mkdir /home/NuevoUsuario
Para poder evitar ataques de diccionario y fuerza bruta contra ssh, podemos configurarlo para que realice el login usando un certificado, para ello guardamos la clave publica del usuario en:
# nano /home/NuevoUsuario/.ssh/authorized_keys
# chmod 400 /home/NuevoUsuario/.ssh/authorized_keys
# chown NuevoUsuario:NuevoUsuario /home/NuevoUsuario -R
# nano /etc/ssh/sshd_config
PasswordAuthentication no
# service ssh restart
Referencias: https://openwebinars.net/10-minutos-para-securizar-tu-servidor/
https://www.digitalocean.com/community/tutorials/how-to-use-tripwire-to-detect-server-intrusions-on-an-ubuntu-vps