По причинам, связанным с проверкой конфигурации, я хочу иметь возможность искать в моей файловой системе ext3 файлы, для которых установлен неизменный атрибут (через chattr +i
). Я не могу найти какие-либо варианты find
или аналогичные, которые делают это. На данный момент, я боюсь, мне придется написать свой собственный скрипт для разбора lsattr
вывода для каждого каталога. Есть ли стандартная утилита, которая обеспечивает лучший способ?
17
Ответы:
Это может быть частично выполнено путем передачи
grep
команды вlsattr
команду.Тем не менее, я считаю, что когда вы упоминаете всю
ext3
файловую систему, в которую может быть включен поиск/proc
,/dev
и некоторые другие каталоги, которые, если сообщают о какой-либо ошибке, вы просто хотите игнорировать. Вы, вероятно, можете запустить команду как,Возможно, вы захотите сделать
grep
это немного более строгим, используяgrep
средство PCRE для более явного соответствия "-i-".Это будет работать в таких ситуациях, как это:
Но несовершенен. Если вокруг неизменяемого флага включены дополнительные атрибуты, то мы не будем их сопоставлять, и это будут одурачены файлами, имена которых также соответствуют указанному выше шаблону, например, так:
Мы можем немного ужесточить шаблон так:
Но он все еще слишком хрупок и потребует дополнительной настройки в зависимости от файлов в вашей файловой системе. Не говоря уже о том, что @StephaneChazeles упомянул в комментариях, что это может быть довольно легко реализовано путем включения новых строк с именем файла, чтобы обойти вышеуказанный шаблон
grep
.Ссылки
https://groups.google.com/forum/#!topic/alt.os.linux/LkatROg2SlM
источник
-i-
свое имя (в системе, в которой я в настоящий момент вошел 34). Вы, вероятно, захотите и этот-a
вариант+i
должно быть в первом примере? Это не работает для меня. Кроме того, grepping для-i-
предполагает, что атрибуты, которые появляются рядом сi
(например,a
), не установлены.^....i
? Или, по крайней мере, что-то вроде,^[^ ]*i
еслиi
может быть в другом положении, чем пятый.Учитывая, что целью сценария является аудит, особенно важно правильно обрабатывать произвольные имена файлов, например, имена, содержащие переводы строк. Это делает невозможным использование
lsattr
нескольких файлов одновременно, поскольку в этом случае выводlsattr
может быть неоднозначным.Вы можете рекурсию с
find
и позвонитьlsattr
по одному файлу одновременно. Это будет довольно медленно, хотя.Я рекомендую использовать менее капризный язык, такой как Perl, Python или Ruby, и выполнять работу
lsattr
самостоятельно.lsattr
работает, выпускаяFS_IOC_GETFLAGS
системный вызов ioctl и извлекая флаги inode файла . Вот доказательство концепции Python.источник
FS_IOC_GETFLAGS
есть0x80046601
.FS_IOC_GETFLAGS
зависит отsizeof(long)
. См , например , следующая команда Баша , чтобы выяснить , что макрос в C:gcc -E - <<< $'#include <linux/fs.h>\nFS_IOC_GETFLAGS' | tail -n1
. Я получил от него следующее выражение:,(((2U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((1)) << 0) | ((((sizeof(long)))) << ((0 +8)+8)))
что упрощает до(2U << 30) | ('f' << 8) | 1 | (sizeof(long) << 16)
.Чтобы иметь дело с произвольными именами файлов (включая те, которые содержат символы новой строки), обычная хитрость заключается в том, чтобы искать файлы внутри,
.//.
а не.
. Поскольку//
при обходе дерева каталогов обычно это не происходит, вы уверены, что в выходных данных (или здесь ) появляется//
сигнал начала нового имени файла .find
lsattr -R
Обратите внимание, что выходные данные по-прежнему будут разделены новой строкой. Если вам нужно постобработать его, вам придется адаптировать его. Например, вы можете добавить a,
-v ORS='\0'
чтобы иметь возможность передавать его в GNUxargs -r0
.Также обратите внимание, что
lsattr -R
(по крайней мере, 1.42.13) не может сообщить флаги файлов, путь которых больше, чем PATH_MAX (обычно 4096), поэтому кто-то может скрыть такой неизменный файл, переместив его родительский каталог (или любой из компонентов пути, которые приводят к это, за исключением самого себя, поскольку это является неизменным) в очень глубокий каталог.Обходной путь будет использовать
find
с-execdir
:Теперь, с
-print0
, это пост-процессинг, но если вы собираетесь что-то делать с этими путями, обратите внимание, что любой системный вызов на пути к файлам, превышающим PATH_MAX, все равно будет неудачным, и компоненты каталога могли бы быть переименованы в интервале.Если мы хотим получить надежный отчет о дереве каталогов, который может быть записан другими, есть еще несколько проблем, присущих самой
lsattr
команде, о которых нам нужно упомянуть:lsattr -R .
прохождения дерева каталогов, это зависит от условий гонки. Можно сделать так, чтобы он спускался в каталоги за пределами дерева каталогов, на.
которое маршрутизируется , заменяя некоторые каталоги символическими ссылками в нужный момент.lsattr -d file
имеет состояние гонки. Эти атрибуты применимы только к обычным файлам или каталогам. Так чтоlsattr
делаетlstat()
первым , чтобы проверить , что файл правых типов , а затем делаетopen()
затем ,ioctl()
чтобы извлечь атрибуты. Но это вызываетopen()
безO_NOFOLLOW
(ни O_NOCTTY). Кто-то может заменитьfile
символическую ссылку,/dev/watchdog
например, междуlstat()
иopen()
и привести к перезагрузке системы. Он должен делатьopen(O_PATH|O_NOFOLLOW)
затемfstat()
,openat()
иioctl()
здесь , чтобы избежать условий гонки.источник
Спасибо Рамешу, Слм и Стефану за то, что они указали мне правильное направление (мне не хватало
-R
переключателяlsattr
). К сожалению, ни один из ответов до сих пор не работал правильно для меня.Я придумал следующее:
Это защищает от перевода строки, используемого для отображения файла как неизменяемого, если это не так. Он не защищает от файлов, которые установлены как неизменяемые и имеют новые строки в именах файлов. Но так как такой файл должен быть создан таким образом root, я могу быть уверен, что таких файлов не существует в моей файловой системе для моего варианта использования. (Этот метод не подходит для обнаружения вторжений в случаях, когда пользователь root может быть скомпрометирован, но при этом ни тот, ни другой не использует ту же системную
lsattr
утилиту, которая также принадлежит тому же пользователю root).источник
Использование
find -exec
слишком медленно, синтаксический анализ выводаlsattr
является ненадежной аналогично доказательствуls
, используя Python , как и в ответ Жиля требует , чтобы выбрать константу вioctl
зависимости от того , интерпретатор Python является 32- или 64-разрядный ...Проблема более или менее низкоуровневая, поэтому давайте перейдем на более низкий уровень: C ++ не так уж и плох, как язык сценариев :) В качестве бонуса, он имеет доступ к системным заголовкам C с полной мощью препроцессора C.
Следующая программа ищет неизменяемые файлы, находящиеся в одной файловой системе, т.е. никогда не пересекает точки монтирования. Чтобы найти видимое дерево, пересекая точки монтирования по мере необходимости, уберите
FTW_MOUNT
флаг вnftw
вызове. Также это не следует за символическими ссылками. Чтобы следовать за ними, снимитеFTW_PHYS
флажок.источник
Вместо того, чтобы передать вывод в grep, почему бы просто не использовать awk, чтобы соответствовать только «i» в первом поле вывода?
Фактически, я запускаю это ежедневно через cron, чтобы сканировать каталог / etc на сотнях серверов и отправлять вывод в syslog. Затем я могу создать ежедневный отчет через Splunk:
источник
/etc
. Но обе команды неправильно находят неизменный файл, созданный с помощьюtouch `"echo -e "bogus\n---------i---e-- changeable"`"
touch "`echo -e 'bogus\n---------i---e-- changeable'`"
Очень просто, перейдите в папку подозреваемых и выполните команду:
источник