Outils pour utilisateurs

Outils du site


linux:securite_linux

Sécurité Linux

Sécurité globale

Supprimer tout ce qui ne sert pas ou au moins désactiver.

  • Supprimer les services inutiles dans /etc/inetd.conf.
  • Désactivez ou supprimer les droits des fichiers qui ont un SUID/SGID root:
>$find / -user root -a \( -perm -4000 -o -perm -2000 \) -print 
>$chmod a-s nomduprogramme  #pour désactiver les bits "s"
  • Remplacer par SSH les programmes “remote commands” (rsh, rlogin, rcp)
  • Restreindre les droits au maximum:
>$chmod -R 700 /etc/rc.d/init.d

FireWall

Netfilter & Iptables

Installation
$urpmi iptables
 
$chmod +x /etc/init.d/firewall 
$update-rc.d firewall defaults 
Liste des règles actuelles
$iptables -L
Exemple de script

Fichier /etc/init.d/firewall

#!/bin/bash
/etc/init.d/fail2ban stop
echo "[Setting firewall rules...]"
 
 
# Configuration:
PORTSSH=22
IPSERVER=XXX.XXX.XXX.XXX
 
# config de base
# Vider les tables actuelles
        iptables -t filter -F
        iptables -t filter -X
echo "[Vidage : OK]"
 
# Autoriser SSH
        iptables -t filter -A INPUT -p tcp --dport $PORTSSH -j ACCEPT
echo "[Autoriser SSH : OK]"
 
# Ne pas casser les connexions etablies
        iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo "[Ne pas casser les connexions établies : OK]"
 
# Interdire toute connexion entrante
        iptables -t filter -P INPUT DROP
        iptables -t filter -P FORWARD DROP
echo "[Interdire toute connexion entrante : OK]"
 
# Interdire toute connexion sortante
        iptables -t filter -P OUTPUT DROP
echo "[Interdire toute connexion sortante : OK]"
 
# Autoriser les requetes DNS, FTP, HTTP, NTP (pour les mises a jour)
        iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
        iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
        iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
        iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "[Autoriser les requetes DNS, FTP, HTTP, NTP : OK]"
 
# Autoriser loopback
        iptables -t filter -A INPUT -i lo -j ACCEPT
        iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "[Autoriser loopback : OK]"
 
# Autoriser ping
        iptables -t filter -A INPUT -p icmp -j ACCEPT
        iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "[Autoriser ping : OK]"
 
# Gestion des connexions entrantes autorisées
#
# iptables -t filter -A INPUT -p <tcp|udp> --dport <port> -j ACCEPT
 
# HTTP
        iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
        iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
echo "[Autoriser serveur Apache : OK]"
 
# Flash Media Server 2
#iptables -t filter -A INPUT -p tcp --dport 1935 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 1111 -j ACCEPT
#echo "[Autoriser serveur Flash Media Server 2 : OK]"
 
# FTP
modprobe ip_conntrack_ftp
        iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
        iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
        iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "[Autoriser serveur FTP : OK]"
 
# Mail
        iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
        iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
        iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
        iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
        iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
        iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo "[Autoriser serveur Mail : OK]"
 
# Steamcast
        iptables -t filter -A INPUT -p tcp --dport 8000 -j ACCEPT
        #iptables -t filter -A INPUT -p tcp --dport 8001 -j ACCEPT
echo "[Autoriser serveur ShoutCast autonome : OK]"
 
# Syn-Flood
        if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
            echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        fi
 
        iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
        iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
echo "[Limiter le Syn-Flood : OK]"
 
# Spoofing
        if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then
                 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
                 echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
                 echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter
                 echo 1 > /proc/sys/net/ipv4/conf/lo/rp_filter
        fi
 
        iptables -N SPOOFED
        iptables -A SPOOFED -s 127.0.0.0/8 -j DROP
        iptables -A SPOOFED -s 169.254.0.0/12 -j DROP
        iptables -A SPOOFED -s 172.16.0.0/12 -j DROP
        iptables -A SPOOFED -s 192.168.0.0/16 -j DROP
        iptables -A SPOOFED -s 10.0.0.0/8 -j DROP
 
echo "[Bloquer le Spoofing : OK]"
 
# Parametrage au niveau du noyau
if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] ; then
            echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
fi
if [ -e /proc/sys/net/ipv4/conf/all/accept_redirects ] ; then
            echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
fi
if [ -e /proc/sys/net/ipv4/conf/all/send_redirects ] ; then
            echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
fi
 
# openvpn config
	echo 1 > /proc/sys/net/ipv4/ip_forward
	iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
 
 
# WootWoot
	iptables -I INPUT -d $IPSERVER -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.' -j DROP
 
 
/etc/init.d/fail2ban start
echo Firewall mis a jour avec succes !

Le nombre de paquets rejetés par iptable:

$ iptables -L INPUT -nvx

Attaques via NFS

Je rappelle que NFS est un protocole qui permet de partager un ensemble de fichiers sur un réseau. On peut le retrouver couplé à NIS pour l'authentification

La particularité est que le client fait toujours confiance au serveur,un compte “root” sur une machine cliente peut très bien compromettre le serveur et inversement

Protection
  • Utiliser la commande mount avec l'option -nosuid avec les clients, ce qui permet d'empêcher la modification ou l'utilisation des programmes setuid sur un systéme de fichier NFS.
  • Utilisez l'option root-squash dans le fichier /etc/exports. pour empêcher un client root de devenir root sur le système de fichiers NFS stockés sur le serveur.
  • Protéger l'accès à votre serveur NFS en filtrant à partir de l' adresse IP, les différents clients.
  • Vérifié que les services RPC ne sont pas actifs sur le serveur depuis internet:
[root@nowhere /root]# rpcinfo -p machinecible

S'il y a des services disponible, configurer le firewall ou désactiver ce service

  • Ne pas autoriser de connexion extérieur aux SMTP, et fermer le port 25,

sinon configurer le SMTP pour empêcher le relayage

  • XWINDOW est en écoute sur le port 6000

pour fermer son accès:

[root@nowhere /root]# xhost -

Système de prévention d'intrusion

IPS ⇐⇒ Intrusion Prévention System

Détection d'intrusion

IDS ⇐⇒ Intrusion Detection System

Snort

Snort

Snort Snarf

Acid

Tests de protection

Nessus

Les rootkits

Chkrootkit

$aptitude install chkrootkit
#analyse de votre système
$chkrootkit

Rkhunter

$aptitude install rkhunter
# Mise à jour de Rootkit Hunter :
$ rkhunter --update
# Analyse de votre système
$rkhunter -c --sk

Faux positif

Warning: The file properties have changed:
        File: /usr/bin/dpkg

Pour comparer les valeurs md5sum avec ceux déclarés dans /var/lib/dpkg/info

creer un script avec le nom de fichier comme parametre:

#!/bin/sh
FIC=`echo $1 | sed -e 's|^/||'`
MD=`dpkg -S $FIC  | grep -E " /$FIC\$" | head -n 1 |sed -e 's|^\(.*\): .*|grep -E \" '$FIC'$\" /var/lib/dpkg/info/\1.md5sums|' | sh | cut -d" " -f1`
MDRE=`md5sum /$FIC | cut -d" " -f1`
echo $MD
echo $MDRE
if [ $MDRE = $MD ] ; then
echo $FIC OK
else
echo $FIC Compromis
fi
./verifMD5.sh /usr/bin/dpkg
e48554cfc042607d45dfb56ad2ec22f2
e48554cfc042607d45dfb56ad2ec22f2
usr/bin/dpkg OK

Source forum.debian-fr.org

Monitoring du serveur

Logwatch

Logwatch est par un démon pouvant analyser et résumer les logs générés par les autres services durant la journée pour en détecter d'éventuelles anomalies ou en tirer des statistiques. Il permet d'envoyer un e-mail récapitulatif quotidien à l'administrateur.

Instalation

 $ aptitude install logwatch 

Configuration

Pour la configuration generique : /usr/share/logwatch/default.conf

Creer le fichier /etc/logwatch/conf/logwatch.conf

Ajouter la ligne suivante:

Detail = High
Service = All

Test du parametrage precedent :

$ logwatch --detail high --service all --range today

customisation du cron:

$ nano /etc/cron.daily/00logwatch
 
 
 
#!/bin/bash
 
#Check if removed-but-not-purged
test -x /usr/share/logwatch/scripts/logwatch.pl || exit 0
 
#execute
/usr/sbin/logwatch --mailto root --detail high --service all --range today

Monit

Monit est un utilitaire de surveillance système qui permet à un administrateur de contrôler facilement les fichiers, les processus, les répertoires, ou des dispositifs sur votre système Debian. Il peut également être utilisé pour la commande automatique d'entretien et de réparation - notamment par l'exécution des commandes lorsque des erreurs surviennent.

Instalation

 $ aptitude install monit 

Configuration

Editer le fichier /etc/monit/monitrc pour rajouter des tests. Voir les details sur le site mmonit.com

# Config
set daemon 620
set logfile syslog facility log_daemon
set mailserver localhost, smtp.***.com
set mail-format {
    from: monit@$HOST
    subject: $HOST - Monit : $EVENT $SERVICE
    }
set alert monitoring @ gwadanina.net
set httpd port 808080 and
    allow user:pass
 
# System
check system ***.com
    if loadavg (1min) > 4 then alert
    if loadavg (5min) > 2 then alert
    if memory usage > 75% then alert
    if cpu usage (user) > 70% then alert
    if cpu usage (system) > 30% then alert
    if cpu usage (wait) > 20% then alert
 
# Apache 2
check process httpd with pidfile /var/run/apache2.pid
group apache
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if failed host 127.0.0.1 port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
if cpu is greater than 85% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if children > 250 then restart
if totalmem > 500 MB for 5 cycles then restart
if loadavg(5min) greater than 10 for 8 cycles then stop
 
# check file httpd.conf
#     with path /usr/local/apache/conf/httpd.conf
#     # Reload apache if the httpd.conf file was changed
#     if changed checksum
#        then exec "/usr/local/apache/bin/apachectl graceful"
 
 
# MySQL
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
group database
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout
 
 
# SSH
check process sshd with pidfile /var/run/sshd.pid
group ssh
start program "/etc/init.d/ssh start"
stop program "/etc/init.d/ssh stop"
if failed host 127.0.0.1 port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
 
 
# Postfix
check process postfix with pidfile /var/spool/postfix/pid/master.pid
group mail
start program = "/etc/init.d/postfix start"
stop  program = "/etc/init.d/postfix stop"
if failed port 25 protocol smtp then restart
if 5 restarts within 5 cycles then timeout
 
 
# FTP
check process proftpd with pidfile /var/run/proftpd.pid
group ftp
start program = "/etc/init.d/proftpd start"
stop program  = "/etc/init.d/proftpd stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout
 
 
# Disk
check device sda1 with path /dev/sda1
if space usage > 85% then alert
group system
 
 
check process clamav with pidfile /var/run/clamav/clamd.pid
    group virus
    start program = "/etc/init.d/clamav-daemon start"
    stop  program = "/etc/init.d/clamav-daemon stop"
    if failed host localhost port 3310 then restart
    if 5 restarts within 5 cycles then timeout
 
 
check process cron with pidfile /var/run/crond.pid
    group system
    start program = "/etc/init.d/cron start"
    stop  program = "/etc/init.d/cron stop"
    if 5 restarts within 5 cycles then timeout
 
 
check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid
    start program = "/etc/init.d/fail2ban start"
    stop  program = "/etc/init.d/fail2ban stop"
    if failed unixsocket /var/run/fail2ban/fail2ban.sock then restart
    if 5 restarts within 5 cycles then timeout
 
 
#Check host for which services up/down on particular port.
check host test.com with address 127.0.0.1
    if failed port 80 protocol http then alert

Pour lancer en tant que service, éditer le fichier /etc/default/monit et mettre la variable startup à 1 puis relancer le service /etc/init.d/monit restart

Logcheck

Recherche de violations de sécurité/messages anormaux

Syslog

Analyse de la machine

Usage de la crontab

Crontab

Pour avoir la liste des taches programmées pour le user courant crontab -l

Pour éditer la liste des taches programmées crontab -e

Chkroot

PGP

Affichage de connexion

  • Nombre d'échec de connexion précédent
  • Date et heure de denière connexion
  • Nombre d'échec pour s'autentifier (total)

Connexion

  • jsp ⇒ form autocomplète=“off”
  • Temps d'attente croissant entre chaque échec. Mais reset du compteur apres 24 heures, et max attente > une heure sinon attaque par deni de service.

Mot de passe

  • Limitation dans le temps des mots de passe par defaut pour la première utilisation.
  • Taille min 8 char, debut et fin non en chiffre, pas trois charactère consecutif, pas nom et prenom.
  • Au minimun, il faut: un char non alphanumérique, une majuscule, un minuscule, un chiffre et un symbole.
  • Durée de vie, un à deux mois max.
  • Historique crypté de 5 dernier mots de passe, afin d'éviter leurs réutilisations.

Attaques

Nmap

Audit

[root@nowhere /tmp]# nmap -sS -P0 -A -v 192.168.1.1

Difficulté pour IP spoofing

Donne un indication sur la difficulté qu'aura le pirate à procéder à une attaque par IP spoofing contre votre serveur.

[root@nowhere /tmp]# nmap -O -v 192.168.1.1

Plus le chifre Difficulty est élevé, moins une attaque sera facile!

Maintenance du systeme

Mettre le script dans cron et gerer les certificats pour ssh entre les serveurs:

$ nano /etc/maintenance-service.sh
 
 
#!/bin/bash                                                                                                                                 
# Script de backup quotidien pour un serveur Debian                                                                                            
# backup du serveur MySQL databases (Dump toutes les bases et les compresses en tar.gz                                                      
# backup de la liste des packages installes                                                                                                 
# backup sur un serveur distant                                                                                                             
#                                                                                                                                           
# Written by Fabwice                                                                                                                        
# http://gwadanina.net                                                                                                                      
 
# ----------------------------------------------------------- #                                                                             
#       Gestion des parametres de configuration               #                                                                             
# ----------------------------------------------------------- #                                                                             
 
# --------- Parametres du systeme                                                                                                           
MYSQL="$(which mysql)"                                                                                                                      
MYSQLDUMP="$(which mysqldump)"                                                                                                              
GZIP="$(which gzip)"                                                                                                                        
MKDIR="$(which mkdir)"                                                                                                                      
MYSQLCHECK="$(which mysqlcheck)"                                                                                                            
RSYNC="$(which rsync)"                                                                                                                      
SSH="$(which ssh)"                                                                                                                          
MAIL="$(which mail)"                                                                                                                        
TAR="$(which tar)"                                                                                                                          
TOUCH="$(which touch)"                                                                                                                      
RM="$(which rm)"                                                                                                                            
TRAP="$(which trap)"                                                                                                                        
FIND="$(which find)"                                                                                                                        
MD5SUM="$(which md5sum)"                                                                                                                    
HOSTNAME="$(hostname)"                                                                                                                      
TOUCH_REMOTE="/bin/touch"                                                                                                                   
DPKG="$(which dpkg)"                                                                                                                        
 
#--------- Date du jour                                                                                                                     
DATE_NOW="$(date +%Y-%m-%d)"                                                                                                                
ANNEE_MOIS_NOW="$(date +%Y-%m)"                                                                                                             
 
#--------- Configuration du serveur local                                                                                                   
LOCAL_USER="backup"                                                                                                                        
LOCAL_GROUP="backup"                                                                                                                       
BACKUP_REPO="/home/$LOCAL_USER/BACKUP"                                                                                                      
BACKUP_REPO_TMP="/home/$LOCAL_USER/tmp"                                                                                                     
CURRENT_WORKING_REPO="$BACKUP_REPO/$ANNEE_MOIS_NOW/$DATE_NOW"                                                                               
CURRENT_WORKING_REPO_SQL="$CURRENT_WORKING_REPO/mysql"                                                                                      
TMP_BACKUP_REPO="$BACKUP_REPO_TMP/backup_etc_modif_$DATE_NOW";                                                                              
LOCKFILE="$CURRENT_WORKING_REPO/.lockfile"                                                                                                  
 
# fichier de configuration local                                                                                                            
CUSTOM_CONFIG="/etc/maintenance-service.cfg"                                                                                                
 
# --------- Configuration du serveur de backup distant                                                                                      
REMOTE_USER="backup"                                                                                                               
REMOTE_HOST="....hd.free.fr"                                                                                                            
REMOTE_PORT=22                                                                                                                            
REMOTE_PATH="/home/$REMOTE_USER/backupdir/backup"                                                                                           
REMOTE_PATH_FIN_DE_TRANSFERT="$REMOTE_PATH/BACKUP/$ANNEE_MOIS_NOW/$DATE_NOW/FIN_DE_TRANSFERT"                                               
 
# ----------- Fichier de log de travail                                                                                                     
LOG_INFO="$CURRENT_WORKING_REPO/backup_$DATE_NOW.log"                                                                                       
 
# -----------  Configuration de la conservation des fichiers                                                                                
CONSERVATION_FICHIER_IS_ACTIVE="yes"                                                                                                        
NBR_JOURS_CONSERVATION=90                                                                                                                   
REPOSITORY_CHMOD="770"                                                                                                                      
LISTE_REPO_A_SAUVEGARDER="/etc/ /home/gwadanina.net"                                    
 
# --------- Configuration du serveur MySQL en local                                                                                         
SQL_LOCAL_USER="backup"                                                                                                                  
SQL_LOCAL_PASSWORD="_secret"                                                                                                              
SQL_LOCAL_SERVER_HOST="localhost"                                                                                                           
 
# Database a ne pas sauvegarder (a separer par des espaces)                                                                                 
DATABASE_A_NE_PAS_SAUVEGARDER="information_schema"                                                                                          
 
# --------- Configuration des Mails de notifications                                                                                        
NOTIFICATION_MAIL_IS_ACTIVE="yes"                                                                                                           
NOTIFICATION_MAIL_ADRESSES="backup"                                                                                                    
NOTIFICATION_MAIL_SUJET="[BACKUP-$HOSTNAME]_$DATE_NOW"                                                                                      
 
# --------- Nombre de jour depuis la derniere installation du systeme                                                                       
# format de date ANNEEMOISJOURHEUREMINUTE                                                                                                   
DATE_INSTALLATION_SYSTEME=201111031000                                                                                                      
DATE_INSTALLATION_SYSTEME_FICHIER="$BACKUP_REPO/DATE_INSTALLATION_SYSTEME.$DATE_INSTALLATION_SYSTEME"                                       
 
# --------- Chargement d'une configuration sur le serveur                                                                                   
if [ -e $CUSTOM_CONFIG ]; then                                                                                                              
   source $CUSTOM_CONFIG                                                                                                                    
   echo "Chargement d'une configuration sur le serveur: $CUSTOM_CONFIG"                                                                     
fi                                                                                                                                          
 
# ----------------------------------------------------------- #                                                                             
#       Preparation de l'environnement de travail             #                                                                             
# ----------------------------------------------------------- #                                                                             
 
# --------- Creation du repertoires de sauvegarde                                                                                           
[ ! -d "$CURRENT_WORKING_REPO" ] && "$MKDIR" -p "$CURRENT_WORKING_REPO" || :                                                                
# --------- Creation du repertoires de sauvegarde sql                                                                                       
[ ! -d "$CURRENT_WORKING_REPO_SQL" ] && "$MKDIR" -p "$CURRENT_WORKING_REPO_SQL" || :                                                        
# --------- Creation du repertoire temporaire                                                                                               
[ ! -d "$TMP_BACKUP_REPO" ] && "$MKDIR" -p "$TMP_BACKUP_REPO" || :                                                                          
 
# --------- Creation du fichier de log                                                                                                      
LOG_INFO="$CURRENT_WORKING_REPO/backup_$(date +%Y-%m-%d_%H.%M.%S).log";                                                                     
echo "[$(date +%F-%T)] - Sur le serveur $HOSTNAME, le repertoire de travail est : " "$CURRENT_WORKING_REPO" > "$LOG_INFO";                  
 
# --------- Creation du fichier d'unicite de programme                                                                                      
if [ ! -e $LOCKFILE ]; then                                                                                                                 
   $TRAP "$RM -f $LOCKFILE; exit" INT TERM EXIT 2> /dev/null                                                                                
   $TOUCH $LOCKFILE                                                                                                                         
   echo "[$(date +%F-%T)] - Creation du fichier d'unicite de programme : $LOCKFILE" >> "$LOG_INFO";                                         
else                                                                                                                                        
   echo "[$(date +%F-%T)] - Le programme est deja en cours d'execution car le fichier $LOCKFILE existe" >> "$LOG_INFO";                     
   echo "[$(date +%F-%T)] - Le programme est deja en cours d'execution car le fichier $LOCKFILE existe" ;                                   
   echo "[$(date +%F-%T)] - Fin du traitement" >> "$LOG_INFO";                                                                              
   exit 1                                                                                                                                   
fi                                                                                                                                          
 
# --------- Verification de l'existence des programmes sur le serveur                                                                       
 
COMMANDES_NECESSAIRES="$MYSQL $MYSQLDUMP $GZIP $MKDIR $MYSQLCHECK $RSYNC $SSH $MAIL $TAR $TOUCH $RM $TRAP $HOSTNAME"                        
COMMANDES_MANQUANTES=0                                                                                                                      
for COMMANDE_NECESSAIRE in "$COMMANDES_NECESSAIRES"; do                                                                                     
  if ! hash "$COMMANDE_NECESSAIRE" >/dev/null 2>&1; then                                                                                    
    printf "Command not found in PATH: %s\n" "$COMMANDE_NECESSAIRE" >&2                                                                     
    echo "[$(date +%F-%T)] - Erreur, le programme $COMMANDE_NECESSAIRE est necessaire" >> "$LOG_INFO";                                      
    ((COMMANDES_MANQUANTES++))                                                                                                              
  fi                                                                                                                                        
done                                                                                                                                        
 
if (($COMMANDES_MANQUANTES > 0)); then                                                                                                      
  echo "[$(date +%F-%T)] - Erreur, plusieurs programmes manquent pour l'execution du script" >> "$LOG_INFO";                                
  echo "[$(date +%F-%T)] - Fin du traitement" >> "$LOG_INFO";                                                                               
  exit 1                                                                                                                                    
fi                                                                                                                                          
 
 
# ----------------------------------------------------------- #                                                                             
#       Lancement de la sauvegarde de la base de donnees      #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - Creation de la liste de toutes les bases de données" >> "$LOG_INFO";                                               
LISTE_BASE_DONNEES="$($MYSQL -u$SQL_LOCAL_USER -h$SQL_LOCAL_SERVER_HOST -p$SQL_LOCAL_PASSWORD -Bse 'show databases')";                      
 
if [ ! $? -eq 0 ] ; then                                                                                                                    
    echo "[$(date +%F-%T)] - Une erreur s'est produite lors de la creation de la liste des bases de données " >> "$LOG_INFO";               
fi                                                                                                                                          
 
echo "[$(date +%F-%T)] - Liste des bases de donnees : $LISTE_BASE_DONNEES" >> "$LOG_INFO";                                                  
 
for BASE in $LISTE_BASE_DONNEES                                                                                                             
do                                                                                                                                          
    # analyse et verification des tables                                                                                                    
    $MYSQLCHECK -u$SQL_LOCAL_USER -h$SQL_LOCAL_SERVER_HOST -p$SQL_LOCAL_PASSWORD --auto-repair  --optimize  "$BASE";                        
    if [ ! $? -eq 0 ] ; then                                                                                                                
        echo "[$(date +%F-%T)] - Une erreur s'est produite lors de l'analyse ou la verification de la table " "$BASE" "" >> "$LOG_INFO";    
    fi                                                                                                                                      
    skipdb=-1                                                                                                                               
    if [ "$DATABASE_A_NE_PAS_SAUVEGARDER" != "" ] ; then                                                                                    
        for i in $DATABASE_A_NE_PAS_SAUVEGARDER                                                                                             
        do                                                                                                                                  
            [ "$BASE" == "$i" ] && skipdb=1 && echo "[$(date +%F-%T)] - Pas de backup pour la base $BASE" >> "$LOG_INFO" || :               
        done                                                                                                                                
    fi                                                                                                                                      
 
    # Creation des dumps de la base                                                                                                         
    if [ "$skipdb" == "-1" ] ; then                                                                                                         
        echo "[$(date +%F-%T)] - Dump de la base $BASE" >> "$LOG_INFO";                                                                     
        SQL_FILE_NAME="$CURRENT_WORKING_REPO_SQL/$BASE.$DATE_NOW.sql.gz";                                                                   
        $MYSQLDUMP -u$SQL_LOCAL_USER -h$SQL_LOCAL_SERVER_HOST -p$SQL_LOCAL_PASSWORD $BASE | $GZIP -f -9 > "$SQL_FILE_NAME";                 
        if [ ! $? -eq 0 ] ; then                                                                                                            
            echo "[$(date +%F-%T)] - An error occurred in backing up " "$BASE" "tables." >> "$LOG_INFO";                                    
        else                                                                                                                                
            # taille de l'archive                                                                                                           
            FILESIZE=`ls -lh $SQL_FILE_NAME | awk '{print $5}'`                                                                             
            echo "[$(date +%F-%T)] - Creation de l'archive : $SQL_FILE_NAME ($FILESIZE)" >> "$LOG_INFO";                                    
        fi                                                                                                                                  
    fi                                                                                                                                      
done                                                                                                                                        
 
echo "[$(date +%F-%T)] - Creation d'un fichier de checksum pour les bases de donnees" >> "$LOG_INFO";                                       
$MD5SUM "$CURRENT_WORKING_REPO_SQL"/*.sql.gz > "$CURRENT_WORKING_REPO_SQL/sql.checksum.md5";                                                
 
 
# ----------------------------------------------------------- #                                                                             
#        Suppression des anciens fichiers d'archive           #                                                                             
# ----------------------------------------------------------- #                                                                             
 
if [ "$CONSERVATION_FICHIER_IS_ACTIVE" = "yes" ] ; then                                                                                     
    echo "[$(date +%F-%T)] - Recherche et supprime les archives de plus $NBR_JOURS_CONSERVATION jours" >> "$LOG_INFO";                      
    "$FIND" "$BACKUP_REPO" -maxdepth 1 -type f -ctime +$NBR_JOURS_CONSERVATION  -exec $RM -v {} \;                                          
    if [ ! $? -eq 0 ] ; then                                                                                                                
        echo "[$(date +%F-%T)] - Une erreur s'est produite lors de la recherche et suppression des anciennes archives" >> "$LOG_INFO";      
    fi                                                                                                                                      
fi                                                                                                                                          
 
 
# ----------------------------------------------------------- #                                                                             
#        Sauvegarde de la liste des packages installes        #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - Lancement de dpkg selection" >> "$LOG_INFO";                                                                       
$DPKG --get-selections | $GZIP -f -9  > "$CURRENT_WORKING_REPO/dpkg_--get-selections.$DATE_NOW.txt.gz";                                     
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors de la sauvegarde de la liste des packages installes " >> "$LOG_INFO";             
fi                                                                                                                                          
 
 
# ----------------------------------------------------------- #                                                                             
#        Sauvegarde de la liste des configuration modifiés    #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - Lancement de la sauvegarde des fichiers de configuration modifiés" >> "$LOG_INFO";                                 
 
# creation du fichier de reference pour la date d'installation du systeme                                                                   
[ ! -d "$DATE_INSTALLATION_SYSTEME_FICHIER" ] && "$TOUCH" -t "$DATE_INSTALLATION_SYSTEME" "$DATE_INSTALLATION_SYSTEME_FICHIER" || :         
 
"$FIND" /etc -cnewer "$DATE_INSTALLATION_SYSTEME_FICHIER" -type f -exec cp --parents '{}' "$TMP_BACKUP_REPO" \;                             
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors de la sauvegarde des fichiers de configuration modifiés" >> "$LOG_INFO";          
else                                                                                                                                        
  $TAR czf "$CURRENT_WORKING_REPO/etc_modif_$DATE_NOW.tar.gz" "$TMP_BACKUP_REPO";                                                           
  if [ ! $? -eq 0 ] ; then                                                                                                                  
        echo "[$(date +%F-%T)] - Une erreur s'est produite lors de la sauvegarde des fichiers de configuration modifiés" >> "$LOG_INFO";    
  else                                                                                                                                      
        $RM -rf "$TMP_BACKUP_REPO"                                                                                                          
  fi                                                                                                                                        
fi                                                                                                                                          
 
# ----------------------------------------------------------- #                                                                             
#        Lancement du backup des repertoires                  #                                                                             
# ----------------------------------------------------------- #                                                                             
 
 
echo "[$(date +%F-%T)] - Lancement du backup des sites" >> "$LOG_INFO";                                                                     
 
for REPO in $LISTE_REPO_A_SAUVEGARDER                                                                                                       
do                                                                                                                                          
   NOM_REPO=$(basename $REPO);                                                                                                              
   echo "[$(date +%F-%T)] - Traitement du repertoire $NOM_REPO pour $REPO" >> "$LOG_INFO";                                                  
   NBR_FICHIER_MODIFIER_HIER=$($FIND $REPO -type f -mmin -1440 -exec ls -l {} \; | grep -v '/galerie/_data/templates_c/' | grep -v '/galerie/_data/tmp/' | grep -v '/galerie/local/GThumb/' | grep -v '/galerie/local/combined/' | grep -v '/wiki/data/cache/' | grep -v '_dokuwiki.changes.trimmed' | wc -l);                                                                                  
   if [ ! $NBR_FICHIER_MODIFIER_HIER -eq 0 ] ; then                                                                                         
        echo "[$(date +%F-%T)] - Creation d'un nouveau fichier " >> "$LOG_INFO";                                                            
 
        # liste des differences entre version                                                                                               
        $FIND $REPO -type f -mmin -1440 -exec ls -l {} \; | grep -v '/galerie/_data/templates_c/' | grep -v '/galerie/_data/tmp/' | grep -v '/galerie/local/GThumb/' | grep -v '/galerie/local/combined/' | grep -v '/wiki/data/cache/'  | grep -v '_dokuwiki.changes.trimmed' ; >> "$LOG_INFO";                                                                                                
        # liste des fichiers modifies to file                                                                                               
        $TAR czf "$CURRENT_WORKING_REPO/$NOM_REPO.$DATE_NOW.tar.gz" "$REPO";                                                                
   else                                                                                                                                     
        echo "[$(date +%F-%T)] - Pas de modification pour le repertoire $REPO" >> "$LOG_INFO";                                              
        # ln -fs date hier                                                                                                                  
   fi                                                                                                                                       
done                                                                                                                                        
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors du lancement du backup des sites" >> "$LOG_INFO";                                 
fi                                                                                                                                          
 
echo "[$(date +%F-%T)] - Creation d'un fichier de checksum pour les sites" >> "$LOG_INFO";                                                  
$MD5SUM "$CURRENT_WORKING_REPO"/*.gz > "$CURRENT_WORKING_REPO/backup.checksum.md5";                                                         
 
 
# ----------------------------------------------------------- #                                                                             
#        Mise a jour des droits des fichiers                  #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - mise a jour des droits des fichiers" >> "$LOG_INFO";                                                               
chown -R $LOCAL_USER:$LOCAL_GROUP $BACKUP_REPO $BACKUP_REPO_TMP;                                                                            
chmod -R 770 $BACKUP_REPO $BACKUP_REPO_TMP;                                                                                                 
 
# ----------------------------------------------------------- #                                                                             
#        Synchronisation des fichiers vers le serveur distant #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - debut de de synchronisation vers le serveur $REMOTE_HOST" >> "$LOG_INFO";                                          
su - "$LOCAL_USER" -c "$RSYNC -azv -e '$SSH -p $REMOTE_PORT' $BACKUP_REPO $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH";                          
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Erreur de synchronisation vers le serveur $REMOTE_HOST" >> "$LOG_INFO";                                          
fi                                                                                                                                          
 
# --------- Envoi d'un fichier vide de fin de transfert                                                                                     
su - "$LOCAL_USER" -c "$SSH -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST '$TOUCH_REMOTE $REMOTE_PATH_FIN_DE_TRANSFERT'" >> "$LOG_INFO";        
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Erreur d'envoi d'un fichier vide de fin de transfert" >> "$LOG_INFO";                                            
fi                                                                                                                                          
 
 
# --------- Retourne la liste des nouveaux fichiers sur le serveur distant depuis 24 heures                                                 
echo "[$(date +%F-%T)] - liste des nouveaux fichiers" >> "$LOG_INFO";                                                                       
su - "$LOCAL_USER" -c "$SSH -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST '$FIND $REMOTE_PATH/ -type f -mmin -1440 -exec ls -l {} \; | sort -k7 '" | awk '{print $5, $8, $9}' >> "$LOG_INFO";                                                                                               
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Erreur lors du retour de la liste des nouveaux fichiers sur le serveur distant depuis 24 heures" >> "$LOG_INFO"; 
fi                                                                                                                                          
 
# ----------------------------------------------------------- #                                                                             
#        Vidage des repertoires /tmp du systeme               #                                                                             
# ----------------------------------------------------------- #                                                                             
 
echo "[$(date +%F-%T)] - Suppression des fichiers cree par apache de plus de 30 jours du repertoire /tmp" >> "$LOG_INFO";                   
"$FIND" /tmp/sess_* -type f -atime +30 -user www-data -exec $RM {} \;                                                                       
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors du la suppression des fichiers cree par apache de plus de 30 jours du repertoire /tmp" >> "$LOG_INFO";                                                                                                                        
fi                                                                                                                                          
 
echo "[$(date +%F-%T)] - Suppression des fichiers de plus de 30 jours des repertoires tmp des utilisateurs" >> "$LOG_INFO";                 
"$FIND" /home/*/tmp/ -type f -atime +30 -exec $RM {} \;                                                                                     
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors du la suppression des fichiers de plus de 30 jours des repertoires tmp des utilisateurs" >> "$LOG_INFO";                                                                                                                      
fi                                                                                                                                          
 
echo "[$(date +%F-%T)] - Suppression des fichiers de plus de 50 jours du repertoire de cache" >> "$LOG_INFO";                               
"$FIND" /var/tmp/ -type f -atime +50 -exec $RM {} \;                                                                                        
if [ ! $? -eq 0 ] ; then                                                                                                                    
  echo "[$(date +%F-%T)] - Une erreur s'est produite lors du la suppression des fichiers de plus de 50 jours du repertoire de cache" >> "$LOG_INFO";                                                                                                                                    
fi                                                                                                                                          
# ----------------------------------------------------------- #                                                                             
#        Fin du traitement de la maintenance                  #                                                                             
# ----------------------------------------------------------- #                                                                             
 
# --------- Suppression du fichier d'unicite de programme                                                                                   
if [ -e $LOCKFILE ]; then                                                                                                                   
   $RM $LOCKFILE                                                                                                                            
#   $TRAP - INT TERM EXIT                                                                                                                   
   echo "[$(date +%F-%T)] - Suppression du fichier d'unicite de programme" >> "$LOG_INFO";                                                  
fi                                                                                                                                          
 
echo "[$(date +%F-%T)] - Fin du traitement" >> "$LOG_INFO";                                                                                 
 
# ----------------------------------------------------------- #                                                                             
#        Envoi d'un mail recapitulatif (desactivable)         #                                                                             
# ----------------------------------------------------------- #                                                                             
 
if [ "$NOTIFICATION_MAIL_IS_ACTIVE" = "yes" ] ; then                                                                                        
  $MAIL -s "$NOTIFICATION_MAIL_SUJET" "$NOTIFICATION_MAIL_ADRESSES" < "$LOG_INFO";                                                          
  if [ ! $? -eq 0 ] ; then                                                                                                                  
    echo "[$(date +%F-%T)] - Erreur d'envoi du mail" >> "$LOG_INFO";                                                                        
  else                                                                                                                                      
    echo "[$(date +%F-%T)] - Envoi du mail OK" >> "$LOG_INFO";                                                                              
  fi                                                                                                                                        
fi                                                                                                                                          
 
echo "$LOG_INFO";                                                                                                                           
exit 0;

Connections à distance

Envoi de mail lors du log sous root

$ nano ~/.bashrc
# rajouter dans le fichier:
 
SUJET_MAIL="Accès Shell Root le `date` sur le `hostname`"
EMAIL_MESSAGE="Shell Root de `who -m`"
EMAIL="[email protected]_gwadanina.net_"
 
echo $EMAIL_MESSAGE | mail -s "$SUJET_MAIL" "$EMAIL"
 
# pour tester faire:
$ su -
# constater l'envoi du mail

OpenSSH

Fish

#Konqueror fait du ssh en mode graphique.
$fish://utilisateur@serveur.com

Fail2ban

Pour bloquer une IP après un certain nombre de tentatives échouées. Utile pour les attaques par force brute de ssh.

Configuration

fichier /etc/fail2ban/jail.conf

La configuration par defaut est correcte. L'on peut mettre un log pour ssh : logfile = /var/log/fail2ban-ssh.log

$/etc/init.d/fail2ban restart
ERROR: time data did not match format

Si vous avez l'erreur ci dessus rajouter dans le fichier /etc/default/fail2ban

export LC_ALL=C 
Ajout de la Géolocalisation
$ aptitude install libgeoip1 geoip-bin
# test avec google.fr
$ geoiplookup 216.239.59.104
$ cp /usr/share/fail2ban/server/actions.py /usr/share/fail2ban/server/actions.py.old
$ nano /usr/share/fail2ban/server/actions.py

Remplacer import time, logging par import time, logging, commands

Remplacer logSys.warn(“[%s] Ban %s” % (self.jail.getName(), aInfo[“ip”]) par logSys.warn(“[%s] Ban %s %s” % (self.jail.getName(), aInfo[“ip”], commands.getstatusoutput('geoiplookup ' + aInfo[“ip”])[1][23:]))

rajouter dans cron: @monthly sleep $[$RANDOM/1024]; wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz -O - | gunzip > /usr/share/GeoIP/GeoIP.dat.new && mv /usr/share/GeoIP/GeoIP.dat.new /usr/share/GeoIP/GeoIP.dat

Testez l'état des jails

# état de toutes les règles
$ /usr/bin/fail2ban-client status
# détail pour une règle en particulier
$ /usr/bin/fail2ban-client status ssh
linux/securite_linux.txt · Dernière modification: 2014/08/03 01:04 (modification externe)