Docsセキュリティサンドボックスと実行分離
ドキュメントに戻る
セキュリティ

サンドボックスと実行分離

YeePilotがLinux名前空間、リソース制限、パス制限でコマンド実行を分離する方法

最終更新: 2026年2月28日

YeePilotはすべてのコマンドを、アクセスできる範囲と消費できるリソースを制限する分離されたサンドボックス内で実行します。コマンドが予期しない動作をしても、サンドボックスがシステム全体への被害を防ぎます。

サンドボックスの仕組み

YeePilotがコマンドを実行する際、Linux名前空間を使用して分離された実行環境を作成します。これはDockerなどのコンテナランタイムを支える技術と同じもので、個々のコマンドレベルで適用されます。

各コマンドは以下の条件で実行されます:

  • プロセス分離 -- コマンドは名前空間外のプロセスを参照したり操作したりできない
  • リソース制限 -- CPU、メモリ、ファイルサイズ、プロセス数がすべて上限あり
  • パス制限 -- 機密性の高いシステムファイルにアクセスできない
  • 出力の切り詰め -- 暴走した出力がターミナルを溢れさせる前にカットオフされる
  • 実行タイムアウト -- 実行時間が長すぎるコマンドは自動的に終了される

リソース制限

YeePilotはすべてのコマンドにデフォルトのリソース制限を適用します:

リソースデフォルト制限説明
CPU時間300秒すべてのスレッドを通じた最大合計CPU時間
メモリ512 MB最大常駐メモリ使用量
ファイルサイズ100 MB作成される個々のファイルの最大サイズ
プロセス数64生成されるプロセス/スレッドの最大数
出力10,000文字この制限を超えると出力が切り詰められる
タイムアウト30秒コマンドが強制終了されるまでの実時間

これらのデフォルトは、暴走プロセスがサーバーリソースを消費するのを防ぎつつ、正当な管理タスクを処理できるように設計されています。

リソース制限のカスタマイズ

~/.yeepilot/config.yamlsandbox セクションで制限を調整します:

yaml
sandbox:
  enabled: true
  cpu_limit: 300          # CPU秒
  memory_limit: 512       # メガバイト
  file_size_limit: 100    # メガバイト
  process_limit: 64       # 最大プロセス数
  output_limit: 10000     # 文字数
  timeout: 30             # 秒(実時間)

ソフトウェアのコンパイルや大きなログファイルの処理など、リソース集約型のタスクではこれらの制限を増やす必要がある場合があります:

yaml
sandbox:
  memory_limit: 1024      # コンパイルタスク用に1 GB
  timeout: 120            # 長時間のビルド用に2分
  output_limit: 50000     # 冗長なログ用により多くの出力

拒否パス

特定の機密パスがデフォルトでブロックされ、コマンドが重要なシステムファイルを読み取ったり変更したりすることを防ぎます:

拒否パス理由
/etc/shadowパスワードハッシュ
/etc/gshadowグループパスワードハッシュ
/rootrootユーザーのホームディレクトリ

拒否パスにアクセスしようとするコマンドは、権限エラーで失敗します。

拒否パスのカスタマイズ

設定で拒否パスを追加または変更します:

yaml
sandbox:
  denied_paths:
    - /etc/shadow
    - /etc/gshadow
    - /root
    - /var/lib/secrets       # カスタム:アプリケーションのシークレット
    - /opt/myapp/keys        # カスタム:アプリケーションのキーストア

これは、YeePilotを通じてアクセスすべきでないアプリケーション固有のシークレットストアや設定ディレクトリの保護に特に役立ちます。

ネットワークアクセス

デフォルトでは、YeePilotを通じて実行されるコマンドはネットワークアクセスが可能です。パッケージのインストール(apt install)、アップデート、ヘルスチェックなどのタスクが正常に動作します。

より厳格な分離のためにネットワークアクセスを制限できます:

yaml
sandbox:
  network: true            # true(デフォルト)またはfalse

network: false に設定すると、実行されるコマンドからのすべての送信および受信ネットワーク接続がブロックされます。コマンドがローカルリソースのみで動作することを確認したい高セキュリティ環境で有用です。

PTYサポート

YeePilotはコマンド実行に疑似端末(PTY)割り当てを使用します。これにより、コマンドが実際のターミナルで実行されているかのように動作し、以下が保証されます:

  • 正しい出力フォーマット -- ターミナル機能を検出するツール(色付き出力、プログレスバーなど)が正しく動作する
  • インタラクティブ互換性 -- ターミナル機能を必要とするコマンドが正しく機能する
  • シグナル処理 -- Ctrl+C やその他のシグナルが実行中のコマンドに正しく配信される

出力の切り詰め

コマンドが設定された制限(デフォルト:10,000文字)を超える出力を生成した場合、YeePilotは出力を切り詰めて通知します:

plaintext
> 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 ...

これにより、単一のコマンドがセッションを圧倒するのを防ぎます。完全な出力を確認する必要がある場合は:

  1. 設定で output_limit を増やす
  2. 出力をファイルにリダイレクト:「Search for errors and save results to /tmp/errors.log」
  3. より具体的なクエリを使用して出力量を削減

実行タイムアウト

コマンドはデフォルトで30秒の実時間経過後に終了されます。これにより以下から保護されます:

  • 無限にハングするコマンドの誤実行
  • ネットワークリソースの待機でスタックしたコマンド
  • 無限ループや暴走プロセス

コマンドがタイムアウトすると、YeePilotはクリーンに終了してタイムアウトを報告します:

plaintext
Command timed out after 30 seconds: ping 10.0.0.1

正当に時間がかかるコマンドにはタイムアウトを増やします:

yaml
sandbox:
  timeout: 120             # 2分

サンドボックス設定の完全リファレンス

利用可能なすべてのオプションを含む完全なサンドボックス設定は以下の通りです:

yaml
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)と、すべての分離とリソース制限が解除されます。本番環境での使用は強く非推奨です。実行されるコマンドを完全に信頼できる、管理された開発環境でのみサンドボックスを無効にしてください。