docs

設定の変更

config.yml の全項目リファレンスと Settings ページの使い方

設定変更

URSUS の動作設定は config.yml 1 ファイルに集約されています。 これを編集する方法が 2 つあります。

① config.yml を直接編集

テキストエディタで開いて書き換える、最もシンプルな方法。コメントを保持できる。CLI 派におすすめ。

② Settings ページから編集

Web UI のフォームから値を入れて Save。Pydantic で型検証されてから書き戻されるので、構文ミスを起こしにくい。

注意:どちらで編集しても、保存後にプロセスを再起動するまで反映されません

Settings ページの使い方

ブラウザから http://127.0.0.1:8080/settings にアクセスすると、 config.yml の全項目がフォームとして表示されます。

画面構成

  • amber バナー: 「保存後はプロセス再起動が必要」リマインダ
  • セクション別カード: database / sensor / detector / ui / logging が個別カードに分かれる
  • Save ボタン: 入力値を JSON で POST /settings に送信。Pydantic 検証 → 通れば config.yml をアトミック書き込み
  • Reload from disk: フォームの編集中身を破棄して、ディスクから読み直す(= ページリロード)
  • 「現在のディスク上の config.yml」: ページ末尾の details で生 YAML を読み取り専用表示

バリデーション

Save 時に型違反や制約違反があれば、ページ上部に赤いバナーでエラー一覧が出ます。

入力エラーがあります:
  • ui.bind_host — Value error, ui.bind_host must be loopback; got '0.0.0.0'
  • database.retention_days — Input should be a valid integer

エラーが残っている間は config.yml は書き換わりません。

設定項目リファレンス

database

キー既定説明
path string ./data/edr.db SQLite ファイルの場所。WAL/SHM ファイルも同じディレクトリに作られる
retention_days int 14 events 表の保持日数。Detector の起動時と 24h ごとに古い行を削除。alerts と response_log は対象外
db ディレクトリは sensor の file_collector が自動除外する

SQLite の WAL / SHM が秒間数千の modify を生むため、URSUS は db 配下の ファイル変更を 無条件で除外します(実装は _is_excluded())。 config 側で何もしなくても自己フィードバックループは起きません。

sensor.hostname

キー既定説明
hostname string auto auto なら socket.gethostname()。任意の文字列を指定すると events 表の hostname カラムに記録される

sensor.process

キー既定説明
enabled bool true 無効化するとプロセス起動イベントが一切記録されなくなる

プロセスコレクタは netlink (cn_proc) で kernel から push 通知を受けます。 ポーリング間隔等の設定はありません。詳細は Process Collector

sensor.file

キー既定説明
enabled bool true ファイル変更監視を on/off
watch_paths list<string> [/etc, /tmp, /var/tmp, /home] 再帰監視するディレクトリ。1 行 1 パスで記述。/home 全体は重い場合があるので絞ることを推奨
exclude_patterns list<string> [*.swp, *~] glob 除外パターン。basename と絶対パスの両方とマッチ判定
modify_debounce_sec float 2.0 同一 path への連続 modify を 1 ウィンドウに圧縮する秒数。0 で無効化

sensor.network

キー既定説明
enabled bool true TCP 接続テーブル監視を on/off
poll_interval_sec float 2.0 差分ポーリングの周期。短いほど取りこぼしが減るが CPU を消費
established_debounce_sec float 5.0 同一 (pid, remote_ip, remote_port) への ESTABLISHED 連発を抑制する秒数。0 で無効化。LISTEN は対象外で常に記録される

sensor.auth

キー既定説明
enabled bool true 認証ログ購読を on/off
journal_units list<string> [ssh.service, sshd.service] journalctl の _SYSTEMD_UNIT match。1 行 1 ユニット
journal_comms list<string> [sudo] journalctl の _COMM match。1 行 1 プロセス名

journalctl の match セマンティクス: 同じフィールド同士は OR、異なるフィールド同士は AND、+ 区切りで OR グループ化。詳細は Auth Collector

detector

キー既定説明
enabled bool true Detector 全体を on/off
poll_interval_sec float 1.0 events 表をチェックする周期。短くすると検知遅延が減るが CPU を使う
rules_dir string ./rules YAML ルールを格納するディレクトリ。配下の *.yml を全てロード

detector.response

キー既定説明
dry_run bool true true なら全アクションが実行されず response_log に dry_run=1 として記録される。off にする前に充分テストすること
allowed_actions list<string> [alert] 許可するアクション名。リストにないアクションはルールが指定しても not in allowed_actions として拒否される

使用可能なアクション一覧

アクション状態説明
alert 有効 response_log に通知を残す。実害ゼロ。常に許可することを推奨
kill_process 有効 SIGTERM でプロセス停止。PID≤1 と detector 自身は安全装置で除外
quarantine_file 有効 chmod 000 + /var/quarantine/ursus/ へ移動。/etc/passwd 等の重要パスは安全装置で除外
block_network 無効 本ビルドでは恒久的に無効。リストに書いても iptables は呼ばれず、response_log に refused として記録される
dry_run を off にする前に

URSUS には R901_test_kill_process / R902_test_quarantine_file というテスト用ルールが同梱されています。先にこれで挙動確認することを推奨します。

ui

キー既定説明
bind_host string 127.0.0.1 ループバック (127.0.0.1 / ::1 / localhost) のみ許可。それ以外を指定すると起動時に Pydantic が拒否する
bind_port int 8080 UI のリスンポート
events_per_page int 50 /events ページの 1 ページあたり件数
bind_host を 0.0.0.0 にしないでください

URSUS の UI には認証機構がありません。外部から到達可能な IP に bind すると、誰でもイベント / アラートを閲覧でき、Settings から config.yml を書き換えられる状態になります。Pydantic 側で起動時に弾く実装になっているのは、この事故防止のためです。

logging

キー既定説明
level enum INFO DEBUG / INFO / WARNING / ERROR
format enum json json = 1 行 1 JSON、text = 人間可読

systemd で常駐させる

URSUS は scripts/install.sh によって systemd ユニットとして登録できる。 インストール後は 3 つの service unit (ursus-sensor / ursus-detector / ursus-ui) が /etc/systemd/system/ に配置される。

インストール

$ git clone https://github.com/<user>/ursus.git
$ cd ursus
$ sudo ./scripts/install.sh

インストールスクリプトの動作:

  1. システムユーザー ursus を作成 (UI の実行アカウント)
  2. リポジトリ内容を /opt/ursus/ に rsync (.git / .venv / data / docs は除外)
  3. /opt/ursus/.venv/ に venv を作って pip install -e
  4. 権限を設定 (sensor/detector は root、UI は ursus user で動作)
  5. systemd ユニットを /etc/systemd/system/ に配置し daemon-reload
auto-start はしない

インストール時点では systemctl startenable もしない。 明示的に start.sh を実行するか systemctl を直接叩く必要がある。

起動と停止

start.sh は 3 サービスを順に起動して状態を 1 行ずつ表示する。

$ sudo /opt/ursus/scripts/start.sh

>>> starting URSUS
status:
  ursus-sensor         active
  ursus-detector       active
  ursus-ui             active

  ui   :  http://127.0.0.1:8080/
  logs :  journalctl -u ursus-sensor -u ursus-detector -u ursus-ui -f
$ sudo /opt/ursus/scripts/stop.sh

boot 時自動起動を有効化

start.sh は単に起動するだけで boot 時の自動起動は設定しない。 有効化するには systemctl enable を直接実行する。

$ sudo systemctl enable ursus-sensor ursus-detector ursus-ui

状態とログの確認

用途コマンド
サービスの稼働状態systemctl status ursus-sensor
3 つまとめて確認systemctl status 'ursus-*'
起動状態だけ簡潔にsystemctl is-active ursus-sensor ursus-detector ursus-ui
ライブログ追跡journalctl -u ursus-sensor -f
3 サービスのログをまとめてjournalctl -u ursus-sensor -u ursus-detector -u ursus-ui -f
過去 5 分のログjournalctl -u ursus-sensor --since "5 min ago"
JSON ログを生で読むjournalctl -u ursus-sensor -o cat (URSUS の JSON 1 行ログがそのまま出る)
エラーだけ抽出journalctl -u ursus-sensor -p err

アンインストール

# 既定: data / config.yml / rules / quarantine を残してコードのみ削除
$ sudo /opt/ursus/scripts/uninstall.sh

# 完全削除 (data / config.yml / rules / quarantine / ursus ユーザーまで消す)
$ sudo /opt/ursus/scripts/uninstall.sh --purge

インストールレイアウト

/opt/ursus/                  root:root  755
├── src/                     # コード本体
├── rules/                   # 検知ルール YAML
├── systemd/                 # service ファイル原本 (参照用に同梱)
├── scripts/                 # start.sh / stop.sh / uninstall.sh / measure_resources.py
├── .venv/                   # 仮想環境 (pip install -e で配置)
├── config.yml               root:ursus 660  # ui (ursus) が Settings 経由で書く
└── data/                    root:ursus 770  # sensor が書き、detector/ui が読む
    ├── edr.db               root:ursus 660  (UMask=0027 で sensor が作成)
    ├── edr.db-wal
    └── edr.db-shm

/var/quarantine/ursus/       root:root  700  # detector の quarantine_file 移動先

/etc/systemd/system/
├── ursus-sensor.service
├── ursus-detector.service
└── ursus-ui.service

サンドボックス設定

各 unit は systemd のサンドボックス機能で隔離されている。主要な設定:

directivesensordetectorui
Userrootrootursus
NoNewPrivilegestruetruetrue
ProtectSystemstrictfullstrict
ProtectHomeread-only(none)true
ReadWritePaths/opt/ursus/data/opt/ursus
PrivateTmpfalsefalsetrue
UMask0027
MemoryMax512M256M256M
TasksMax2005050

主要な設定の根拠

  • PrivateTmp=false (sensor / detector): PrivateTmp=true は unit ごとに名前空間付きの /tmp を割り当てるため、他プロセスが本来の /tmp で行う活動を観測 (sensor) / 操作 (detector の quarantine_file) できなくなる。
  • UMask=0027 (sensor): SQLite の WAL/SHM ファイルが root:ursus 660 の権限で 作成されるよう調整するため。これがないと UI (ursus user) が DB を読めない。
  • ProtectHome=read-only (sensor): file_collector が /home 配下を inotify で監視するため マウント自体は必要。読み取り専用で十分。
  • ProtectHome 未指定 (detector): quarantine_file の対象が /home 配下になる場合があるため。
  • ProtectSystem=full (detector): strict にすると /tmp 等への書込ができず quarantine_file が失敗する。full なら /usr / /boot / /etc のみ ro。
  • ReadWritePaths=/opt/ursus (ui): Settings からの保存で config.yml.tmp をディレクトリ内に 作成 → rename するアトミック書込のため、ファイル単体ではなく ディレクトリへの書込権が必要。実体ファイルレベルの書込制御は chmod 660 config.yml 側で担保。

設定変更を反映する

config.yml を保存しただけではプロセスは新しい設定を読みません。 反映させるには各プロセスを再起動します。

systemd で動かしている場合

# sensor の watch_paths を変更したら sensor だけ再起動
$ sudo systemctl restart ursus-sensor

# 全部まとめて再起動
$ sudo systemctl restart ursus-sensor ursus-detector ursus-ui

# または stop+start ラッパーで
$ sudo /opt/ursus/scripts/stop.sh
$ sudo /opt/ursus/scripts/start.sh

手動起動の場合

各ターミナルで Ctrl-C → 再度コマンド実行。

$ sudo .venv/bin/ursus-sensor   --config config.yml
$ .venv/bin/ursus-detector  --config config.yml
$ .venv/bin/ursus-ui        --config config.yml

YAML 直接編集の注意点

インデント

YAML はインデントが意味を持ちます。タブは使わずスペース 2 つに統一してください。

リスト記法

list<string> のフィールドは - プレフィックスで列挙します。Settings ページの textarea で 1 行 1 値を入れると、保存時にこの形式に変換されます。

watch_paths:
  - /etc
  - /tmp

特殊文字を含むパターン

glob (*) や正規表現で :# を含む値はクォートが必要です。

exclude_patterns:
  - "*.swp"
  - "*/.cache/*"

コメント

# 以降がコメント。手書きで残しても、Settings ページから保存すると URSUS の正規コメントに置き換わります。コメントを死守したい場合は直接編集を続けてください。

トラブルシューティング

Detector / UI が起動直後に終了する

config.yml の Pydantic バリデーションに失敗していることが多いです。エラーメッセージを確認してください:

pydantic_core._pydantic_core.ValidationError: 1 validation error for Config
ui.bind_host
  Value error, ui.bind_host must be loopback; got '0.0.0.0'
    [type=value_error, input_value='0.0.0.0', input_type=str]

このケースは ui.bind_host をループバックに戻せば解消します。

Settings から保存ボタンが反応しない

ブラウザの開発者ツールで Console / Network タブを確認してください。

  • POST /settings が 400 → 入力エラー (バナーにも表示される)
  • POST /settings が 500 → サーバ側エラー (ui プロセスのログ確認)
  • そもそもリクエストが飛んでいない → JS エラー

config.yml が「読み取り専用 DB」エラーで保存できない

ui プロセスを root ではなく一般ユーザーで動かしていて、config.yml が root 所有になっているケース:

$ sudo chown $USER:$USER config.yml

変更を保存したのに動作が変わらない

プロセス再起動を忘れていないか確認してください。Settings ページの amber バナー、および各プロセスのログ最初の数行で、現在ロード中の値を確認できます。

関連ドキュメント