UID:
20250602211607
Created:
2025-06-02
Updated:
2026-02-08

Landlock を使ってみる

Landlock はカーネルのセキュリティ機構。非特権でも、プロセスがアクセス可能なファイルパスや TCP ポートを制限できる。

今回は、 Landlock を使って簡単な sandbox を作ってみた。

簡単なコードで試してみる

リポジトリ: nohopium/smolock

読み取り権限のみ付与していることやネットワークの隔離に対応していないなど制限はあるが、とりあえず動くものができた。

テスト

例1: /etc への権限を与えていないため、 /etc への読み取りが拒否される

> ./target/debug/smolock -p /home/ ls -la /etc
ls: cannot open directory '/etc': Permission denied

例1: /home への権限を与えると、問題なく実行できる

> ./target/debug/smolock -p /home/ ls -la /home
total 0
drwxr-xr-x 1    0    0   12 Dec 13  2023 .
drwxr-xr-x 1    0    0  138 May 15 11:06 ..
drwx--x--x 1 1000 1000 1226 Jun  6 08:21 hopium

例2: 同じように、権限がなく拒否される

> ./target/debug/smolock head ./src/main.rs 
head: cannot open './src/main.rs' for reading: Permission denied

例2: 権限を付与すると、実行できる

> ./target/debug/smolock -p ./src/ head ./src/main.rs 
use std::{os::unix::process::CommandExt, path::PathBuf, process::Command};

use anyhow::Result;
use clap::Parser;
use which::which;

#[derive(Parser, Debug)]
struct Args {
    #[arg(short, long)]
    paths: Vec<PathBuf>,

いくつか備考

  • コマンド (実行ファイル) 実行時に要求されるファイル、例えば実行ファイルに動的リンクされる共有オブジェクトファイル、への読み取り権限がないと。
    • ワークアラウンドとして /usr/lib に読み取り権限を与えている
  • -p で指定されたパスに対して読み取り権限しか与えていないため、書き込み権限を要する場合は拒否される。
> ./target/debug/smolock -p ./src/ rm ./src/main.rs 
rm: cannot remove './src/main.rs': Permission denied

参考

#public