Securiser serveur dedie : Différence entre versions
(→Utilisation) |
(→RKHunter) |
||
| Ligne 494 : | Ligne 494 : | ||
=<font color="blue">RKHunter</font>= | =<font color="blue">RKHunter</font>= | ||
| + | |||
==<font color="blue">Installation RKHunter</font>== | ==<font color="blue">Installation RKHunter</font>== | ||
| + | |||
| + | apt-get install rkhunter -y | ||
| + | |||
| + | |||
| + | ==<font color="blue">Configuration RKHunter</font>== | ||
| + | |||
| + | Voici la configuration par défaut : | ||
| + | |||
| + | # Defaults for rkhunter automatic tasks | ||
| + | # sourced by /etc/cron.*/rkhunter and /etc/apt/apt.conf.d/90rkhunter | ||
| + | # | ||
| + | # This is a POSIX shell fragment | ||
| + | # | ||
| + | # Set this to yes to enable rkhunter daily runs | ||
| + | # (default: true) | ||
| + | CRON_DAILY_RUN="" | ||
| + | # Set this to yes to enable rkhunter weekly database updates | ||
| + | # (default: true) | ||
| + | CRON_DB_UPDATE="" | ||
| + | # Set this to yes to enable reports of weekly database updates | ||
| + | # (default: false) | ||
| + | DB_UPDATE_EMAIL="false" | ||
| + | # Set this to the email address where reports and run output should be sent | ||
| + | # (default: root) | ||
| + | REPORT_EMAIL="root" | ||
| + | # Set this to yes to enable automatic database updates | ||
| + | # (default: false) | ||
| + | APT_AUTOGEN="false" | ||
| + | # Nicenesses range from -20 (most favorable scheduling) to 19 (least favorable) | ||
| + | # (default: 0) | ||
| + | NICE="0" | ||
| + | # Should daily check be run when running on battery | ||
| + | # powermgmt-base is required to detect if running on battery or on AC power | ||
| + | # (default: false) | ||
| + | RUN_CHECK_ON_BATTERY="false" | ||
| + | |||
| + | Nous ne voyons pas l'utilité de la modifier, après libre à vous de l'adapter à vos besoins. | ||
Version du 2 février 2015 à 18:13
Introduction
C'est le casse tête principale des administrateurs ayant un serveur dédié, comment se protéger au mieux !
Nous allons vous montrer comment se protéger au mieux dans ce tutoriel.
Voici une liste des logiciels qui seront installés et configuré :
- Fail2Ban,
- Fail2Web,
- Logwatch,
- Portsentry,
- Port Knocking,
- RKHunter
Fail2Ban
Installation Fail2Ban
Si vous n'avez pas Fail2Ban d'installer, faites ceci ROOT :
apt-get install fail2ban -y
ou
aptitude install fail2ban -y
Configuration Fail2Ban
Pensez à faire des sauvegardes des fichiers que vous modifiez !
Nous utilisons l'éditeur nano donc pour sauvegarder une modification, faites CTRL + O puis Entrée.
cp /etc/fail2ban/jail.conf{,.defaut}
cp /etc/fail2ban/fail2ban.conf{,.defaut}
Le fichier fail2ban.conf ne sera pas expliquez dans ce tutoriel car nous n'en voyons pas l'utilité.
Maintenant, comment paramétrer toutes ces variables ?
- ignoreip = 127.0.0.1/8
Ajouter votre IP si vous avez la chance d'avoir une IP fixe, ceci aura pour effet de ne pas vous bannir en cas de mauvaise manipulation. - bantime = 600
Durée du bannissement en cas d'échec. - maxretry = 3
Nombre d'erreurs maximales pouvant être atteints avant d'être ban. - destemail = root@localhost
Adresse mail recevant les notifications des bans. - action = %(action_)s
devra être remplacé par action = %(action_mwl)s ou action = %(action_mw)s si la variable destmail est modifié.
Voici la configuration que j'utilise personnellement :
ignoreip = 127.0.0.1/8 bantime = 604800 (réglé à -1, le ban sera de façon permanent) findtime = 3600 maxretry = 3
Vous pouvez coupler la variable bantime à findtime (par défaut, fixé à 10 minutes) cependant faites attention avec l'utilisateur de cette valeur car elle peut nuire aux performances de votre serveur vu qu'elle analyse en approfondi les logs. La solution la plus adaptée est de choisir un grand 'findtime' et un très grand 'bantime' : 3600 et 86400, ou encore 86400 et 604800 comme le montre ma configuration ci-dessus.
Il faudra modifier le numéro du port SSH dans le jail si il n'écoute pas sur le port 22.
Rechercher le jail ssh et remplacer la ligne :
port = ssh
par
port = VOTRE_PORT
Regardons comment activer les différents services, prenons l'exemple du jail ssh-ddos :
Par défaut :
[ssh-ddos] enabled = false port = ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 6
Remplacer false par true pour activer le jail puis redémarrez Fail2Ban (service fail2ban restart ou invoke-rc.d fail2ban restart).
Liste des jails pouvant être activés :
- pam-generic
- xinetd-fail
- ssh-ddos
Si vous avez un serveur web sous apache, activer les jails le concernant.
Si vous avez un serveur FTP, activer le jail en conséquence.
Si vous avez un serveur web Nginx, vous pourrez ajouter ses jails dans /etc/fail2ban/jail.conf:
[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
bantime = 600 # 10 minutes
maxretry = 6
[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 600 # 10 minutes
maxretry = 6
[nginx-badbots]
enabled = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1
[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 6
bantime = 86400 # 1 day
[nginx-proxy]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-proxy
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime = 86400 # 1 day
Maintenant, nous allons déclarer les fichiers de configuration des nouveaux jails dans /etc/fail2ban/filter.d/ :
Créer les fichiers suivants en copiant le code donné ci-dessous :
nginx-proxy.conf
nano -w /etc/fail2ban/filter.d/nginx-proxy.conf
#Proxy filter /etc/fail2ban/filter.d/nginx-proxy.conf: # # Block IPs trying to use server as proxy. # # Matches e.g. # 192.168.1.1 - - "GET http://www.something.com/ # [Definition] failregex = ^<HOST> -.*GET http.* ignoreregex =
nginx-noscript.conf
nano -w /etc/fail2ban/filter.d/nginx-noscript.conf
# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf: # # Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts. # # Matches e.g. # 192.168.1.1 - - "GET /something.php # [Definition] failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi) ignoreregex =
nginx-auth.conf
nano -w /etc/fail2ban/filter.d/nginx-auth.conf
#
# Auth filter /etc/fail2ban/filter.d/nginx-auth.conf:
#
# Blocks IPs that fail to authenticate using basic authentication
#
[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
user .* was not found in.*client: <HOST>
user .* password mismatch.*client: <HOST>
ignoreregex =
nginx-badbots.conf
nano -w /etc/fail2ban/filter.d/nginx-badbots.conf
# Fail2Ban configuration file
# Author: Patrik 'Sikevux' Greco <sikevux@sikevux.se>
[Definition]
# Option: failregex
# Notes.: regex to match access attempts to setup.php
# Values: TEXT
failregex = ^<HOST> .*?"GET.*?\/setup\.php.*?" .*?
# Anti w00tw00t
^<HOST> .*?"GET .*w00tw00t.* 400
# try to access to directory
^<HOST> .*?"GET .*admin.* 403
^<HOST> .*?"GET .*admin.* 404
^<HOST> .*?"GET .*install.* 404
^<HOST> .*?"GET .*dbadmin.* 404
^<HOST> .*?"GET .*myadmin.* 404
^<HOST> .*?"GET .*MyAdmin.* 404
^<HOST> .*?"GET .*mysql.* 404
nginx-login.conf
nano -w /etc/fail2ban/filter.d/nginx-login.conf
# # Login filter /etc/fail2ban/filter.d/nginx-login.conf: # # Blocks IPs that fail to authenticate using web application's log in page # # Scan access log for HTTP 200 + POST /sessions => failed log in [Definition] failregex = ^<HOST> -.*POST /sessions HTTP/1\.." 200 ignoreregex =
On peut bloquer le scan de port, éditez le fichier /etc/fail2ban/jail.conf :
[portscan] enabled = true filter = portscan action = iptables[name=portscan] logpath = /var/log/messages maxretry = 3
On créer la configuration pour le jail portscan:
portscan.conf
nano -w /etc/fail2ban/filter.d/portscan.conf
# Option: failregex # Notes: Looks for attempts on ports not open in your firewall. Expects the # iptables logging utility to be used. Add the following to your iptables # config, as the last item before you DROP or REJECT: # -A <chain_name> -j LOG --log-prefix "PORT DENIED: " --log-level 5 --log-ip-options --log-tcp-options --log-tcp-sequence # This will place a notice in /var/log/messages about any attempt on a port that isn't open. [Definition] failregex = PORT DENIED: .* SRC=<HOST>
Les logs de Fail2Ban sont dans le répertoire /var/log/fail2ban.
Les commandes Fail2Ban
Les principales commandes à retenir :
- fail2ban-client start
- fail2ban-client stop
- fail2ban-client reload
- fail2ban-client status
Pour avoir une liste plus complète, exécuter fail2ban-client.
Débannir une IP avec Fail2Ban
Avant tout, vous devez vous assurez de l'adresse IP à débannir, faites :
iptables -t filter -L -n
Si toutefois, le résultat de la commande s'avère être trop longue dans le terminal, pensez à rediriger le résultat dans un fichier temp.
iptables -t filter -L -n > ipadeban.txt
La commande suivante permet de débannir une adresse IP cependant il faut respecter la syntaxe :
iptables -t filter -D NomChaine IDChaine
Sachez que la première IP présente aura pour ID = 1 puis incrémenter la valeur de 1 pour chaque adresse IP.
Exemple :
Pour effectuer un test, demander soit à un copain et assurez de pouvoir vous débannir
Pour ce tutoriel, je me suis fait bannir mon adresse IP pour que vous voyez comment ça se présentera :
iptables -t filter -L -n Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain fail2ban-ssh (1 references) target prot opt source destination DROP all -- MON_IP.rev.sfr.fr anywhere RETURN all -- anywhere anywhere
L'adresse IP sera inversé, si votre IP est 152.12.241.265, la ligne sera : DROP all -- 265.241.12.152.rev.sfr.fr anywhere, ceci n'est qu'un exemple, l'adresse IP utilisée a été écrite au hasard !
Il s'offre à vous deux méthodes pour révoquer le bannissement, la première consistera à redémarrer la machine en espérant que votre et/ou vous n'avez pas configurer pour que le bannissement reste actif.
La seconde, pouvoir se connecter en SSH avec une IP différente de la votre (3G/4G, un copain etc... Les possibilités ne manquent pas !)
iptables -t filter -D fail2ban-ssh 1
Vous devriez pouvoir vous connectez à votre machine !
Ban permanent avec Fail2Ban
Vous avez deux possibilités de bannir de façon permanente :
- dans /etc/fail2ban/jail.conf, définissez la valeur de bantime à -1.
- utiliser une configuration qui bannira définitivement les personnes mal intentionnés.
On créer le fichier /etc/fail2ban/action.d/iptables-repeater.conf :
nano -w /etc/fail2ban/action.d/iptables-repeater.conf
# Fail2ban configuration file
#
# Author: Phil Hagen <phil@identityvector.com>
#
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-REPEAT-<name>
iptables -A fail2ban-REPEAT-<name> -j RETURN
iptables -I INPUT -j fail2ban-REPEAT-<name>
# set up from the static file
cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-REPEAT-<name> 1 -s $IP -j DROP; done
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D INPUT -j fail2ban-REPEAT-<name>
iptables -F fail2ban-REPEAT-<name>
iptables -X fail2ban-REPEAT-<name>
# Option: actioncheck # Notes.: command executed once before each actionban command # Values: CMD # actioncheck = iptables -n -L INPUT | grep -q fail2ban-REPEAT-<name> # Option: actionban # Notes.: command executed when banning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: <ip> IP address # <failures> number of failures #
NOTE : Pensez à modifier root par votre adresse mail si vous recevez es notifications par mail.
On déclare notre nouvelle configuration dans /etc/fail2ban/jail.conf, copier/coller ceci :
[ssh-repeater]
enabled = true
filter = sshd
action = iptables-repeater[name=ssh]
sendmail-whois[name=SSH-repeater, dest=root, sender=root]
logpath = /var/log/secure
maxretry = 21
findtime = 31536000
bantime = 31536000
Redémarrer fail2ban puis vous pourrez appercevoir les IP bannies dans le fichier /etc/fail2ban/ip.blocklist.ssh.
Interface Web pour Fail2Ban
Logwatch
Présentation Logwatch
Logwatch analyse les logs et il est personnalisable. il analyse à travers les logs de votre système et crée un rapport en analysant les zones que vous spécifiez.
Installation Logwatch
Si vous n'avez pas Logwatch d'installer, faites ceci ROOT :
apt-get install logwatch -f
ou
aptitude install Logwatch -f
Utilisation
Générer un rapport dans le terminal, la valeur Output doit être définis sur stdout :
logwatch
Analyser le log messages et l'envoyer par mail.
logwatch –detail high –logfile messages –mailto votre_mail@domaine.fr
Pour avoir l'aide complète de logwatch :
logwatch --help
En anglais bien évidemment ^^
Configuration Logwatch
Faites ceci ROOT :
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/ nano /etc/logwatch/conf/logwatch.conf
puis modifiez les valeurs :
Si vous disposez d'un serveur mail qui envoie les mails, modifier la valeur MailTo = root
MailTo = votre_mail@dmaine.fr.
Modifiez également :
Output = mail (défaut: stdout) Detail = Med (ou High selon le niveau que vous désirez).
Sauvegarder les modifications (CTRL + O puis Entrée).
Nginx et Logwatch
Il est tout à fait possible d'analyser les logs de Nginx, suivez le guide....
Dans un premier temps, nous allons créer le fichier de configuration nginx_logwatch.conf dans le répertoire /etc/logwatch/conf/logfiles/.
Le dossier /usr/share/logwatch/default.conf/logfiles/ est aussi valable cependant logwatch vas trouver les informations en premier dans le répertoire donné ci-dessus.
nano /etc/logwatch/conf/logfiles/nginx_logwatch.conf
Copier/coller :
######################################################## # Define log file group for nginx ######################################################## # What actual file? Defaults to LogPath if not absolute path…. # If you want, you can uncomment LogFile = nginx/*error.log and LogFile = nginx/*error.log.1 for enable LogFile = nginx/*access.log LogFile = nginx/*access.log.1 #LogFile = nginx/*error.log #LogFile = nginx/*error.log.1 # If the archives are searched, here is one or more line # (optionally containing wildcards) that tell where they are… #If you use a “-” in naming add that as well -mgt Archive = nginx/*access.log* Archive = nginx/*error.log* # Expand the repeats (actually just removes them now) *ExpandRepeats # Keep only the lines in the proper date range… *ApplyhttpDate # vi: shiftwidth=3 tabstop=3 et
Sauvegarder le fichier.
Maintenant passons au second fichier (comme précédemment, le dossier /usr/share/logwatch/default.conf/services/ est aussi valable) :
cp /usr/share/logwatch/default.conf/services/http.conf /etc/logwatch/conf/services/nginx.conf
On édite le fichier :
nano /etc/logwatch/conf/logfiles/nginx.conf
Copier/coller :
########################################################################### # Configuration file for nginx filter ########################################################################### # Vous pouvez mettre le titre que vous souhaitez... Title = “Logwatch Nginx” # Which logfile group… LogFile = nginx
Sauvegarder le fichier.
Voici l'avant dernière étape qui sera très facile (comme précédemment, le dossier /usr/share/logwatch/scripts/services/ est aussi valable) :
cp /usr/share/logwatch/scripts/services/http /etc/logwatch/scripts/services/nginx
Pour terminer, on redémarre logwatch :
logwatch restart
Portsentry
Installation Portsentry
Port Knocking
Installation Port Knocking
RKHunter
Installation RKHunter
apt-get install rkhunter -y
Configuration RKHunter
Voici la configuration par défaut :
# Defaults for rkhunter automatic tasks # sourced by /etc/cron.*/rkhunter and /etc/apt/apt.conf.d/90rkhunter # # This is a POSIX shell fragment # # Set this to yes to enable rkhunter daily runs # (default: true) CRON_DAILY_RUN="" # Set this to yes to enable rkhunter weekly database updates # (default: true) CRON_DB_UPDATE="" # Set this to yes to enable reports of weekly database updates # (default: false) DB_UPDATE_EMAIL="false" # Set this to the email address where reports and run output should be sent # (default: root) REPORT_EMAIL="root" # Set this to yes to enable automatic database updates # (default: false) APT_AUTOGEN="false" # Nicenesses range from -20 (most favorable scheduling) to 19 (least favorable) # (default: 0) NICE="0" # Should daily check be run when running on battery # powermgmt-base is required to detect if running on battery or on AC power # (default: false) RUN_CHECK_ON_BATTERY="false"
Nous ne voyons pas l'utilité de la modifier, après libre à vous de l'adapter à vos besoins.