サンドボックスと実行分離
YeePilotがLinux名前空間、リソース制限、パス制限でコマンド実行を分離する方法
YeePilotはすべてのコマンドを、アクセスできる範囲と消費できるリソースを制限する分離されたサンドボックス内で実行します。コマンドが予期しない動作をしても、サンドボックスがシステム全体への被害を防ぎます。
サンドボックスの仕組み
YeePilotがコマンドを実行する際、Linux名前空間を使用して分離された実行環境を作成します。これはDockerなどのコンテナランタイムを支える技術と同じもので、個々のコマンドレベルで適用されます。
各コマンドは以下の条件で実行されます:
- プロセス分離 -- コマンドは名前空間外のプロセスを参照したり操作したりできない
- リソース制限 -- CPU、メモリ、ファイルサイズ、プロセス数がすべて上限あり
- パス制限 -- 機密性の高いシステムファイルにアクセスできない
- 出力の切り詰め -- 暴走した出力がターミナルを溢れさせる前にカットオフされる
- 実行タイムアウト -- 実行時間が長すぎるコマンドは自動的に終了される
リソース制限
YeePilotはすべてのコマンドにデフォルトのリソース制限を適用します:
| リソース | デフォルト制限 | 説明 |
|---|---|---|
| CPU時間 | 300秒 | すべてのスレッドを通じた最大合計CPU時間 |
| メモリ | 512 MB | 最大常駐メモリ使用量 |
| ファイルサイズ | 100 MB | 作成される個々のファイルの最大サイズ |
| プロセス数 | 64 | 生成されるプロセス/スレッドの最大数 |
| 出力 | 10,000文字 | この制限を超えると出力が切り詰められる |
| タイムアウト | 30秒 | コマンドが強制終了されるまでの実時間 |
これらのデフォルトは、暴走プロセスがサーバーリソースを消費するのを防ぎつつ、正当な管理タスクを処理できるように設計されています。
リソース制限のカスタマイズ
~/.yeepilot/config.yaml の sandbox セクションで制限を調整します:
sandbox:
enabled: true
cpu_limit: 300 # CPU秒
memory_limit: 512 # メガバイト
file_size_limit: 100 # メガバイト
process_limit: 64 # 最大プロセス数
output_limit: 10000 # 文字数
timeout: 30 # 秒(実時間)ソフトウェアのコンパイルや大きなログファイルの処理など、リソース集約型のタスクではこれらの制限を増やす必要がある場合があります:
sandbox:
memory_limit: 1024 # コンパイルタスク用に1 GB
timeout: 120 # 長時間のビルド用に2分
output_limit: 50000 # 冗長なログ用により多くの出力拒否パス
特定の機密パスがデフォルトでブロックされ、コマンドが重要なシステムファイルを読み取ったり変更したりすることを防ぎます:
| 拒否パス | 理由 |
|---|---|
/etc/shadow | パスワードハッシュ |
/etc/gshadow | グループパスワードハッシュ |
/root | rootユーザーのホームディレクトリ |
拒否パスにアクセスしようとするコマンドは、権限エラーで失敗します。
拒否パスのカスタマイズ
設定で拒否パスを追加または変更します:
sandbox:
denied_paths:
- /etc/shadow
- /etc/gshadow
- /root
- /var/lib/secrets # カスタム:アプリケーションのシークレット
- /opt/myapp/keys # カスタム:アプリケーションのキーストアこれは、YeePilotを通じてアクセスすべきでないアプリケーション固有のシークレットストアや設定ディレクトリの保護に特に役立ちます。
ネットワークアクセス
デフォルトでは、YeePilotを通じて実行されるコマンドはネットワークアクセスが可能です。パッケージのインストール(apt install)、アップデート、ヘルスチェックなどのタスクが正常に動作します。
より厳格な分離のためにネットワークアクセスを制限できます:
sandbox:
network: true # true(デフォルト)またはfalsenetwork: false に設定すると、実行されるコマンドからのすべての送信および受信ネットワーク接続がブロックされます。コマンドがローカルリソースのみで動作することを確認したい高セキュリティ環境で有用です。
PTYサポート
YeePilotはコマンド実行に疑似端末(PTY)割り当てを使用します。これにより、コマンドが実際のターミナルで実行されているかのように動作し、以下が保証されます:
- 正しい出力フォーマット -- ターミナル機能を検出するツール(色付き出力、プログレスバーなど)が正しく動作する
- インタラクティブ互換性 -- ターミナル機能を必要とするコマンドが正しく機能する
- シグナル処理 --
Ctrl+Cやその他のシグナルが実行中のコマンドに正しく配信される
出力の切り詰め
コマンドが設定された制限(デフォルト:10,000文字)を超える出力を生成した場合、YeePilotは出力を切り詰めて通知します:
> Search all log files for errors
Running: grep -r "ERROR" /var/log/
[Output truncated at 10,000 characters -- 45,230 total characters produced]
... showing last portion of output ...これにより、単一のコマンドがセッションを圧倒するのを防ぎます。完全な出力を確認する必要がある場合は:
- 設定で
output_limitを増やす - 出力をファイルにリダイレクト:「Search for errors and save results to /tmp/errors.log」
- より具体的なクエリを使用して出力量を削減
実行タイムアウト
コマンドはデフォルトで30秒の実時間経過後に終了されます。これにより以下から保護されます:
- 無限にハングするコマンドの誤実行
- ネットワークリソースの待機でスタックしたコマンド
- 無限ループや暴走プロセス
コマンドがタイムアウトすると、YeePilotはクリーンに終了してタイムアウトを報告します:
Command timed out after 30 seconds: ping 10.0.0.1正当に時間がかかるコマンドにはタイムアウトを増やします:
sandbox:
timeout: 120 # 2分サンドボックス設定の完全リファレンス
利用可能なすべてのオプションを含む完全なサンドボックス設定は以下の通りです:
sandbox:
enabled: true # サンドボックスの有効/無効(デフォルト:true)
cpu_limit: 300 # CPU秒(デフォルト:300)
memory_limit: 512 # メガバイト(デフォルト:512)
file_size_limit: 100 # メガバイト(デフォルト:100)
process_limit: 64 # 最大プロセス数(デフォルト:64)
output_limit: 10000 # 文字数(デフォルト:10000)
timeout: 30 # 実時間秒数(デフォルト:30)
network: true # ネットワークアクセスの許可(デフォルト:true)
denied_paths: # コマンドがアクセスできないパス
- /etc/shadow
- /etc/gshadow
- /root注意: サンドボックスを完全に無効にする(
enabled: false)と、すべての分離とリソース制限が解除されます。本番環境での使用は強く非推奨です。実行されるコマンドを完全に信頼できる、管理された開発環境でのみサンドボックスを無効にしてください。