82 votes

Consigner toutes les commandes exécutées par les administrateurs sur les serveurs de production

La politique de l'entreprise veut que les administrateurs se connectent aux serveurs via un nom d'utilisateur personnel, puis exécutent sudo -i pour devenir root. Après avoir exécuté sudo -i sudo va créer une variable environnementale appelée SUDO_USER qui contient le nom d'utilisateur de l'utilisateur original.

Y a-t-il un moyen d'enregistrer TOUTES dans syslog avec une syntaxe similaire à la suivante :

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}

Un exemple d'entrée serait :

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg

Évidemment, il n'est pas nécessaire que ce soit exactement la syntaxe ci-dessus, il doit juste inclure un minimum de l'utilisateur réel (ex. root), l'utilisateur sudo (ex. ksoviero), et la commande complète qui a été exécutée (ex. yum install random-pkg).

J'ai déjà essayé snoopy mais il ne comprenait pas le SUDO_USER variable.

107voto

fuero Points 9047

Mise à jour : 2 autres choses qui sont apparues dans les commentaires et dans les questions de suivi :

  • Utilisation de auditd de cette manière augmentera considérablement le volume de vos journaux, surtout si le système est fortement utilisé via la ligne de commande. Ajustez votre politique de rétention des journaux.
  • Auditd sur l'hôte où ils sont créés sont tout aussi sûrs que les autres fichiers sur la même boîte. Transmettez vos logs à un serveur de collecte de logs distant comme ELK ou Graylog pour préserver l'intégrité de vos logs. De plus, pour ajouter au point ci-dessus, cela permet de supprimer plus agressivement les anciens journaux.

Comme l'a suggéré Michael Hampton, auditd est le bon outil pour le travail ici.

J'ai testé ceci sur une installation Ubuntu 12.10, donc votre kilométrage peut varier sur d'autres systèmes.

  • Installer auditd :

    apt-get install auditd

  • Ajoutez ces 2 lignes à /etc/audit/audit.rules :

    \-a exit,always -F arch=b64 -F euid=0 -S execve
    -a exit,always -F arch=b32 -F euid=0 -S execve

Ceux-ci suivront toutes les commandes exécutées par root ( euid=0 ). Pourquoi deux règles ? Le site execve syscall doit être suivi à la fois dans le code 32 et 64 bits.

  • Pour se débarrasser de auid=4294967295 dans les journaux, ajoutez audit=1 dans la ligne de commande du noyau (en modifiant le fichier /etc/default/grub )

  • Placez la ligne

    session required pam_loginuid.so

dans tous les fichiers de configuration PAM qui sont pertinents pour la connexion ( /etc/pam.d/{login,kdm,sshd} ), mais pas dans les fichiers qui sont pertinents pour le projet su o sudo . Cela permettra auditd pour obtenir l'adresse de l'utilisateur appelant uid correctement lors de l'appel sudo o su .

  • Redémarrez votre système maintenant.

  • Connectons nous et lançons quelques commandes :

    $ id -u
    1000
    $ sudo ls /
    bin  boot  data  dev  etc  home  initrd.img  initrd.img.old  lib  lib32  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  scratch  selinux  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old
    $ sudo su -
    # ls /etc
    \[...\]

Cela donnera quelque chose comme ceci dans /var/log/audit/auditd.log :

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)

El auid La colonne contient le numéro de l'utilisateur appelant uid ce qui vous permet de filtrer les commandes exécutées par cet utilisateur avec

 ausearch -ua 1000

Cela listera même les commandes que l'utilisateur a exécutées en tant que root.

Sources :

11voto

jeffreypriebe Points 1070

Rappelez-vous que sudo lui-même enregistre toutes les commandes sudo dans le syslog, donc tous les utilisateurs privés devraient être éduqués à ne pas simplement sudo pour obtenir un Shell root mais à :

sudo command p1 p2 ... pn

Le problème avec cette approche, ou toute autre approche à laquelle j'ai pensé, est que lorsque la root il est assez difficile d'empêcher un utilisateur d'échapper à un type spécifique de journalisation. Ainsi, tout ce que vous essayez sera < 100% je suis désolé de le dire.

L'éducation, la documentation, l'application et surtout la confiance sont nécessaires.

10voto

ggustafsson Points 1908

J'ai été confronté une fois au même problème et j'ai dû trouver une solution rapide et sale - chaque utilisateur sudo aura son propre fichier historique une fois qu'il aura exécuté la commande sudo -i

Sur /root/.bashrc J'ai ajouté la ligne suivante -

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "

Ainsi, chaque utilisateur qui se connecte à root aura un fichier d'historique .bash_history-username.

Une autre méthode -

Ajoutez le code suivant à /root/.bashrc et il ajoutera le nom d'utilisateur, sudo-user, et la commande au fichier journal, où le niveau de notification est défini, probablement /var/log/messages.

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG

Crédit à - http://backdrift.org/logging-bash-history-to-syslog-using-traps

3voto

Vahid Amiri Points 111

Un certain nombre d'établissements interdisent en fait l'utilisation d'auditd car il est gourmand en ressources et peut donner lieu à des attaques par déni de service.

Une solution consiste à configurer la dernière version de Korn Shell (ksh-93, cf. http://kornshell.com/ pour plus de détails) pour enregistrer toutes les commandes exécutées en tant que root sur un serveur syslog distant, puis pour exiger par politique que, sauf en cas d'urgence, les sysadmins se connectent avec des comptes personnels et exécutent le Shell Korn amélioré via sudo. L'examen des journaux peut détecter quand un administrateur lance un autre Shell à partir du Shell approuvé afin de couvrir ses traces, et le SA peut alors être éduqué si nécessaire.

3voto

nighter Points 31

Sudo a quelque chose qui s'appelle sudoreplay lorsque les sessions sont activées est enregistrée et peut être rejouée ultérieurement, fonctionne de manière similaire à l'option script qui crée un script de session de terminal qui peut ensuite être rejoué avec la commande scriptreplay commandement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X