設定の変更
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 は対象外 |
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 として記録される |
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 ページあたり件数 |
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
インストールスクリプトの動作:
- システムユーザー
ursusを作成 (UI の実行アカウント) - リポジトリ内容を
/opt/ursus/に rsync (.git/.venv/data/docsは除外) /opt/ursus/.venv/に venv を作ってpip install -e- 権限を設定 (sensor/detector は root、UI は ursus user で動作)
- systemd ユニットを
/etc/systemd/system/に配置しdaemon-reload
インストール時点では systemctl start も enable もしない。
明示的に 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 のサンドボックス機能で隔離されている。主要な設定:
| directive | sensor | detector | ui |
|---|---|---|---|
User | root | root | ursus |
NoNewPrivileges | true | true | true |
ProtectSystem | strict | full | strict |
ProtectHome | read-only | (none) | true |
ReadWritePaths | /opt/ursus/data | — | /opt/ursus |
PrivateTmp | false | false | true |
UMask | 0027 | — | — |
MemoryMax | 512M | 256M | 256M |
TasksMax | 200 | 50 | 50 |
主要な設定の根拠
-
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 バナー、および各プロセスのログ最初の数行で、現在ロード中の値を確認できます。