Пример создания и применения конфигурации для сбора файловых данных

Для сбора данных о файлах на конечных устройствах используется формула file-find, реализующая настраиваемый поиск по файловой системе на базе модуля file.find. Она позволяет проводить файловую инвентаризацию — систематическую регистрацию и отслеживание файлов на основе заданных критериев, таких как имя, тип, владелец, группа, размер, время модификации или содержимое.

Инвентаризация выполняется непосредственно на устройствах, что обеспечивает точное и актуальное отображение состояния файловой системы. Результаты позволяют выявлять несанкционированные изменения, отклонения от эталонных конфигураций и потенциальные угрозы безопасности.

Работа с файловой инвентаризацией включает:

  1. Создание конфигурации для сбора файловых данных.

  2. Создание версии конфигурации с указанием параметров поиска файлов в pillar-файле.

  3. Применение конфигурации к устройствам.

  4. Просмотр результатов файловой инвентаризации.

Если в системе уже существует конфигурация на основе формулы file-find и необходимо создать отдельную конфигурацию с использованием той же формулы, требуется предварительно создать ее дубликат (см. «Дублирование формулы Saltstack»).

Параметры поиска

Параметры поиска задаются в pillar-файле формулы в объекте lookup.

Каждое правило в lookup — это набор параметров, передаваемых напрямую в модуль file.find.

Имя правила (ключ) произвольно, но должно быть уникальным в рамках одного pillar-файла.

Поддерживаемые параметры:

Параметр Тип Описание Пример

path

Строка

Корневой путь в файловой системе для поиска (обязательный)

/var/log

Критерии поиска

name

Строка

Шаблон имени файла (регистрозависимый, glob-синтаксис).

Примеры использования специальных символов:

  • * соответствует нулю или большему количеству любых символов;

  • ? соответствует одному любому символу;

  • [abc] соответствует символу из набора a, b, c;

  • [!abc] или [^abc] соответствует любому символу, не входящему в набор a, b, c;

  • [x-y] соответствует любому символу в диапазоне от x до y (включительно);

  • [!x-y] или [^x-y] соответствует любому символу вне диапазона от x до y

*.log
id_*
config-[0-9].txt

iname

Строка

Шаблон имени файла (регистронезависимый, glob-синтаксис)

*.LOG
ID_*.PUB

regex

Строка

Регулярное выражение для имени файла (регистрозависимое)

^access\.log\.\d+$

iregex

Строка

Регулярное выражение для имени файла (регистронезависимое)

^access\.log\.\d+$

type

Строка

Тип файла. Несколько значений указываются через пробел или запятую. Допустимые значения:

  • a — все типы файлов (если не указан определенный тип);

  • b — файлы блочных устройств;

  • c — файлы символьных устройств;

  • d — каталоги;

  • f — простые файлы;

  • l — символические ссылки;

  • p — именованные каналы;

  • s — сокеты

f
f l
f,p

user, owner

Строка

Имя или ID пользователя-владельца. Несколько значений указываются через пробел или запятую

root
1000
root,daemon

group

Строка

Имя или ID группы. Несколько значений указываются через пробел или запятую

adm
100
adm,root

size

Строка

Размер файла в формате [+-]number[size-unit]

+10k
-50M
+2G

mtime

Строка

Время модификации в формате [+-][number][w|d|h|m|s]

+7d
-1h
-30m

Критерии глубины поиска

maxdepth

Целое число

Максимальная глубина рекурсии (от path)

1
3

mindepth

Целое число

Минимальная глубина рекурсии (от path)

1
2

Дополнительные параметры

md5

Логическое значение

Если true — вычислить и вернуть MD5-хеш содержимого файла

true

Особенности использования параметров:

  • path — единственный обязательный параметр для каждого правила;

  • type — если не указан, поиск по всем типам (a);

  • size и mtime поддерживают + (больше) и - (меньше);

  • все параметры чувствительны к регистру в YAML/JSON, кроме iname и iregex.

Пример pillar

Пример содержимого pillar-файла в JSON для сбора файловых данных с устройств в JSON:

{
  "lookup": {
    "ssh_find": {
      "path": "/home",
      "name": "id_*",
      "type": "f",
      "iname": "*.pub",
      "maxdepth": 3,
      "mindepth": 1
    },
    "old_large": {
      "path": "/var",
      "size": "+50M",
      "type": "f",
      "mtime": "+30d"
    },
    "logs_recent": {
      "md5": true,
      "name": "*.log",
      "path": "/var/log",
      "size": "+10k",
      "type": "f",
      "mtime": "-1d"
    },
    "configs_root": {
      "name": "*.conf",
      "path": "/etc",
      "type": "f",
      "owner": "root",
      "maxdepth": 1
    }
  }
}

Этот pillar определяет четыре независимых правила поиска файлов с помощью формулы file-find:

  1. ssh_find — ищет SSH-ключи в /home:

    • имя файла: id_* (регистрозависимо) и *.pub (регистронезависимо);

    • тип: обычные файлы;

    • глубина поиска: от 1 до 3 уровней вложенности;

  2. old_large — ищет старые и большие файлы в /var:

    • размер: > 50 МБ;

    • тип: обычные файлы;

    • время изменения: более 30 дней назад;

  3. logs_recent — ищет свежие лог-файлы в /var/log:

    • имя: *.log;

    • размер: > 10 КБ;

    • время изменения: менее 1 дня назад;

    • вычисляется MD5-хеш.

  4. configs_root — ищет конфигурационные файлы в /etc:

    • имя: *.conf,

    • тип: обычные файлы;

    • владелец: root;

    • поиск только в корневом каталоге.

Таким образом, в данном примере настраиваются четыре параллельных варианта поиска для обнаружения на устройстве SSH-ключей, старых больших файлов, свежих логов и системных конфигурационных файлов с привязкой к владельцу.

Обратите внимание — имя формулы указывать не требуется. Оно добавляется автоматически при сохранении версии конфигурации вместе с уникальным идентификатором (атрибут version_id).

Создание простой конфигурации и версии конфигурации

Для создания конфигурации и версии на основе формулы file-find с использованием приведенного пример pillar-файла:

  1. В меню навигации на боковой панели выберите Конфигурации.

  2. Нажмите на кнопку Создать и в выпадающем списке выберите Конфигурация.

  3. На странице создания конфигурации заполните необходимые поля.

    file find example
    Рис. 1. Страница создания конфигурации
  4. Нажмите на кнопку Создать.

    file find example 1
    Рис. 2. Страница с информацией о созданной конфигурации
  5. На странице с информацией о созданной конфигурации нажмите +Добавить версию.

  6. На странице создания версии заполните необходимые поля. Выберите формулу file-find, добавьте содержимое pillar-файла и отметьте версию как актуальную.
    Если в системе уже существует конфигурация на основе формулы file-find и необходимо создать отдельную конфигурацию с использованием той же формулы, требуется предварительно создать ее дубликат (см. «Дублирование формулы Saltstack»).
    В данном примере используется дубликат формулы с именем file-find-new.

    file find example 2
    Рис. 3. Страница создания версии конфигурации
  7. Нажмите на кнопку Добавить.

Применение конфигурации

Для применения созданной конфигурации к устройствам:

  1. В меню навигации на боковой панели выберите Применение конфигураций.

  2. Нажмите на кнопку Применить конфигурацию.

  3. На странице параметров применения конфигурации выберите коллекцию устройств, созданную конфигурацию и ее актуальную версию. При необходимости измените расписание.

    file find example 3
    Рис. 4. Страница создания версии конфигурации
  4. Нажмите на кнопку Применить.

Просмотр результатов применения конфигурации

Убедитесь, что конфигурация успешно применена к устройствам.

file find example 4
Рис. 5. Страница с информацией о результатах применения конфигурации к коллекции устройств

Для просмотра результатов применения конфигурации к конкретному устройству (см. также «Результаты сбора файловых данных (файловая инвентаризация)»):

  1. В меню навигации на боковой панели выберите Устройства.

  2. На странице со списком устройств дважды щелкните на записи, нажмите правой кнопкой мыши на записи и выберите Открыть или на панели быстрого просмотра в списке действий нажмите Открыть.

  3. На странице свойств устройства нажмите ссылку Инвентаризация ПО и файлов.

  4. Выберите вкладку Файловая инвентаризация.

file find example 5
Рис. 6. Вкладка с результатами файловой инвентаризации