設問とコンテキスト
あるコマンドラインツールが、少数の入力ファイルセットを読み込み、指定された出力ディレクトリへ書き込み、信頼できないプラグインを実行する必要があります。デプロイ環境では追加の特権を付与できず、カーネルは古いLandlock ABIのみを公開している可能性があります。サンドボックスをどのように設計し、ルールが機能していることを検証し、より厳格なルールセットを適用したことだけでシステム全体が安全であると見なしてしまう事態をどのように回避しますか?
この質問は、Linux、セキュリティ、ビルドシステム、およびマルチテナント実行の役割に適しています。評価のポイントは、単一のC言語構造体を暗記しているかではなく、Landlockを非特権でスタック可能なプロセス自己制限メカニズムとして理解しているかどうかです。
面接官がテストしていること
- ルール定義域(rule domain)、ルールタイプ、アクセス権、プロセススコープを区別できているか。
- サポートされているパーミッションセットを構築する前に、カーネルABIをプローブ(検出)しているか。
- 制限前に開かれたファイル記述子は個別に監査が必要であることを理解しているか。
- fork、exec、スレッド、および子プロセスの継承関係について論理的に考えられているか。
- 障害処理、オブザーバビリティ、ロールバック、テストがロールアウト計画に含まれているか。
最初に明確にすべき質問
- どのパスに読み取り、作成、削除、実行、ネットワークの機能が必要か?
- プラグインはfork、exec、スレッド作成、または継承されたファイル記述子の受信が可能か?
- 最小カーネルバージョンと、許容されるセキュリティダウングレードは何か?
- プロセスが制限される前に、ログ、入力ファイル、ソケット、またはデバイスが開かれているか?
- ファイルアクセスが唯一の境界か、それともseccomp、コンテナ、またはMACも必要か?
30秒の回答
「まずLandlock ABIをプローブし、ルール定義域を作成して、入力ツリーには読み取りアクセスのみを、出力ツリーには作成/書き込みアクセスのみを付与し、その後に現在のプロセスを制限して子孫プロセスがポリシーを継承するようにします。制限前に開かれたファイル記述子は引き続き使用可能である可能性があるため、明示的な監査が必要です。古いABI向けには最小限の共通パーミッションセットを構築します。必須の分離機能が利用できない場合は、サンドボックス化されていない状態で警告なしに実行するのではなく、ツールの実行を拒否するか、明確にログを記録した低リスクな読み取り専用モードへ移行します。」
ステップバイステップの詳細解説
ステップ 1: 脅威モデルと最小権限の定義
プラグインが実行し得るアクションを洗い出します:ホストファイルの読み取り、出力の上書き、別のプログラムの実行、ディレクトリの削除、ネットワークへのアクセス、または継承された記述子の不正利用などです。各アクションをLandlockがサポートするファイルシステム権限にマッピングします。入力ツリー以下には必要な読み取りのみを、出力ツリー以下には書き込みまたは作成のみを付与します。ルートを開いてアプリケーション側のチェックに頼るのではなく、付与されていないすべての権限を拒否状態にしておきます。
ステップ 2: ABIのプロービング
LandlockはABIバージョンを通じてアクセス権を追加しています。起動時に利用可能なABIを読み取り、希望するポリシーを必須の権限とオプションの権限に分割します。オプションの権限はサポートされている場合にのみ追加します。未知の権限が含まれるとルール作成が失敗する可能性があるため、ポリシービルダーはケーパビリティを認識できる必要があります。検出されたABI、ポリシーバージョン、および実効権限を構造化フィールドとしてログに記録します。
ステップ 3: ルール定義域の構築とパスのバインド
ルール定義域を作成し、起動時に信頼できるディレクトリ記述子を開き、各ツリーに必要な最小限の権限でパスルールをバインドします。プラグインコードが実行される前にそれらの記述子を開くことで、ポリシー設定処理が攻撃者に制御されたパスを解決してしまうのを防ぎます。ルールを構成した後、現在のプロセスを制限し、スレッドやその後のexec呼び出しの継承動作をテストします。
ステップ 4: オープンリソースと継承の監査
Landlockは制限適用後のアクセス要求を制約します。制限前に開かれた記述子は引き続き使用可能な場合があります。不要な記述子はクローズし、必要な記述子は管理対象リソースとしてマークし、無関係な記述子が渡されないようにします。標準入出力、ログ、ソケット、ディレクトリハンドル、およびプラグインに提供される記述子をレビューします。fork、exec、スレッド、子プロセスを個別にテストします。
ステップ 5: 障害処理と多層防御の定義
Landlockは、プロセスが既に保持しているすべてのシステムコール、ネットワーク操作、またはケーパビリティを自動的に制約するわけではありません。脅威モデルに応じて、seccomp、コンテナ、ユーザー名前空間、またはシステムMACを追加します。必須のルール定義域が作成できない場合は、実行拒否、読み取り専用モード、または承認ゲートを選択します。あらゆるダウングレードは理由とともにアラートを発行する必要があり、境界がない状態で信頼できないプラグインを暗黙的に実行してはなりません。
ステップ 6: 検証、オブザーバビリティ、ロールバック
CIフィクスチャを使用して許可/拒否(allow/deny)マトリクスを網羅します:入力の読み取り成功、出力の書き込み成功、許可されたツリー外の読み取り失敗、設計通りの削除や実行操作の失敗などです。子プロセスでもこれらのチェックを繰り返します。ABI、ポリシーハッシュ、拒否された操作数、終了理由を記録します。カナリアリリース中に誤検知(false denial)を測定します。プラグインが別の権限を必要とする場合は、親ディレクトリを開放するのではなく、許可リストとテストを更新します。ロールバックでは、サンドボックス障害のアラートを維持したまま、プラグインを無効化するか古いランナーを復元します。
質の高い模範解答
まず、プラグインのファイル、実行、継承のニーズに関するパーミッションインベントリを作成し、ターゲットカーネルのLandlock ABIをプローブします。ルール定義域では、入力ツリーの読み取りと出力ツリーの作成・書き込みを付与します。オプションの権限は個別に有効化し、必須の機能が不足している場合は実行を不可とします。制限前には不要な記述子をクローズし、標準ストリーム、ログ、ソケット、プラグインに渡される記述子を監査した上で、fork、exec、スレッド、子プロセスの動作を検証します。
プロセスの制限後、実際のプラグインを用いてallow/denyマトリクスを実行し、ABI、ポリシーバージョン、拒否された操作、ダウングレード理由を記録します。Landlockはスタック可能なファイルシステム境界を提供するものであり、完全な特権またはネットワークサンドボックスではないため、seccomp、コンテナ、ユーザー名前空間、またはMACが依然として必要な場合があります。コアルールポリシーが確立できない場合、ランナーは実行を拒否するか、明示的にアラートを出した読み取り専用モードに入ります。決してポリシーを暗黙的にバイパスすることはありません。
よくある間違い
- Landlockを特権分離として扱う → 主に適用後の制御されたアクセスを制約するものであるため、脅威モデルに応じて複数のコントロールを組み合わせる。
- ABIの差異を無視する → 古いカーネルでは新しいアクセス権が認識されない場合があるため、プローブを行い最小限の共通ポリシーを構築する。
- サンドボックス化の前にすべてを開いてしまう → 既存の記述子が引き続き使用可能になる可能性があるため、まず不要な記述子をクローズ、監査し、無関係な記述子の継承を停止する。
- 親ツリーを許可してアプリケーションのチェックを信頼する → プラグインがより多くのパスをトラバースできるようになるため、ツリー単位かつ操作単位で権限を付与する。
- セットアップ失敗後も暗黙的に続行する → オペレーターが分離の欠如を把握できなくなるため、拒否するか、読み取り専用モードを使用するか、アラート付きの承認を要求する。
- メインプロセスのみをテストする → fork、exec、スレッドによって境界が変化するため、拒否ケースを含めてすべての継承パスをテストする。
フォローアップの質問
Landlockは既に開かれているファイルを制限できますか?
自動的なクローズメカニズムとして扱うべきではありません。制限前に開かれた記述子は引き続き使用可能である可能性があるため、ポリシーを適用する前に不要な記述子をクローズし、記述子の受け渡しを制御し、保持されたハンドルを監査とテストの対象に含めます。
カーネルに要求されたアクセス権が1つ欠けている場合はどうしますか?
必須の権限とオプションの権限を分離します。ABIをプローブし、サポートされているオプションの権限を追加し、必須の権限が欠けている場合は起動を拒否するか、明示的にアラートを出したセーフモードに移行します。ルール作成の失敗を無視したり、未知の権限をルールに書き込んだりしてはなりません。
なぜseccompやコンテナを追加するのですか?
Landlockの強みは、非特権かつファイルシステムスコープの自己制限にあります。すべてのシステムコール、ネットワークパス、またはホストポリシーをカバーしているわけではありません。seccomp、ユーザー名前空間、コンテナ、MACは、これらのシステムコール、アイデンティティ、システムレベルの境界を補完できます。この組み合わせ設計においても、継承と障害パスのテストが必要です。