Landlock入門!Linuxカーネルネイティブの非特権サンドボックスでアプリを要塞化する

2026年10月13日火曜日

t f B! P L

📖 推定読了時間:約6分

オープンソースライブラリの脆弱性や悪意あるパッケージが紛れ込む「サプライチェーン攻撃」が頻発する昨今、開発者にとって最も恐ろしいのは、「自社製アプリケーションが意図しない権限で外部にファイルを送信したり、重要な設定ファイルを上書きされたりすること」ではないでしょうか。

従来のLinuxでプロセスを隔離しようとすると、SELinuxやAppArmorのような複雑なroot権限ポリシーを作成するか、Dockerコンテナを立ち上げる必要がありました。しかし、Linux 5.13で正式マージされ、現在急速に実用化が進んでいるLSM(Linux Security Module)「Landlock(ランドロック)」を使えば、一般ユーザー権限(非特権)のアプリケーション自身が、わずか数行のシステムコールで自身のファイルアクセスやネットワーク機能を檻(サンドボックス)の中に閉じ込めることができます。本記事では、この注目の次世代セキュリティ機構の仕組みを分かりやすく解説します。

この記事のポイント

  • 管理者(root)権限不要!非特権プロセス自身がカーネルにアクセス制限を課す仕組み
  • ファイルシステム(読み・書き・実行)に加え、TCPポート接続などのネットワーク制限に対応
  • 外部ライブラリを読み込んだ直後に権限を不可逆的に剥奪し、不正動作を徹底防御

従来のサンドボックス技術との決定的な違い

Linuxには以前からseccomp(システムコールフィルタリング)やnamespaces(コンテナ技術)が存在しましたが、ファイルパス単位での柔軟なアクセス制御を非特権で行うのは困難でした。各セキュリティ技術の立ち位置を比較してみましょう。

技術名 必要な権限 制御粒度・特徴
SELinux / AppArmor root(管理者権限) システム全体で強制。設定が極めて複雑で一般アプリ単体では配備しにくい
seccomp-bpf 非特権(prctl併用) システムコール番号単位。ファイルパス文字列を安全に検査するのは困難
Landlock LSM 非特権(誰でも可) ファイルパス(FD)およびTCPポート単位。アプリ内部から自律的に有効化可能

Linuxカーネルの内部構造やセキュリティモジュールの基礎概念を網羅的に学びたい場合は、Linux入門書籍を片手にカーネルツリーを追うと理解が深まります。

Landlockはどうやってプロセスを閉じ込めるのか?

Landlockの真骨頂は、「最小権限の原則(PoLP)」をプログラムの内側から実行できる点です。例えば、PDFビューアや画像変換ツールを開発する場合を考えてみましょう。初期化フェーズでフォントファイルや設定ファイルを読み込んだ後は、もはやホームディレクトリの秘密鍵(`~/.ssh/id_rsa`)やOSの設定ファイルを読み書きする必要は一切ありません。

そこで、初期化が終わった瞬間に次のような手順でLandlockを発動させます。

  • 1️⃣ルールセットの作成:`landlock_create_ruleset()` を呼び出し、許可したいアクセス権(読み取り、書き込み、実行等)のフラグを定義。
  • 2️⃣ホワイトリストの追加:作業用ディレクトリ(`/tmp/workspace` など)のファイルディスクリプタを紐付け、アクセス許可ルールを追加。
  • 3️⃣サンドボックスの適用(不可逆):`landlock_restrict_self()` を実行。これ以降、指定したディレクトリ以外へのアクセスはカーネルレベルで即座に拒絶(EACCES)される。

一度適用されたLandlockの制約は、同一プロセス内で解除することは絶対にできません。たとえ外部から読み込んだ悪意あるライブラリがシェルを奪おうとしても、一切のファイル改ざんや機密情報の窃取が物理的に不可能になるのです。防御的プログラミングやセキュアコーディングの実務を体系的に学ぶには、セキュリティ実践入門の実践例が非常に役立ちます。

GoやRustからの簡単な利用と今後の展望

現在、Go言語向けには `landlock-go`、Rust向けには公式クレート `landlock` が提供されており、C言語のシステムコールを直接叩かなくても、わずか数行のラッパー関数を呼ぶだけでサンドボックスを導入できます。さらに最新カーネルでは、TCPバインドや特定ポートへの外向き通信をブロックするネットワーク制御機能も追加され、防衛範囲は着実に広がっています。

💡 導入時の注意点:Landlockは非特権で動くため手軽ですが、カーネルバージョンが古い環境(5.13未満)ではシステムコールが存在しないため、フォールバック処理(非対応環境でもエラー終了させず警告を出すなど)を忘れずに実装してください。

まとめ

セキュリティ対策をインフラ担当者やOS管理者の設定だけに任せる時代は終わりました。アプリケーション自身が「自分は今から危険なデータを処理するから、必要な場所以外の権限を捨てる」とカーネルに宣言できるLandlockは、今後のLinuxソフトウェア設計におけるデファクトスタンダードとなっていくでしょう。

GoやRustでCLIツールやバックエンドサービスを開発している方は、ぜひこの強力な非特権サンドボックスを取り入れて、強固な要塞アプリを構築してみてください。

このブログを検索

このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
Amazonのアソシエイトとして、「色即是空」な「空即是色」blogは適格販売により収入を得ています。