Pour des raisons d'audit de configuration, je souhaite pouvoir rechercher dans mon système de fichiers ext3 des fichiers dont l'attribut immuable est défini (via chattr +i
). Je ne trouve aucune option find
ou similaire pour cela. À ce stade, je crains de devoir écrire mon propre script pour analyser la lsattr
sortie de chaque répertoire. Existe-t-il un utilitaire standard qui offre un meilleur moyen?
17
Réponses:
Cela peut être partiellement accompli en canalisant la
grep
commande pourlsattr
commander.Cependant, je pense que lorsque vous mentionnez l'ensemble
ext3
du système de fichiers que la recherche peut impliquer/proc
,/dev
ainsi que certains autres répertoires qui, s'ils signalent une erreur, vous souhaitez simplement ignorer. Vous pouvez probablement exécuter la commande en tant que,Vous voudrez peut-être rendre le
grep
un peu plus strict en utilisantgrep
la fonction PCRE de pour faire correspondre plus explicitement le "-i-".Cela fonctionnera alors pour des situations comme celle-ci:
Mais est imparfait. S'il y a des attributs supplémentaires activés autour de l'indicateur immuable, alors nous ne les ferons pas correspondre, et cela sera trompé par des fichiers dont les noms correspondent également au modèle ci-dessus, comme celui-ci:
Nous pouvons resserrer le modèle un peu plus comme ceci:
Mais il est toujours un peu trop fragile et nécessiterait des ajustements supplémentaires en fonction des fichiers de votre système de fichiers. Sans oublier que @StephaneChazeles a mentionné dans les commentaires que cela peut être joué assez facilement par l'inclusion de nouvelles lignes avec un nom de fichier pour contourner le modèle ci-dessus
grep
.Les références
https://groups.google.com/forum/#!topic/alt.os.linux/LkatROg2SlM
la source
-i-
leur nom (il y en a 34 sur le système sur lequel je suis actuellement connecté). Vous voudrez probablement aussi l'-a
option+i
le premier exemple? Ça ne marche pas pour moi. De plus, la recherche de-i-
suppose que les attributs qui apparaissent adjacents ài
(tels quea
) ne sont pas définis.^....i
? Ou au moins quelque chose comme^[^ ]*i
si lei
peut être dans une autre position que la cinquième.Étant donné que le but du script est l'audit, il est particulièrement important de traiter correctement les noms de fichiers arbitraires, par exemple les noms contenant des retours à la ligne. Cela rend impossible l'utilisation
lsattr
simultanée sur plusieurs fichiers, car la sortie delsattr
peut être ambiguë dans ce cas.Vous pouvez recurse
find
et appelerlsattr
sur un fichier à la fois. Ce sera assez lent cependant.Je recommande d'utiliser un langage moins grincheux comme Perl, Python ou Ruby et de faire le travail
lsattr
par vous-même.lsattr
fonctionne en émettant unFS_IOC_GETFLAGS
appel système ioctl et en récupérant les indicateurs d'inode du fichier . Voici une preuve de concept Python.la source
FS_IOC_GETFLAGS
est0x80046601
.FS_IOC_GETFLAGS
dépend desizeof(long)
. Voir par exemple la commande bash suivante pour savoir ce que les macro dans dilate C:gcc -E - <<< $'#include <linux/fs.h>\nFS_IOC_GETFLAGS' | tail -n1
. J'en ai tiré l'expression suivante:,(((2U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((1)) << 0) | ((((sizeof(long)))) << ((0 +8)+8)))
qui se simplifie en(2U << 30) | ('f' << 8) | 1 | (sizeof(long) << 16)
.Pour gérer les noms de fichiers arbitraires (y compris ceux contenant des caractères de nouvelle ligne), l' astuce habituelle consiste à rechercher des fichiers à l'intérieur
.//.
au lieu de.
. Étant donné que//
cela ne peut normalement pas se produire lors de la traversée de l'arborescence des répertoires, vous êtes sûr qu'un//
signale le début d'un nouveau nom de fichier dans la sortiefind
(ou icilsattr -R
).Notez que la sortie sera toujours séparée par des sauts de ligne. Si vous devez le post-traiter, vous devrez l'adapter. Par exemple, vous pouvez ajouter un
-v ORS='\0'
pour pouvoir le transmettre aux GNUxargs -r0
.Notez également que
lsattr -R
(au moins 1.42.13) ne peut pas signaler les indicateurs de fichiers dont le chemin est plus grand que PATH_MAX (généralement 4096), donc quelqu'un pourrait masquer un tel fichier immuable en déplaçant son répertoire parent (ou l'un des composants de chemin qui mènent à , sauf lui-même car il est immuable) dans un répertoire très profond.Une solution de contournement consisterait à utiliser
find
avec-execdir
:Maintenant, avec
-print0
, c'est post-processable, mais si vous avez l'intention de faire quoi que ce soit avec ces chemins, notez que tout appel système sur des chemins de fichier supérieurs à PATH_MAX échouera toujours et les composants de répertoire auraient pu être renommés dans l'intervalle.Si nous voulons obtenir un rapport fiable sur une arborescence de répertoires potentiellement accessible en écriture par d'autres, il y a quelques autres problèmes inhérents à la
lsattr
commande elle-même que nous devons mentionner:lsattr -R .
traverse l'arborescence des répertoires, il est soumis à des conditions de concurrence. On peut le faire descendre dans des répertoires en dehors de l'arborescence de répertoires routés.
en remplaçant certains répertoires par des liens symboliques au bon moment.lsattr -d file
une condition de course. Ces attributs ne s'appliquent qu'aux fichiers ou répertoires standard. Alors ,lsattr
fait unlstat()
premier à vérifier que le fichier est des bons types et neopen()
suiviioctl()
pour récupérer les attributs. Mais il appelleopen()
sansO_NOFOLLOW
(ni O_NOCTTY). Quelqu'un pourrait remplacerfile
par un lien symbolique/dev/watchdog
par exemple entre lelstat()
etopen()
et provoquer le redémarrage du système. Il faut le faireopen(O_PATH|O_NOFOLLOW)
suivifstat()
,openat()
etioctl()
ici pour éviter les conditions de course.la source
Merci à Ramesh, slm et Stéphane de m'avoir pointé dans la bonne direction (il me manquait le
-R
switch pourlsattr
). Malheureusement, aucune des réponses n'a jusqu'à présent fonctionné correctement pour moi.J'ai trouvé ce qui suit:
Cela protège contre les sauts de ligne utilisés pour faire apparaître un fichier comme immuable alors qu'il ne l'est pas. Il ne protège pas contre les fichiers qui sont définis comme immuables et qui ont des nouvelles lignes dans leurs noms de fichiers. Mais comme un tel fichier devrait être créé de cette façon par root, je peux être sûr que de tels fichiers n'existent pas sur mon système de fichiers pour mon cas d'utilisation. (Cette méthode ne convient pas à la détection d'intrusion dans les cas où l'utilisateur root peut être compromis, mais aucun n'utilise l'
lsattr
utilitaire du même système qui appartient également au même utilisateur root.)la source
L'utilisation
find -exec
est trop lente, l'analyse de la sortie delsattr
n'est pas fiable de la même manière que celle dels
, l'utilisation de Python comme dans la réponse de Gilles nécessite de choisir la constante pourioctl
selon que l'interpréteur Python est 32 ou 64 bits ...Le problème est plus ou moins bas, alors allons plus bas: C ++ n'est pas si mal comme langage de script :) En bonus, il a accès aux en-têtes C du système avec toute la puissance du préprocesseur C.
Le programme suivant recherche des fichiers immuables, en restant dans un système de fichiers, c'est-à-dire qu'il ne traverse jamais de points de montage. Pour rechercher l'arbre apparent, en traversant les points de montage si nécessaire, supprimez le
FTW_MOUNT
drapeau dans l'nftw
appel. De plus, il ne suit pas les liens symboliques. Pour les suivre, supprimez leFTW_PHYS
drapeau.la source
Au lieu de diriger la sortie vers grep, pourquoi ne pas simplement utiliser awk pour ne faire correspondre que le «i» dans le premier champ de la sortie?
En fait, je l'exécute quotidiennement via cron pour analyser le répertoire / etc sur des centaines de serveurs et envoyer la sortie à syslog. Je peux ensuite générer un rapport quotidien via Splunk:
la source
/etc
. Mais les deux commandes trouvent incorrectement un fichier non immuable créé avectouch `"echo -e "bogus\n---------i---e-- changeable"`"
touch "`echo -e 'bogus\n---------i---e-- changeable'`"
Très simple, allez dans le dossier suspect et exécutez la commande:
la source