Por razones de auditoría de configuración, quiero poder buscar en mi sistema de archivos ext3 archivos que tengan el conjunto de atributos inmutables (via chattr +i
). No puedo encontrar ninguna opción find
o similar que haga esto. En este punto, me temo que tendré que escribir mi propio script para analizar la lsattr
salida de cada directorio. ¿Existe una utilidad estándar que ofrezca una mejor manera?
17
Respuestas:
Se puede lograr parcialmente canalizando el
grep
comando allsattr
comando.Sin embargo, creo que cuando mencionas todo
ext3
el sistema de archivos, la búsqueda puede involucrar/proc
,/dev
y algunos otros directorios que si informan algún error solo quieres ignorar. Probablemente pueda ejecutar el comando como,Es posible que desee hacer
grep
un poco más estricto mediante el usogrep
de la función PCRE para que coincida más explícitamente con el "-i-".Esto funcionará para situaciones como esta:
Pero es imperfecto. Si hay atributos adicionales habilitados alrededor del indicador inmutable, entonces no los haremos coincidir, y esto se verá engañado por los archivos cuyos nombres coincidan también con el patrón anterior, como este:
Podemos ajustar el patrón un poco más de esta manera:
Pero todavía es un poco demasiado frágil y requeriría ajustes adicionales dependiendo de los archivos dentro de su sistema de archivos. Sin mencionar que @StephaneChazeles ha mencionado en los comentarios que esto se puede jugar con bastante facilidad mediante la inclusión de nuevas líneas con un nombre de archivo para omitir el patrón anterior
grep
.Referencias
https://groups.google.com/forum/#!topic/alt.os.linux/LkatROg2SlM
fuente
-i-
su nombre (hay 34 en el sistema en el que estoy conectado actualmente). Probablemente también querrás la-a
opción+i
supone que es en el primer ejemplo? A mi no me funciona. Además, grepping for-i-
supone que los atributos que aparecen adyacentes ai
(comoa
) no están configurados.^....i
? O al menos algo así como^[^ ]*i
sii
puede estar en otra posición que no sea la quinta.Dado que el propósito del script es la auditoría, es especialmente importante tratar correctamente con nombres de archivos arbitrarios, por ejemplo, con nombres que contienen líneas nuevas. Esto hace que sea imposible de usar
lsattr
en varios archivos simultáneamente, ya que la salida delsattr
puede ser ambigua en ese caso.Puede
find
recurrir y llamarlsattr
a un archivo a la vez. Sin embargo, será bastante lento.Recomiendo usar un lenguaje menos irritable como Perl, Python o Ruby y hacer el trabajo
lsattr
por ti mismo.lsattr
opera emitiendo unFS_IOC_GETFLAGS
syscall ioctl y recuperando los indicadores de inodo del archivo . Aquí hay una prueba de concepto de Python.fuente
FS_IOC_GETFLAGS
es0x80046601
.FS_IOC_GETFLAGS
depende desizeof(long)
. Véase por ejemplo el siguiente comando bash para averiguar cuál es el macro se expande en C:gcc -E - <<< $'#include <linux/fs.h>\nFS_IOC_GETFLAGS' | tail -n1
. Obtuve la siguiente expresión:,(((2U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((1)) << 0) | ((((sizeof(long)))) << ((0 +8)+8)))
que se simplifica a(2U << 30) | ('f' << 8) | 1 | (sizeof(long) << 16)
.Para tratar con nombres de archivos arbitrarios (incluidos los que contienen caracteres de nueva línea), el truco habitual es encontrar archivos dentro en
.//.
lugar de.
. Como//
normalmente no puede ocurrir al atravesar el árbol de directorios, está seguro de que//
indica el inicio de un nuevo nombre de archivo en la salidafind
(o aquílsattr -R
).Tenga en cuenta que la salida seguirá estando separada por una nueva línea. Si necesita procesarlo posteriormente, deberá adaptarlo. Por ejemplo, podría agregar un
-v ORS='\0'
para poder alimentarlo a GNUxargs -r0
.También tenga en cuenta que
lsattr -R
(al menos 1.42.13) no puede informar los indicadores de archivos cuya ruta es más grande que PATH_MAX (generalmente 4096), por lo que alguien podría ocultar un archivo tan inmutable moviendo su directorio principal (o cualquiera de los componentes de ruta que conducen a , excepto en sí mismo, ya que es inmutable) en un directorio muy profundo.Una solución alternativa sería usar
find
con-execdir
:Ahora, con
-print0
, eso es postprocesable, pero si tiene la intención de hacer algo con esas rutas, tenga en cuenta que cualquier llamada al sistema en rutas de archivos mayores que PATH_MAX todavía fallaría y los componentes del directorio podrían haber cambiado de nombre en el intervalo.Si queremos obtener un informe confiable sobre un árbol de directorios que otros usuarios puedan escribir, hay algunos problemas más inherentes al
lsattr
comando en sí que deberíamos mencionar:lsattr -R .
atraviesa el árbol de directorios está sujeto a condiciones de carrera. Uno puede hacer que descienda a directorios fuera del árbol de directorios enrutado.
reemplazando algunos directorios con enlaces simbólicos en el momento correcto.lsattr -d file
tiene una condición de carrera. Esos atributos solo son aplicables a archivos o directorios normales. Así quelsattr
hace unlstat()
primero para comprobar que el archivo es de los tipos correctos y luego noopen()
siguióioctl()
para recuperar los atributos. Pero llamaopen()
sinO_NOFOLLOW
(ni O_NOCTTY). Alguien podría reemplazarfile
con un enlace simbólico,/dev/watchdog
por ejemplo, entrelstat()
yopen()
y hacer que el sistema se reinicie. Debe hacerloopen(O_PATH|O_NOFOLLOW)
seguidofstat()
,openat()
yioctl()
aquí para evitar las condiciones de carrera.fuente
Gracias a Ramesh, slm y Stéphane por señalarme en la dirección correcta (me faltaba el
-R
interruptorlsattr
). Desafortunadamente, ninguna de las respuestas hasta ahora funcionó correctamente para mí.Se me ocurrió lo siguiente:
Esto protege contra las nuevas líneas que se utilizan para hacer que un archivo parezca inmutable cuando no lo es. No , no protege contra los archivos que están establecidos como inmutables y tienen nuevas líneas en sus nombres de archivo. Pero dado que dicho archivo tendría que ser creado de esa manera por root, puedo estar seguro de que dichos archivos no existen en mi sistema de archivos para mi caso de uso. (Este método no es adecuado para la detección de intrusiones en los casos en que el usuario raíz puede verse comprometido, pero tampoco está utilizando la misma
lsattr
utilidad del sistema que también es propiedad del mismo usuario raíz).fuente
El uso
find -exec
es demasiado lento, la salida de análisis de nolsattr
es confiable de manera similar a la dels
, usar Python como en la respuesta de Gilles requiere elegir la constanteioctl
dependiendo de si el intérprete de Python es de 32 o 64 bits ...El problema en cuestión es más o menos de bajo nivel, así que pasemos a un nivel inferior: C ++ no es tan malo como un lenguaje de script :) Como beneficio adicional, tiene acceso a los encabezados C del sistema con toda la potencia del preprocesador C.
El siguiente programa busca archivos inmutables, permaneciendo dentro de un sistema de archivos, es decir, nunca cruza los puntos de montaje. Para buscar el árbol aparente, cruzando puntos de montaje según sea necesario, elimine la
FTW_MOUNT
bandera en lanftw
llamada. Además, no sigue enlaces simbólicos. Para seguirlos, elimine laFTW_PHYS
bandera.fuente
En lugar de canalizar la salida a grep, ¿por qué no usar awk para que solo coincida con la 'i' en el primer campo de la salida?
De hecho, ejecuto esto diariamente a través de cron para escanear el directorio / etc en cientos de servidores y enviar la salida a syslog. Entonces puedo generar un informe diario a través de Splunk:
fuente
/etc
. Pero ambos comandos encuentran incorrectamente un archivo no inmutable creado contouch `"echo -e "bogus\n---------i---e-- changeable"`"
touch "`echo -e 'bogus\n---------i---e-- changeable'`"
Muy simple, vaya a la carpeta sospechosa y ejecute el comando:
fuente