コンテンツにスキップ

ファイルサーバーをガバナンスする

filesystem コンテンツコネクタ(olivares.fs-content)は、ローカルパス、NFS export、SMB mount などのディレクトリツリーをガバナンス対象のナレッジ文書へ 変換します。それらは他のすべてのコンテンツソースと同じ pipeline(秘匿化 → classify → chunk → embed → index → MCP で提供)を通り、文書 ACL は POSIX の所有者 情報から、分類は xattr からマッピングされます。これはコンテンツのsourceで あり、ログを外部へ転送するログ sinkfilelog とは別物です。

セルフホスト環境の運用者にとって、ファイルサーバーは最も古く、最も大きい文書 ストアであることが多いため、これはカタログ内でも特に価値の高いコネクタの 1 つ です。

構造によって保証される読み取りセキュリティ

Section titled “構造によって保証される読み取りセキュリティ”

コネクタの読み取りは、Go 標準ライブラリの os.Root によって、設定した root 内に限定されます。

  • root の外を指す symlink絶対パス、または .. による traversal拒否されます。コネクタは、指定されていないファイルを物理的に読み取れません。
  • walk 中に symlink をたどりません(数には含めますが、決して解決しません)。
  • 各ファイル本文にはサイズ上限があり(大きなファイルは切り詰めてマーク)、 読み取るのはテキスト/文書形式だけです(binary は skip して数を記録)。 コンテンツを実行することは決してなく、walk はファイル数と総 byte 数の budgetにも制約されるため、大規模または低速な NFS mount を枯渇させません。

敵対的テストにより、symlink escape と traversal が拒否されることを証明しています。

ディレクトリツリーを指定する

Section titled “ディレクトリツリーを指定する”
// 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"
}
}
]
}

各ファイルが 1 つの Document になります。本文はファイルの内容、DocID は root からの 相対パスで、来歴属性には ownergroupmodesizeworld_readablepath が含まれます。

所有者と ACL のマッピング — 正確な対応表

Section titled “所有者と ACL のマッピング — 正確な対応表”

コネクタがマッピングするのはファイルシステムが表現している情報だけであり、 マッピングできないものは明示します。

ファイルシステムowner / group / modePOSIX.1e ACL(getfaclWindows / NFSv4 ACL
ローカル(ext4/xfs/btrfs)マッピング: owner → user:<name>、group(group-readable の場合)→ group:<name>マッピング: read bit を持つ名前付き user/group の各 entry → principal ref該当なし
NFSuid/gid が一貫してマッピングされている場合にマッピング(idmapd / 両側で同じ directory)mount が system.posix_acl_access を公開する場合にマッピングNFSv4 native ACL は解析しません(明示された制限)
SMB / CIFSmount の uid=/gid=/file_mode=、つまり mount option からマッピング。実際の Windows owner からではありません通常は存在しないWindows security descriptor は解析しませんsystem.cifs_acl は binary SD。明示された制限)

principal 名は host の name service を通じて解決します。ここには LDAP を含める こともできるため、uid→username を組織の directory に一致させられます。解決 できない uid/gid には、その数値 ID を使用します。導出可能な ACL がない ファイルはナレッジベースのデフォルト ACL を継承し、retrieval でも引き続き適用 されます。コネクタが、ファイルにない ACL を捏造することは決してありません

  • デフォルトの classification がすべてのファイルに適用されます。
  • ファイルごとの xattr(デフォルトは user.classification)がそれを上書き します。
  • external-labels xattruser.olivares.labels、comma 区切り)は sensitivity label を追加します。これは retrieval DLP に渡され、classification と並んで デニークローズドで適用されます。
  • テキスト/文書ファイルだけを扱います。binary は skip して数を記録します。 抽出が必要な rich format(PDF/DOCX)は、このコネクタではingest しません (黙って skip するのではなく、今後の対応として明示しています)。
  • 本文は 1 MiB が上限です。大きなファイルは切り詰められ、truncated と マークされます。
  • SMB: コネクタに見えるのは mount の合成 POSIX view であり、実際の Windows ACL ではありません。
  • コネクタは読み取りだけを行い、ツリーに書き込むことはありません(設計上、 書き込み経路が存在しません)。

セキュリティ保証は、symlink escape、traversal、サイズ上限、binary skip、POSIX の owner/group/ACL マッピング、xattr classification を対象とする敵対的テストでカバー されています。完全な実配線での証明は、folder binding の背後に fixture tree を 置いて MCP で提供し、Claude Code session からは binding と file ACL の両方が許可 したものだけが見え、拒否対象の subtree が実際に拒否されることを証明する、engine を構成した CI integration job です。