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