通常の方法で構築したWSL2環境は /mnt/c/ にWindowsのCドライブがマウントされています。本稿ではWindows側のファイルへアクセスできない隔離されたWSLインスタンスを、通常のWSLとは別で構築してみます。
昨今サプライチェーン攻撃が多発しており、対策のひとつとして「OSSはコンテナ上で動かす」という方法がよく挙げられます。しかしOSSでセルフホストできるタイプのSaaSによくあるような「Docker Composeで起動できるOSS」は、そのままでは同様の方法は取れません。コンテナ内のアプリケーションからは手が出せないとしてもcompose.yamlが強力な機能をいくつか持っているので、たとえば~/.sshなどをマウントして奪い去るような攻撃は考えられます。
そこで、普段使いのWSLとは別に隔離されたWSL環境を作って動かすことでリスクを下げます。
隔離されたWSL2環境構築
まず隔離用WSLインスタンスを構築します。デフォルトだとWSL2はUbuntuが入っていると思うので、Debianなど違うディストリビューションをインストールすると後から区別が付けやすいです。
> wsl --install -d Debian
インストールできたら、WSL内で/etc/wsl.conf を開きます。
$ sudo nano /etc/wsl.conf
以下のように記述することでCドライブのマウントの設定を無効化します。
$ cat /etc/wsl.conf
[boot]
systemd=true
[automount]
enabled=false # Cドライブなどを自動マウントしない
[interop]
enabled=false # Windowsのexeを実行不可にする
appendWindowsPath=false # WindowsのPATHを引き継がない
WSLインスタンスを再起動します。
> wsl --terminate Debian
> wsl -d Debian
これで完了です。/mnt/c/を確認すると、ディレクトリはありますが中身は何も無いことが分かります。
$ ls -la /mnt/c/
total 8
drwxrwxrwx 2 root root 4096 Dec 21 18:29 .
drwxr-xr-x 5 root root 4096 Dec 21 18:29 ..
実際に使ってみる
構築した隔離WSL環境で、例としてLangfuseを立ち上げてみます。LangfuseはLLMのトラッキングサービスで、docker-compose.yml が用意されておりOSS版をDocker Composeを使ってセルフホストできます。
起動はPodman+Docker Compose構成でやってみます。まずは環境をセットアップします。
$ sudo apt update && sudo apt upgrade
$ sudo apt install podman docker-compose
$ systemctl --user enable --now podman.socket
$ export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
Langfuseをcloneしてきて立ち上げます。
$ git clone https://github.com/langfuse/langfuse.git
$ cd langfuse
$ podman compose up
しばらくすると localhost:3000にLangfuseのアプリケーションが立ち上がります。他のWSL2インスタンスやWindowsホスト側のブラウザからも閲覧できます。アカウント作成してキーを発行して、LLMアプリ側からlocalhost:3000に向ければ普通にトレーシングができます。
LANGFUSE_SECRET_KEY = "発行したキー"
LANGFUSE_PUBLIC_KEY = "発行したキー"
LANGFUSE_BASE_URL = "http://localhost:3000"
という感じで、Docker Composeで立ち上げるタイプのOSSを、隔離WSL環境で動作させることができました。
余談: メインで使うWSLを隔離できないのか?
本稿の方法で隔離したWSLインスタンスはWindows側のアプリケーションを呼び出せなくなります。代表的なものとしてVS Codeが呼び出せないので困ります。
$ code
-bash: code: command not found
メインで使うWSLインスタンスは通常通り使いつつ、外部から取得したアプリケーションなどを試すときに隔離インスタンスを使うというように使い分けるのが開発体験と安全性のバランスが良いと思います。