Перейти к содержимому

Управление файловым сервером

Коннектор содержимого filesystem (olivares.fs-content) превращает дерево каталогов — локальный путь, экспорт NFS или mount SMB — в управляемые документы знаний. Они проходят тот же pipeline, что и любой другой источник содержимого (redact → classify → chunk → embed → index → предоставление через MCP), причём ACL документов отображаются из владения POSIX, а классификация — из xattr. Это источник содержимого, отличный от sink журналов filelog (который передаёт журналы наружу).

Для оператора self-hosted файловый сервер часто является старейшим и крупнейшим хранилищем документов, поэтому это один из самых ценных коннекторов каталога.

Коннектор читает данные, ограниченные настроенным корнем, что гарантируется os.Root из стандартной библиотеки Go:

  • Символическая ссылка за пределы корня, абсолютный путь или обход через .. отклоняются: коннектор физически не может прочитать файл, на который вы его не направили.
  • При обходе символические ссылки не переходятся (они подсчитываются, но никогда не разрешаются).
  • Тело каждого файла ограничено по размеру (более крупные файлы обрезаются и помечаются), читаются только текстовые типы/типы документов (бинарные файлы пропускаются и подсчитываются), содержимое никогда не исполняется, а обход ограничен бюджетами количества файлов и общего числа байтов, поэтому не может исчерпать большой или медленный mount NFS.

Состязательные тесты доказывают отказ от выхода через symlink и обхода пути.

// OLIVARES_SOURCES_CONFIG — document sources live under "documents"
{
"documents": [
{
"name": "file-server",
"kind": "filesystem",
"config": {
"root": "/mnt/fileserver/shared", // local path or an NFS/SMB mount
"include": "*.md,*.txt,docs/*", // globs (path or basename); empty = all text
"exclude": "**/archive/*,*.tmp",
"max_file_bytes": "1048576", // per-file cap (hard-capped at 1 MiB)
"max_files": "100000", // walk budget
"max_total_bytes": "1073741824", // read budget
"text_only": "true", // skip binaries (counted)
"map_posix_acl": "true", // owner/group + POSIX.1e ACL → Document ACL
"classification": "internal", // default label (an xattr overrides per file)
"classification_xattr": "user.classification",
"labels_xattr": "user.olivares.labels"
}
}
]
}

Каждый файл становится Document: телом служит содержимое файла, DocID — путь относительно корня, а атрибуты происхождения содержат owner, group, mode, size, world_readable и path.

Отображение владения и ACL — честная матрица

Заголовок раздела «Отображение владения и ACL — честная матрица»

Коннектор отображает только то, что выражает файловая система, и объявляет то, что отобразить не может:

Файловая системаowner / group / modeACL POSIX.1e (getfacl)ACL Windows / NFSv4
Локальная (ext4/xfs/btrfs)Отображаются: owner → user:<name>, group (если группе разрешено чтение) → group:<name>Отображается: каждая именованная запись пользователя/группы с битом чтения → ссылка на принципалане применимо
NFSОтображается, если uid/gid согласованно сопоставлены (idmapd / один и тот же каталог с обеих сторон)Отображается, когда mount предоставляет system.posix_acl_accessНативные ACL NFSv4 НЕ разбираются (заявленное ограничение)
SMB / CIFSОтображается из uid=/gid=/file_mode= mount, то есть его параметров, а не реального владельца WindowsОбычно отсутствуетДескрипторы безопасности Windows НЕ разбираются (system.cifs_acl — бинарный SD; заявленное ограничение)

Имена принципалов разрешаются службой имён хоста (она может включать LDAP, чтобы uid→имя пользователя совпадало с вашим каталогом). Если uid/gid не разрешается, используется его числовой id. Файл, для которого невозможно вывести ACL, наследует ACL базы знаний по умолчанию, и она по-прежнему применяется при извлечении. Коннектор никогда не выдумывает ACL, которой нет у файла.

  • classification по умолчанию применяется к каждому файлу.
  • xattr отдельного файла (по умолчанию user.classification) её переопределяет.
  • xattr внешних меток (user.olivares.labels, значения через запятую) добавляет метки чувствительности для DLP извлечения; они применяются deny-closed вместе с классификацией.
  • Только текстовые файлы/документы. Бинарные файлы пропускаются и подсчитываются. Богатые форматы, требующие извлечения (PDF/DOCX), этот коннектор не загружает (это заявленная последующая работа, а не молчаливый пропуск).
  • Тело ограничено 1 МиБ; более крупные файлы обрезаются и получают метку truncated.
  • SMB: коннектор видит синтетическое POSIX-представление вашего mount, а не настоящую ACL Windows.
  • Коннектор читает, но никогда не пишет в дерево (путь записи отсутствует по конструкции).

Гарантии безопасности покрыты состязательными тестами: выход через symlink, обход, ограничение размера, пропуск бинарных файлов, отображение владельца, группы и ACL POSIX, классификация xattr. Полное доказательство на реальном соединении — дерево fixtures за привязкой папки, предоставленное через MCP: сессия Claude Code видит только разрешённое её привязкой и ACL файла, а отказ для поддерева доказан. Это интеграционная задача CI, которая собирает движок.