Security/Audit/Aide/Brief

De TartareFR
Aller à la navigation Aller à la recherche

Introduction

AIDE est un HIDS : Host-based Intrusion Detection System.

Le principe de ce logiciel est simple. Il s'agit de construire une base de signatures (utilisant des algorithmes d'empreinte cryptographique) de fichiers que l'on désire surveiller, et de re-calculer ces empreintes périodiquement ou au besoin, en les confrontant à la base. Si les empreintes sont différentes (au niveau du fichier, de sa date, de ses droits d'accès, de son inode ...), le logiciel aura ou pas détecté une modification de fichiers.

Ces logiciels sont très utiles en cas d'intrusion, afin de découvrir ce qui a été changé (journaux modifiés, fichiers ajoutés à certains endroits, binaires comme netstat, lsof, who, sshd modifiés, fichiers de configuration, pages web, etc.). Cependant, ce type de logiciel n'est pas à voir comme protégeant le système. AIDE ne fera rien pour améliorer la sécurité d'un système Unix (AIDE n'existe que pour ces systèmes). C'est le dernier logiciel que vous avez à installer sur votre système.

Parallèlement, AIDE peut s'avérer très utile pour l'administration. En effet, il sera capable de détecter des erreurs commises (fichiers de configuration changés, ajoutés ou effacés, modifications de binaires).

Configuration

Fichier <path>/etc/aide.conf </path>

# Example configuration file for AIDE.

@@define DBDIR /var/lib/aide
@@define LOGDIR /var/log/aide

# The location of the database to be read.
database=file:@@{DBDIR}/aide.db.gz

# The location of the database to be written.
#database_out=sql:host:port:database:login_name:passwd:table
#database_out=file:aide.db.new
database_out=file:@@{DBDIR}/aide.db.new.gz

# Whether to gzip the output to database
gzip_dbout=yes

# Default.
verbose=5

report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
#report_url=stderr
#NOT IMPLEMENTED report_url=mailto:root@foo.com
#NOT IMPLEMENTED report_url=syslog:LOG_AUTH

# These are the default rules.
#
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum

#haval:  haval checksum (MHASH only)
#gost:   gost checksum (MHASH only)
#crc32:  crc32 checksum (MHASH only)
#whirlpool:     whirlpool checksum (MHASH only)

#R:             p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
#L:             p+i+n+u+g+acl+selinux+xattrs
#E:             Empty group
#>:             Growing logfile p+u+g+i+n+S+acl+selinux+xattrs

# You can create custom rules like this.
# With MHASH...
# ALLXTRAHASHES = sha1+rmd160+sha256+sha512+whirlpool+tiger+haval+gost+crc32
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

# Sane, with multiple hashes
# NORMAL = R+rmd160+sha256+whirlpool
NORMAL = R+rmd160+sha256

# For directories, don't bother doing hashes
DIR = p+i+n+u+g+acl+selinux+xattrs

# Access control only
PERMS = p+i+u+g+acl+selinux

# Logfile are special, in that they often change
LOG = >

# Just do md5 and sha256 hashes
LSPP = R+sha256

# Some files get updated automatically, so the inode/ctime/mtime change
# but we want to know when the data inside them changes
DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+md5+sha256+rmd160+tiger

# Next decide what directories/files you want in the database.

/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL
# These are too volatile
!/usr/src
!/usr/tmp

# Check only permissions, inode, user and group for /etc, but
# cover some important files closely.
/etc    PERMS
!/etc/mtab
# Ignore backup files
!/etc/.*~
/etc/exports  NORMAL
/etc/fstab    NORMAL
/etc/passwd   NORMAL
/etc/group    NORMAL
/etc/gshadow  NORMAL
/etc/shadow   NORMAL
/etc/security/opasswd   NORMAL

/etc/hosts.allow   NORMAL
/etc/hosts.deny    NORMAL

/etc/sudoers NORMAL
/etc/skel NORMAL

/etc/logrotate.d NORMAL

/etc/resolv.conf DATAONLY

/etc/nscd.conf NORMAL
/etc/securetty NORMAL

# Shell/X starting files
/etc/profile NORMAL
/etc/bashrc NORMAL
/etc/bash_completion.d/ NORMAL
/etc/login.defs NORMAL
/etc/zprofile NORMAL
/etc/zshrc NORMAL
/etc/zlogin NORMAL
/etc/zlogout NORMAL
/etc/profile.d/ NORMAL
/etc/X11/ NORMAL

# Pkg manager
/etc/yum.conf NORMAL
/etc/yumex.conf NORMAL
/etc/yumex.profiles.conf NORMAL
/etc/yum/ NORMAL
/etc/yum.repos.d/ NORMAL

/var/log   LOG
/var/run/utmp LOG

# This gets new/removes-old filenames daily
!/var/log/sa
# As we are checking it, we've truncated yesterdays size to zero.
!/var/log/aide.log

# LSPP rules...
# AIDE produces an audit record, so this becomes perpetual motion.
# /var/log/audit/ LSPP
/etc/audit/ LSPP
/etc/libaudit.conf LSPP
/usr/sbin/stunnel LSPP
/var/spool/at LSPP
/etc/at.allow LSPP
/etc/at.deny LSPP
/etc/cron.allow LSPP
/etc/cron.deny LSPP
/etc/cron.d/ LSPP
/etc/cron.daily/ LSPP
/etc/cron.hourly/ LSPP
/etc/cron.monthly/ LSPP
/etc/cron.weekly/ LSPP
/etc/crontab LSPP
/var/spool/cron/root LSPP

/etc/login.defs LSPP
/etc/securetty LSPP
/var/log/faillog LSPP
/var/log/lastlog LSPP

/etc/hosts LSPP
/etc/sysconfig LSPP

/etc/inittab LSPP
/etc/grub/ LSPP
/etc/rc.d LSPP

/etc/ld.so.conf LSPP

/etc/localtime LSPP

/etc/sysctl.conf LSPP

/etc/modprobe.conf LSPP

/etc/pam.d LSPP
/etc/security LSPP
/etc/aliases LSPP
/etc/postfix LSPP

/etc/ssh/sshd_config LSPP
/etc/ssh/ssh_config LSPP

/etc/stunnel LSPP

/etc/vsftpd.ftpusers LSPP
/etc/vsftpd LSPP

/etc/issue LSPP
/etc/issue.net LSPP

/etc/cups LSPP

# With AIDE's default verbosity level of 5, these would give lots of
# warnings upon tree traversal. It might change with future version.
#
#=/lost\+found    DIR
#=/home           DIR

# Ditto /var/log/sa reason...
!/var/log/and-httpd

# Admins dot files constantly change, just check perms
/root/\..* PERMS
Note.png
variables database
Les deux premières variables sont des URL. Il est possible d'utiliser stdin, stdout, stderr, un fichier, ou un descripteur de fichier, et bien d'autres choses encore plus tard dans l'évolution du logiciel.

On définit les fichiers à inclure dans la base de données :

fichier		Groupe

Un ! placé avant le fichier l'ignore, et un = rend le fonctionnement non-récursif. Les groupes d'éléments à inclure et à surveiller sont :

  • p : les permissions
  • i : l'inode
  • n : le nombre de liens
  • u : l'utilisateur auquel appartient le fichier
  • g : son groupe
  • s : sa taille
  • m : sa date de dernière modification des données
  • a : sa date de dernier accès
  • c : sa date de dernière modification de statut (droits, etc.)
  • S : vérifie que la taille augmente (fichier de log par exemple)

ainsi que les noms des algorithmes d'empreinte.

Plusieurs « méta-groupes » sont disponibles :

  • R équivaut à p+i+n+u+g+s+m+c+md5
  • L à p+i+n+u+g
  • > à p+u+g+i+n+S.

Il est conseillé d'utiliser plusieurs types d'algorithmes d'empreinte différents.

Attention, si un premier champ commence par /, il s'agit d'une expression régulière, donc /blah équivaut à /blah.*, vous voudrez peut-être utiliser /blah$

Il est important de bien prendre du temps à construire votre fichier de configuration en fonction de vos besoins (système entier, arborescence web, utilisateur particulier, etc.). Notez que le fichier /etc/mtab est supprimé de la base, car son contenu change sans-cesse; la négation doit être placée avant la déclaration du répertoire.

Utiliser AIDE de manière efficace

L'initialisation

La première chose à faire est de créer une première base de signatures :

aide --init

Cette commande va créer un fichier /var/adm/aide/db/aide.db.new, qu'il convient de renommer manuellement en aide.db. La base initiale de signatures est donc créée. Il s'agit d'un fichier texte qu'il est alors possible de lire afin de vérifier que tous les fichiers ont été pris en compte, c'est-à-dire que les expressions régulières sont correctes.

Vérifier la base périodiquement

Ensuite périodiquement, il est nécessaire de vérifier l'intégrité des fichiers.

Ce peut-être une fois par jour, ou par exemple toutes les 5 minutes si la base contient uniquement les fichiers de votre site web; en cas de « defacement », AIDE préviendra donc en un maximum de 5 minutes.

Cela se fait simplement par :

aide --check

Cette commande est silencieuse si AIDE ne trouve aucune différence. Elle peut donc être placée telle-quelle dans une crontab.

Cependant, si des fichiers sont normalement modifiés (ajout d'un utilisateur, modification de configuration, mise à jour du système, ...), certains retours sont normaux. Deux choix s'offrent donc à nous :

  • recréer la base entièrement lorsque des modifications sont faites.
  • modifier cette base en incluant les changement trouvés

Cette deuxième solution est mise en oeuvre par la commande :

aide --update

Un nouveau fichier aide.db.new est alors créé, il convient également de le remplacer par aide.db. Voici donc l'utilité du suffixe .new lors d'une création de base.

Avec cette commande en crontab, seuls les deltas apparaîtront. Bien entendu, cette deuxième méthode n'est pas compatible avec l'utilisation (recommandée) d'un support non-inscriptible, puisque nécessitant alors une intervention humaine pour déprotéger la disquette ou graver un autre CD-ROM.