Comment enregistrer les commandes dans un «sudo su -»?

12

Si je:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

Ensuite, je peux voir cela dans les journaux:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

mais si je:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Je ne peux pas le voir dans les journaux:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Ma question: comment activer la connexion pour les commandes dans le "sudo su -"?

OS est un Ubuntu 12.04 mais la question est générale.

MISE À JOUR # 1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]
newuser999
la source
Si une personne malveillante (ou même simplement indigne de confiance) a accès à sudo su -, elle a également la possibilité de supprimer toutes les entrées de journal que vous pourriez faire de ses actions. Si vous voulez une certitude à 100% dans votre journalisation, vous devez restreindre sudofortement et interdire sudo sucomplètement.
Wildcard

Réponses:

17

Puisque vous êtes sur Ubuntu 12.04, jetez un œil aux capacités de journalisation des E / S activées via les options log_inputet log_output.

log_input

    S'il est défini, sudoexécutera la commande dans un pseudo tty et enregistrera toutes les entrées utilisateur. Si l'entrée standard n'est pas connectée au terminal de l'utilisateur, en raison de la redirection d'E / S ou parce que la commande fait partie d'un pipeline, cette entrée est également capturée et stockée dans un fichier journal distinct.

    L'entrée est consignée dans le répertoire spécifié par l' iolog_diroption ( /var/log/sudo-iopar défaut) à l'aide d'un ID de session unique qui est inclus dans la ligne de journal sudo normale, précédé du préfixe TSID=. L' iolog_fileoption peut être utilisée pour contrôler le format de l'ID de session.

    Notez que l'entrée utilisateur peut contenir des informations sensibles telles que les mots de passe (même si elles ne sont pas répercutées à l'écran), qui seront stockées dans le fichier journal non cryptées. Dans la plupart des cas, la journalisation de la sortie de la commande via log_output suffit.

log_output

    S'il est défini, sudoexécutera la commande dans un pseudo tty et enregistrera toutes les sorties envoyées à l'écran, comme la commande script (1). Si la sortie standard ou l'erreur standard n'est pas connectée au tty de l'utilisateur, en raison de la redirection d'E / S ou parce que la commande fait partie d'un pipeline, cette sortie est également capturée et stockée dans des fichiers journaux distincts.

    La sortie est enregistrée dans le répertoire spécifié par l' iolog_diroption ( /var/log/sudo-iopar défaut) à l'aide d'un ID de session unique qui est inclus dans la ligne de journal sudo normale, précédé du préfixe TSID=. L' iolog_fileoption peut être utilisée pour contrôler le format de l'ID de session.

    Les journaux de sortie peuvent être affichés avec l'utilitaire sudoreplay (8), qui peut également être utilisé pour répertorier ou rechercher les journaux disponibles.

MISE EN ŒUVRE: Version Sudo au moins: 1.7.4p4 nécessaire.

/etc/sudoersmodifcation: Tout ce que vous devez faire est d'ajouter deux balises à toutes les entrées sudoers requises (où "su" est spécifié, soit avec une commande soit avec un alias). LOG_INPUT et LOG_OUTPUT.

Exemple:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Ajoutez la structure de répertoire de journaux par défaut suivante à sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}
Mark Wagner
la source
c'est génial, mais ne fonctionne pas sur les anciens systèmes ..: \
newuser999
Ouais peut-être créer un package d'une version sudo actuelle ou mettre à niveau le système?
Martin M.
13

Votre grepquand faire sudo su -échoue parce que vous ne courez pas echo 1234567zz, vous courez su -, ce qui lance un shell. Le shell exécute alors votre echo.

Ceci est délibéré, et la journalisation de chaque exécution de commande unique inonderait votre syslog d'informations inutiles (il y a généralement des tonnes de programmes qui s'exécutent dans les coulisses que vous ne voyez pas normalement).

Si vous changez votre grep en grep 'COMMAND=/bin/su -' *vous le verrez.


sudo su -est également une utilisation inutile de su. sudo -ifait la même chose.

Patrick
la source
mais comment puis-je enregistrer le "sudo su -"?
newuser999
1
Il est enregistré. Avez-vous essayé le grep 'COMMAND=/bin/su -' *(ou sans caractère générique:) grep 'COMMAND=/bin/su -' /var/log/auth.log?
Patrick
J'ai mis à jour la question. quoi d'autre dois-je prouver que lors de l'utilisation de "sudo su -" les commandes ne sont pas enregistrées ??
newuser999
4
La commande ( sudo -) est enregistrée et votre sortie mise à jour le montre. C'est tout ce dont nous parlons ici. Les autres commandes, telles que celles echoaprès avoir changé d'utilisateur sudo -, ne sont pas des commandes sudo et, par conséquent (selon ma réponse) ne sont pas connectées auth.log. Seules les commandes individuelles explicitement préfacées par sudoseront enregistrées. sudo echoEst donc enregistré, mais ce echon'est pas le cas, même si vous êtes passé au superutilisateur.
goldilocks
12

Dans une complexité croissante, voici trois façons de consigner les commandes émises dans le "sudo su -":

  1. Comptez sur l'historique des commandes bash
  2. Installer un wrapper de journalisation execve
  3. Utilisez l'audit de SELinux

Quant à ce qui convient, cela dépend vraiment de ce que vous essayez d'accomplir avec la journalisation.

1) Historique des commandes Bash

Vous souhaitez configurer la fonctionnalité d'historique pour garantir le maintien de lignes suffisantes, sans remplacer les différentes sessions, sans ignorer les commandes et les horodatages appropriés. (Voir les variables HIST * dans le manuel bash ). Subverti facilement en modifiant le fichier d'historique, en manipulant l'environnement ou en exécutant un autre shell.

2) exécuter un wrapper

snoopylogger en est un. Ajoutez une vérification /etc/profileque la bibliothèque de l'enregistreur se trouve dans la carte mémoire du processus ( /proc/<pid>/maps), et sinon, définissez LD_PRELOADet redémarrez (avec exec $SHELL --login "$@"). Alternativement, vous pouvez ajouter une entrée à /etc/ld.so.preload avec $LIB/snoopy.soou des chemins d'accès équivalents à vos versions 32/64 bits de snoopy.so.

Bien que plus difficile, la LD_PRELOADversion de la variable d'environnement de ce qui précède pourrait toujours être renversée en manipulant l'environnement d'exécution afin que le code snoopy ne s'exécute plus.

Syslog doit être envoyé hors boîte pour que le contenu soit fiable.

3) audité

Un peu plus simple à configurer que le wrapper execve, mais plus difficile à extraire les informations. C'est la réponse à la question que vous vous posez probablement: "Existe-t-il un moyen de consigner l'effet que l'utilisateur a eu sur un système après son émission sudo su -". Syslog doit être envoyé hors boîte pour que le contenu soit fiable.

Cette réponse Serverfault semble être une configuration assez complète à utiliser avec auditd.

Il y a quelques autres suggestions à une question similaire sur serverfault .

R Perrin
la source
9

Pourquoi?

Parce sudoque c'est la journalisation; il enregistre les commandes sudo. Dans le premier cas, sudo echoest enregistré. Dans le second cas, sudo suest connecté (recherchez-le dans /var/log/auth.log).

suest "changer d'utilisateur", par défaut sur root. Tout ce que vous faites après cela ne passe pas sudo. C'est la même chose que si vous vous étiez connecté en tant que root; la connexion elle-même est enregistrée, mais pas chaque commande.

boucle d'or
la source
5

Comme d'autres l'ont dit, sudoje ne peux pas faire ça.

Utilisez plutôt auditd. Si vous voulez enregistrer tout ce qui est fait par root (y compris par exemple les choses faites par crontab), utilisez ceci:

sudo auditctl -a exit,always -F euid=0

ETA: Notez que tout enregistrer aura un impact sur les performances, vous voudrez donc probablement les limiter un peu. Voir man auditctlpour des exemples.

Si vous souhaitez uniquement consigner les appels système où l'ID de connexion d'origine n'est pas root, utilisez-le à la place:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Les journaux se retrouvent généralement dans /var/log/audit/audit.log. Vous pouvez les rechercher avec ausearch.

Il y a plus d'informations dans les pages de manuel pour auditctl, audit.ruleset ausearch.

Jenny D
la source
2
Oh, pour que les journaux d'audit soient fiables, ils doivent être envoyés à un serveur distinct. Aucun journal résidant sur la machine sur laquelle un utilisateur non fiable a root ne peut pas être approuvé.
Jenny D
même alors, vous ne pouvez pas faire confiance à ce qui sort ou ne sort pas d'un serveur compromis.
Matt
Mais vous aurez une trace jusqu'au moment où elle est compromise.
Jenny D
2
Ce qui, dans le cas de l'op, est techniquement dès qu'ils ont couru sudo su -, vous êtes donc de retour à la case départ
Matt
Non fiable n'est pas la même chose que compromis. Il n'est pas compromis tant qu'ils ne font pas quelque chose de néfaste, dans lequel le journal d'audit sur le serveur distant vous montrera ce qui a été fait et par qui - y compris qui était l'audit désactivé. Et même en dehors de cela, un journal distant aidera lorsque quelqu'un a supprimé le journal local par erreur ou pour se protéger du blâme pour une erreur.
Jenny D
2

sudo su -sera dans ~/.bash_historysi votre shell est bash.

echo 1234567zzsera dans /root/.bash_historysi le shell de root est bash.

Une explication de cela a déjà été publiée par goldilocks.

YoMismo
la source
2

Souhaitez-vous que su se connecte parce que vous pensez qu'il s'agit d'une faille de sécurité? Avez-vous pensé à cette commande? sudo bashtout aussi mauvais à mon humble avis.

Si vous vous inquiétez de ce que les gens peuvent faire avec sudo, vous devrez restreindre son utilisation. Vous pouvez également restreindre les commandes qu'ils peuvent exécuter. Restreignez l'accès à / bin / su si cela vous inquiète.

X Tian
la source
1

Et ça:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

ou

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

ou longue ligne:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E préserve l'environnement PROMPT_COMMAND est exécuté avant chaque invite

Costa
la source
le premier ne me donne pas de console ET si je mets le second dans /root/.bashrc alors je dois appuyer sur CTRL + C si je veux obtenir la console racine après un "sudo su -": D toutes les chances pour corriger cela (ou pour y ajouter la fonction "date"?). Merci beaucoup!
newuser999
Je crains que vous n'en ayez abusé. Modifié pour le rendre plus explicite.
Costa
1

Si cela vous aide, vous pouvez utiliser l'option "NOEXEC" des sudoers.

Vous devez le définir comme

USER_NAME         ALL=(ALL) NOEXEC : ALL

Cela empêchera les échappements du shell et l'utilisateur ne pourra pas utiliser sudo -i ou sudo -s ou sudo su -

Cela présente un inconvénient, cependant, tout échappement du shell sera désactivé. pour exécuter un script à partir d'un script sera également refusé.

ankidaemon
la source
0

Ne compliquons pas cela: chaque fois qu'il sudoest appelé, il signale ce fait dans un fichier /var/log(sur votre système auth.log, sur ma boîte OS X, c'est system.log). sudorapporte ses arguments de ligne de commande, mais il n'a aucune connaissance de ce qui pourrait se produire à l'intérieur d'une commande interactive comme su.

Cela ne signifie pas qu'il n'y a pas d'enregistrement de ce qui se passe dans un sous-shell racine: les commandes du shell sont enregistrées dans l'historique du shell. Sur mon système, l'enregistrement de l'historique de root est activé par défaut, donc tout ce que j'ai à faire est de chercher ~root/.sh_historyun enregistrement de ce qui a été fait (à moins que quelqu'un ne l'ait falsifié, bien sûr, mais il pourrait tout aussi bien le falsifier /var/log).

Je pense que c'est la meilleure solution pour vous. Sinon, allez en ville avec auditd, comme l'a suggéré @Jenny.

PS. Si l'historique de root n'est pas déjà activé, son activation dépend du shell qu'il utilise. Pour bash, définissez HISTORYet HISTFILESIZEsur un nombre suffisamment grand (par défaut 500, mon manuel dit). Si vous le souhaitez, vous pouvez spécifier où l'historique est enregistré en définissant HISTFILEun chemin (par défaut $HOME/.sh_history)

alexis
la source
0

Vous voudrez peut-être créer un script de votre session en utilisant script(1):

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

Maintenant, vous pouvez grep(notez que les #invites sont réellement enregistrées dans /tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

Alternativement, vous pouvez même regarder à nouveau toute la session avec scriptreplay(1):

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

Le fichier /tmp/my_typescript.timingcontient des informations lorsque chaque commande a été invoquée. Il existe d'autres outils comme ttyrecou shelrqui ont encore plus de cloches et de sifflets.

tkrennwa
la source