Как выполняется поиск файлов и каталогов по какому-либо атрибуту
Обновлено: 21.11.2024
В следующих примерах показано использование команды ldapsearch с различными параметрами поиска. Во всех этих примерах предполагается, что ваш текущий рабочий каталог — install-dir/bin (install-dir\bat на системы Windows).
Следующие пункты относятся ко всем примерам в этом разделе:
Если в примере не указана область (с параметром --searchScope или -s), ldapsearch предполагает, что область subordinate или sub, который возвращает полное поддерево базового DN.
Если атрибуты не указаны, команда возвращает все атрибуты и их значения.
Если --bindDN и --bindPassword не указаны, поиск использует анонимную привязку.
Если не указано --hostname, используется значение по умолчанию (localhost).
Примечание. Многие операционные системы UNIX и Linux предоставляют установленную версию общих инструментов LDAP-клиента, таких как ldapsearch, ldapmodify и ldapdelete в каталоге /usr/bin. Вы должны использовать ldapsearch, поставляемый с сервером каталогов, для поиска на сервере каталогов. Вы можете проверить, какую версию ldapsearch вы используете, введя следующую команду:
Если вы используете ldapsearch в /usr/bin, поместите install-dir/bin в начало вашего $PATH.
Чтобы вернуть все записи
Вы можете вернуть все записи ниже указанного DN филиала, используя фильтр поиска присутствия (objectclass=*). Фильтр поиска ищет все записи, которые имеют один или несколько классов объектов с любым значением. Поскольку все записи имеют несколько определений классов объектов, фильтр гарантирует, что будут возвращены все записи.
- Выполните команду ldapsearch с фильтром (objectclass=*).
Чтобы найти определенного пользователя
Вы можете использовать фильтр равенства, чтобы найти определенного пользователя в каталоге. В этом примере выполняется поиск сотрудника с обычным именем "Фрэнк Альберс".
- Выполните команду ldapsearch с фильтром "(cn=Frank Albers)".
Поиск определенных атрибутов пользователя
Вы можете использовать фильтр равенства, чтобы найти атрибут(ы) записи в каталоге. Укажите один или несколько атрибутов, поместив их после фильтра поиска. В этом примере атрибуты telephoneNumber и mail находятся в записи пользователя для Frank Albers.
- Выполните команду ldapsearch с фильтром "(cn=Frank Albers)" и соответствующими атрибутами.
Выполнение поиска с базовой областью действия
Вместе с DN базы поиска область определяет, какая часть информационного дерева каталогов (DIT) проверяется. Базовая область проверяет только уровень, указанный базовым DN (и ни одну из его дочерних записей). Вы указываете базовую область с помощью параметра --searchScope base или его краткого эквивалента -s base.
- Выполните команду ldapsearch с параметром --searchScope base.
Выполнение поиска с одноуровневой областью действия
Одноуровневая область проверяет только уровень непосредственно ниже базового DN. Вы указываете одноуровневую область действия с помощью параметра --searchScope one или его краткого эквивалента -s one. В этом примере отображаются записи сразу после базового DN.
- Выполните команду ldapsearch с параметром --searchScope one.
Выполнение поиска в области поддерева
Область поддерева проверяет поддерево ниже базового DN и включает базовый уровень DN. Вы указываете область поддерева с помощью параметра --searchScope sub или его краткого эквивалента -s sub. Если вы не укажете --searchScope, ldapsearch предполагает область поддерева.
- Выполните команду ldapsearch с параметром --searchScope sub.
Чтобы вернуть только имена атрибутов
Команда ldapsearch предоставляет удобную возможность проверить наличие атрибута в каталоге. Используйте параметр --typesOnly или его краткий эквивалент -A, чтобы указать серверу каталогов отображать имена атрибутов, но не их значения.
- Выполните команду ldapsearch с параметром --typesOnly.
Возврат только атрибутов пользователя
Вы можете использовать ldapsearch для возврата только пользовательских атрибутов для записей, соответствующих фильтру поиска, добавив звездочку *. Пользовательские атрибуты (в отличие от операционных атрибутов) хранят информацию о пользователе в каталоге. Если вы не укажете звездочку, атрибуты пользователя будут возвращены по умолчанию. Вы должны экранировать звездочку соответствующим образом для вашей оболочки.
- Выполните команду ldapsearch, указав '*' после фильтра поиска.
Чтобы вернуть только базовые DN
Вы можете использовать ldapsearch, чтобы возвращать только базовые DN для записей, соответствующих фильтру поиска, включив строку 1.1 после фильтра поиска.
- Выполните команду ldapsearch, указав 1.1 после фильтра поиска.
Поиск определенных классов объектов
Можно выполнить поиск по всем записям, в которых на атрибуты ссылается определенный класс объектов, добавив символ @ перед именем класса объектов. Например, чтобы просмотреть все записи с классом объектов groupOfUniqueNames, добавьте @groupOfUniqueNames после фильтра поиска.
- Выполните команду ldapsearch, указав @ и класс объекта после фильтра поиска.
Чтобы вернуть количество всех записей в каталоге
Команда ldapsearch предоставляет параметр --countries для возврата общего количества записей в каталоге. Сервер каталогов возвращает все записи, соответствующие фильтру поиска, и отображает их общее количество в последней строке. В этом примере определяется количество записей о сотрудниках, которые находятся в Цинциннати.
- Выполните команду ldapsearch с параметром --countries.
Выполнение поиска с составным фильтром
Составные поисковые фильтры включают несколько проверок с использованием логических операторов И (&), ИЛИ (|) или НЕ (!). Вы можете комбинировать и вкладывать логические операторы и фильтры вместе для формирования сложных выражений. В следующем примере выполняется поиск всех записей для сотрудников с именем Дженсен, которые работают в Купертино. Команда возвращает два результата.
- Выполните команду ldapsearch с составным поисковым фильтром.
Выполнение поиска с использованием файла фильтра
Вы можете разместить сложные или несколько фильтров в файле, используя параметр --filename. Если файл содержит несколько фильтров, файл должен быть структурирован с одним фильтром на строку. Поиски выполняются с использованием одного и того же соединения с сервером каталогов в том порядке, в котором они появляются в файле фильтра. Если используется параметр --filename, все завершающие параметры рассматриваются как отдельные атрибуты. В противном случае первым завершающим параметром должен быть поисковый фильтр.
В этом примере во всех записях выполняется поиск сотрудников с именем Дженсен, которые работают в Купертино и не работают в бухгалтерии.
-
Создайте файл фильтра.
Для этого примера создайте файл с именем myfilter.txt со следующим содержимым:(&(sn=jensen)(l=Cupertino)(!(ou=Accounting)))
Чтобы ограничить количество записей, возвращаемых при поиске
Вы можете ограничить количество возвращаемых записей, используя параметр -z или --sizeLimit. Если количество записей превышает указанное число, поиск возвращает указанное количество записей, а затем возвращает ошибку, сообщающую о превышении ограничения размера. В следующем примере запрашивается не более 5 записей.
В целях аудита конфигурации я хочу иметь возможность искать в файловой системе ext3 файлы с установленным неизменяемым атрибутом (через chattr +i ). Я не могу найти какие-либо варианты для поиска или аналогичные, которые делают это. На данный момент, я боюсь, мне придется написать свой собственный скрипт для анализа вывода lsattr для каждого каталога. Есть ли стандартная утилита, которая предлагает лучший способ?
Я должен был уточнить, что в моем случае я провожу аудит только для управления конфигурацией, а не для обнаружения вторжений, поэтому мне не нужно слишком беспокоиться о новых строках, поскольку я знаю, что имена файлов, с которыми я работаю, выиграли. их нет. Тем не менее, стоит помнить о проблеме с новой строкой, поэтому я оставлю свой вопрос как есть.
8 ответов 8
Частично этого можно добиться, передав команду lsattr через команду grep.
Тем не менее, я считаю, что когда вы упоминаете всю файловую систему ext3, поиск может включать /proc , /dev и некоторые другие каталоги, которые могут сообщать об ошибках, которые вы просто хотите игнорировать. Вероятно, вы можете запустить команду как,
Возможно, вы захотите сделать grep немного более строгим, используя средство PCRE grep для более точного соответствия "-i-".
Это будет работать в следующих ситуациях:
Но несовершенен. Если вокруг неизменяемого флага включены дополнительные атрибуты, мы не будем их сопоставлять, и это будет обмануто файлами, чьи имена также соответствуют приведенному выше шаблону, например:
Мы можем немного сузить шаблон следующим образом:
Но он все еще слишком хрупок и потребует дополнительной настройки в зависимости от файлов в вашей файловой системе.Не говоря уже о том, что @StephaneChazeles упомянул в комментариях, что это можно довольно легко обыграть, включив символы новой строки с именем файла, чтобы обойти приведенный выше шаблон в grep .
Ссылки
Возможно, это не очень хорошо для аудита, так как при таком подходе можно подделать или скрыть неизменяемый файл, добавив символы новой строки в имя файла. Кроме того, имена файлов нередко имеют -i- в своем имени (в системе, в которую я сейчас вошел, их 34). Возможно, вам также понадобится опция -a
Просто из любопытства, для чего нужен +i в первом примере? Это не работает для меня. Кроме того, поиск -i- предполагает, что атрибуты, расположенные рядом с i (например, a ), не установлены.
Я решил использовать ключ -l, чтобы упростить задачу: lsattr -R -l | grep "Immutable" (ладно, "Immutable" может быть в имени файла, но это очень сомнительно)
сделайте это lsattr -R -l | grep " Immutable" (с пробелом для меньшего количества ложных срабатываний имени файла по указанной причине.)
Почему бы просто не использовать grep для ^. я? Или, по крайней мере, что-то вроде ^[^ ]*i, если i может стоять не на пятой позиции.
Учитывая, что целью скрипта является аудит, особенно важно правильно работать с произвольными именами файлов, например. с именами, содержащими новые строки. Это делает невозможным одновременное использование lsattr для нескольких файлов, поскольку в этом случае вывод lsattr может быть неоднозначным.
Вы можете выполнять рекурсию с помощью find и вызывать lsattr для одного файла за раз. Однако это будет довольно медленно.
Я рекомендую использовать менее капризный язык, такой как Perl, Python или Ruby, и выполнять работу с lsattr самостоятельно. lsattr работает, выдавая системный вызов FS_IOC_GETFLAGS ioctl и получая флаги inode файла. Вот доказательство концепции Python.
Значение FS_IOC_GETFLAGS зависит от sizeof(long) . См., например. следующую команду bash, чтобы узнать, во что расширяется макрос в C: gcc -E - . У меня получилось следующее выражение: (((2U) , которое упрощается до (2U .
Спасибо Ramesh, slm и Stéphane за то, что указали мне правильное направление (мне не хватило ключа -R для lsattr ). К сожалению, ни один из ответов пока не помог мне правильно.
Я придумал следующее:
Это защищает от использования новых строк, чтобы сделать файл неизменяемым, когда это не так. Он не защищает от файлов, которые определены как неизменяемые и имеют символы новой строки в именах файлов. Но поскольку такой файл должен быть создан пользователем root, я могу быть уверен, что таких файлов не существует в моей файловой системе для моего варианта использования. (Этот метод не подходит для обнаружения вторжений в случаях, когда пользователь root может быть скомпрометирован, но в этом случае не используется утилита lsattr той же системы, которая также принадлежит тому же пользователю root.)
Только пользователь root может добавить неизменяемый бит в файл, но потенциально другие пользователи могут позже переименовать компоненты пути, которые ведут к этим файлам, поэтому путь к файлу может содержать новую строку. Также пользователь может создать путь к файлу (не неизменяемый), который обманет ваш скрипт, заставив его думать, что другой файл неизменен.
Чтобы иметь дело с произвольными именами файлов (в том числе с именами, содержащими символы новой строки), обычным приемом является поиск файлов внутри .//. вместо . . Поскольку при обходе дерева каталогов обычно // это не может произойти, вы можете быть уверены, что // сигнализирует о начале нового имени файла в результатах поиска (или здесь lsattr -R ).
Обратите внимание, что выходные данные по-прежнему будут разделены новой строкой. Если вам нужно постобработать его, вам придется его адаптировать. Например, вы можете добавить -v ORS='\0', чтобы передать его в xargs GNU -r0 .
Также обратите внимание, что lsattr -R (по крайней мере 1.42.13) не может сообщать о флагах файлов, путь которых превышает PATH_MAX (обычно 4096), поэтому кто-то может скрыть такой неизменяемый файл, переместив его родительский каталог (или любой из компонентов пути, ведущих к нему, за исключением самого себя, поскольку он неизменяемый) в очень глубокий каталог.
Можно было бы использовать find с -execdir :
Теперь с -print0 это можно постобработать, но если вы собираетесь что-то делать с этими путями, обратите внимание, что любой системный вызов с путями к файлам, превышающими PATH_MAX, по-прежнему будет давать сбой, а компоненты каталога могут были переименованы в интервале.
Если мы хотим получить надежный отчет о дереве каталогов, которое потенциально доступно для записи другим пользователям, есть еще несколько проблем, присущих самой команде lsattr, о которых нам нужно упомянуть:
Вы можете искать запись или несколько записей в каталоге LDAP. LDAP BC поддерживает следующие атрибуты поиска:
Используйте фильтр поиска, чтобы указать контекст или первую запись для поиска, область поиска или любые другие критерии поиска и границы, которыми ограничен поиск.
Используйте элемент управления страницы, чтобы указать набор элементов управления.
Используйте сортировку, чтобы запросить сортировку значений поиска в соответствии с указанными атрибутами.Задайте в поле Атрибуты сортировки символьную строку, разделенную вертикальной чертой (|), состоящую из атрибутов, чтобы использовать управление сортировкой.
Например, задайте SortAttributes со строкой cn|mail для сортировки записей сначала по cn, а затем по почте.
Вы можете искать атрибут среди множества серверов LDAP, используя атрибут ссылки поиска, чтобы настроить ссылку LDAP на другой сервер LDAP. Это означает, что после того, как при поиске не удается найти строку поиска на одном сервере, выполняется автоматический поиск на указанном сервере. Используйте утилиту командной строки RCF для создания файла учетных данных, который содержит соответствующие учетные данные направления. Реферал поиска поддерживает следующие атрибуты:
Игнорировать — игнорирует реферальный сервер.
Follow – подключается к упомянутой системе и продолжает операцию поиска.
Throw – создает реферальное исключение, которое клиент может перехватить и инициировать любое действие.
Вы можете использовать любой из следующих методов поиска LDAP:
Метод поиска OBJECT_SCOPE
Метод OBJECT_SCOPE определяет метод поиска только в пределах именованного объекта, определенного с помощью ContextName. Область объекта сравнивает именованный объект по определенному атрибуту или значению.
ONELEVEL_SCOPE Метод поиска
Метод ONELEVEL_SCOPE определяет метод поиска записей, которые находятся на один уровень ниже именованного объекта.
Метод поиска SUBTREE_SCOPE
Метод SUBTREE_SCOPE определяет метод поиска для всех записей, начинающихся с именованного объекта, и всех потомков ниже именованного объекта.
Меня часто интересовало, как использовать фильтры поиска Windows. Доступная документация крайне ограничена, но возможности ее использования весьма обширны.
Когда я что-то печатаю, единственными поисковыми фильтрами, которые я вижу, являются "Дата изменения" и "Размер". Поиск в Google показывает мне несколько других вариантов, которые иногда работают. Каждый раз, когда я пытаюсь использовать его, я размышляю: «Какие поисковые фильтры я могу использовать и какие параметры поддерживает каждый фильтр?». У кого-нибудь есть идеи, где найти обширный список или как настроить поиск, чтобы он открывал мне раскрывающийся список возможностей?
Чтобы что-то найти, я всегда возвращаюсь к командной строке. Мне хотелось бы думать, что я могу поступить иначе.
2 ответа 2
Вместо "Фильтры поиска" ключевыми словами/фразами, которые вы действительно ищете, является "Расширенный синтаксис запроса".
Как всегда, за дополнительной помощью и подробностями можно обратиться к MSDN:
Кстати, если вам нужна гораздо лучшая поисковая утилита с поддержкой RegEx, попробуйте AstroGrep или Everything.
Для поиска на основе атрибутов файловой системы (например, скрытых, системных, только для чтения и т. д.) используйте интуитивно понятное, но по большей части недокументированное ключевое слово атрибутов. Как обсуждалось в этой теме на справочных форумах Windows 7, использование
Значения атрибутов файла (константы)
(Вышеупомянутые справочные форумы Windows 7 говорят, что FILE_ATTRIBUTE_ENCRYPTED равно 64, но на этой странице о команде ATTRIB указано, что это 16384. Мое тестирование (в Windows 7) показывает, что 16384 является правильным значением.) р>
Так, например, attribute:1 ищет файлы с установленным атрибутом READONLY. Только. Это не найдет файлы, у которых установлены атрибуты READONLY и ARCHIVE, используйте для этого атрибуты: 33. Чтобы найти оба (т. е. файлы с установленным атрибутом READONLY, но не со скрытым, системным, зашифрованным, сжатым или любым другим экзотическим, расширенным атрибутом, независимо от состояния атрибута ARCHIVE), вы можете использовать
Но такой синтаксис быстро становится громоздким. К счастью, есть сокращенная форма:
Ключевые слова соединения/дизъюнкции ( AND и OR ) должны быть написаны с заглавной буквы; Ключевые слова поискового фильтра (свойства), такие как атрибуты (и имя файла, вид, тип, дата, дата изменения, размер, владелец, дата взятия, автор, заголовок и т. д.), не чувствительны к регистру. Кстати, если вам нравится больше печатать, вы можете сказать system.fileattributes вместо атрибутов .
Итак, вот числовые коды поиска для всех возможных поисков на основе атрибутов R , H и A. (+R представляет все файлы только для чтения, независимо от статуса H и A; +R -H — это пример выше — все нескрытые файлы только для чтения.)
Атрибуты (символические) Числовые атрибуты: значение(я)
+R (1 ИЛИ 3 ИЛИ 33 ИЛИ 35)
+R +H (3 ИЛИ 35)
+ R +H +A 35
+R +H -A 3
+R -H (1 ИЛИ 33)
+R -H +A 33
+R -H - A 1
+R +A (33 ИЛИ 35)
+R -A (1 ИЛИ 3)
-R (0 ИЛИ 2 ИЛИ 32 ИЛИ 34 ИЛИ 128)
- R +H (2 ИЛИ 34)
-R +H +A 34
-R +H -A 2
-R -H (0 ИЛИ 32 ИЛИ 128)
- R -H +A 32
-R -H -A (0 ИЛИ 128)
-R +A (32 ИЛИ 34)
-R -A (0 ИЛИ 2 ИЛИ 128) < br />+H (2 ИЛИ 3 ИЛИ 34 ИЛИ 35)
+H +A (34 ИЛИ 35)
+H -A (2 ИЛИ 3)
-H (0 ИЛИ 1 ИЛИ 32 ИЛИ 33 ИЛИ 128)
-H +A (32 ИЛИ 33)
-H -A (0 ИЛИ 1 ИЛИ 128)
+A (32 ИЛИ 33 ИЛИ 34 ИЛИ 35)
-A (0 ИЛИ 1 ИЛИ 2 ИЛИ 3 ИЛИ 128)
Читайте также: