NixOSでセキュアな外部リソース実行環境を作る
#Environment #Software / #NixOS
Date: #2025-03-25
-
目的
NixOSで外部から入ってきた実行スクリプトなどを安全に隔離して実行できるようにする
Cline などの、カジュアルにシステムを吹っ飛ばす AI Coding Agent を安全に実行できるようにする
最終目標
メインのファイルシステムから exec フラグを取り除く
特に $HOME 以下はそうしたい
ただ部分的に exec が必要な箇所は残るので、そこはそのまま維持する
システムへインストールするアプリケーションを減らす
microvm で確保可能なソフトウェアはそちらへ移す
例えば Firefox とか
NixOS のホスト側では必要最低限の実行ファイルのみ用意する
ゴールにしないこと
完全にセキュアな環境を目指さない
/nix が exec でマウントされている以上、perl evil-script.pl のようなヤツは防ぎようがない
ここまで防ごうと思うと Qubes OS を使えってなる
使えそうな道具
https://github.com/astro/microvm.nix
流れ的なやつ
開発環境
とりあえず microvm を定義する
その際に microvm では下記のようなことを行う
開発ファイル一式を ~/dev にマウントさせる
これは Virtiofs を使えば良さそう?
この場合、ホストの fs が noexec でもスクリプトを実行できるか確認する
システムの /nix/store/ を使えるようにする
ただしこれについては ro で
rootfs を吹っ飛ばされる対策として
開発用ソフトウェアは microvm に突っ込む
nvim とか linter, formatter, and lsp など
開発時には make dev で開発環境が立ち上がるようにする
tmux で開発環境を維持する?
tmux でエディタと shell を起動する
tmux が終了すると microvm も止まる
特定の開発環境
JavaScritp / TypeScript 向け
.node_modules はホスト側に置かない
外部からの侵入経路がここになるため
ただしセキュリティスキャンが効かなくなるので、そこは注意が必要かもしれない
自身のプロダクトならともかく、業務で使うとなるともう少し工夫が必要そう
業務用セキュリティソフトウェアが必要なら microvm 自体に仕込む?
Perl 向け
local はホスト側に置かない
CPAN Module のインストール先であるため
GUI アプリケーション
Experimental だけど出来るらしい
対策しないとダメそうなところ
各種テーマ
GTKとQt、Icon の辺り
Wayland を使っているのでそこの手当て
Input Method
fcitx5 が動かないと日本語入力できない
Web 開発でのアクセス手段の確保
Web UI の確認とかで要る
各種アプリケーション固有
Firefox
~/Downloads は rw でマウントする
nvim と textlint を使える環境は用意する
これははてなブログのエディターフォームで nvim を使えるようにしているため
Ctrl-e で nvim が起動して、そこから記事を編集するようになっている
Yubikey を attach する
これは WebAuthn を使っていることが理由
Cloudflare の dashboard へのログインなどで利用している
Thunderbird
~/Downloads は rw でマウントする
現状
exec でマウントしているディレクトリなど(/nixは除く)
/
var
lib
docker - まぁ docker では普通に必要、ただ docker rootless に移行したいところでもある
home
nyarla
.cache
nvim - 確か codeium 関係でこうなっていたはず
.config
audiogridder - AudioGridder の利用で必要
.fly - fly.io で必要だった、が、今は使ってない
.local
share
waydroid - Waydroid の実行で必要。たぶんここは動かせない
.mozilla - DRM 再生関連で実行権限が必要
.wrangler - wrangler で必要だったが今でも必要か?
Applications - 実行用スクリプト群があるため
Programming - 開発ディレクトリ、かつ実行権限が必要なもの用
計画
とりあえず microvm.nix を動かせるようにする
~/Environment 以下に microvm 環境を用意する(?)
さすがにここは git で管理する
想定するディレクトリ構造
~/Environment - 可能なら noexec でマウントする
{Kind} - 今のディレクトリ構造と同じ
{env} - 開発ならソフトウェア名・アプリならアプリ名
flake.nix - ここに microvm の定義を置く
Makefile - タスクランナーとして置く・ただし開発ディレクトリでは使えないかも(C言語など)