SJ blog
Qubes OS
Z

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Qubes OS で開発環境を構築する実践ガイド

Qubes OS 上にプロジェクト別の隔離された開発環境を構築する方法。Python/Node.js/Javaの設定、Gitリポジトリの管理、VS Codeの使い方を解説します。

一言結論

Qubes OSで開発環境をクライアント別・プロジェクト別のVMに分離すると、あるクライアントのシークレットが別クライアントに漏れる事故を構造的に防止でき、怪しいコードの解析も使い捨てVMで安全に実行できる。

Qubes OS で開発する利点

  • プロジェクト別に完全隔離 された環境が作れる
  • クライアントAのコードがクライアントBに漏れない
  • マルウェアを含む可能性があるコードを安全に扱える
  • テスト環境を使い捨て(DisposableVM)にできる

開発用VMの設計

dev-personal    ← 個人プロジェクト(Fedora, 青ラベル)
dev-client-a    ← クライアントA専用(Fedora, 青ラベル)
dev-client-b    ← クライアントB専用(Debian, 青ラベル)
dev-dangerous   ← 怪しいコードの解析(Fedora, オレンジラベル)
dev-vault       ← シークレット(.env, SSH鍵)(ネットワークなし, 黒ラベル)

テンプレートの準備

# 開発用テンプレートを作成
qvm-clone fedora-40 fedora-40-dev

# テンプレートに開発ツールをインストール
qvm-run fedora-40-dev "xterm"
# fedora-40-dev のターミナルで
sudo dnf install -y \
    git \
    vim \
    tmux \
    python3 \
    python3-pip \
    nodejs \
    npm \
    java-17-openjdk \
    java-17-openjdk-devel \
    docker \
    docker-compose \
    curl \
    wget \
    jq

sudo poweroff

Python 開発環境

# dev-personal AppVM のターミナルで
# pyenv でバージョン管理(/home に入るので永続化される)
curl https://pyenv.run | bash

# .bashrc に追加
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# Python バージョンのインストール
pyenv install 3.12.0
pyenv global 3.12.0

# 仮想環境の作成
python3 -m venv ~/.venv/myproject
source ~/.venv/myproject/bin/activate
pip install requests flask pytest

Node.js 開発環境

# nvm でバージョン管理
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

source ~/.bashrc
nvm install 20  # LTS
nvm use 20

# プロジェクト初期化
mkdir ~/projects/myapp && cd ~/projects/myapp
npm init -y
npm install express

Git の設定

# AppVM のターミナルで
git config --global user.name "Your Name"
git config --global user.email "your@email.com"

# SSH 鍵の生成(vault VM で生成して公開鍵だけ取り出す)
# vault VM で:
ssh-keygen -t ed25519 -C "your@email.com"
# 公開鍵を vault から dev VM にコピー

# dev VM で
cat ~/.ssh/id_ed25519.pub
# → GitHub/GitLab に登録する

SSH エージェントの設定(VM間)

vault VM に SSH 鍵を保管しつつ、dev VM から使う場合:

# vault VM のターミナルで
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519

# dom0 ターミナルで SSH エージェントを dev VM に転送
# (SSH Agent Forwarding は設定が複雑なため、鍵を直接 dev VM に置く方が現実的)

VS Code のセットアップ

# テンプレートにVS Codeをインストール
qvm-run fedora-40-dev "xterm"
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

# リポジトリの追加
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'

sudo dnf install -y code
sudo poweroff
# dev AppVM でVS Codeを起動
qvm-run dev-personal "code"

Qubes OS での VS Code リモート開発

VS Code のリモート開発機能は通常Qubes OSでは使えませんが、代替として:

  • VM 内で直接 VS Code を使う
  • または SSH + ポートフォワーディングで別VMから接続

Docker の使用

Qubes OS では Docker の使用にいくつか制限があります:

# テンプレートで Docker をインストール
sudo dnf install -y docker docker-compose
sudo systemctl enable docker

# AppVM のrc.localに追加
echo "sudo systemctl start docker" >> /rw/config/rc.local

# Docker を使う
docker run hello-world
docker-compose up -d

注意: HVMではなく通常のAppVM(Xen PV)での Docker の動作は制限される場合があります。StandaloneVM または Fedora 40 以降での KVM 使用が推奨される場合もあります。

シークレットの管理

# .env ファイルは vault VM で保管
# vault VM のターミナルで
cat ~/secrets/client-a.env

# 必要な時だけ dev VM にコピー(使用後は削除)
qvm-copy-to-vm dev-client-a ~/secrets/client-a.env
# dev-client-a で使用後に削除
rm ~/QubesIncoming/vault/client-a.env

まとめ

Qubes OS での開発は最初に設定が必要ですが、一度整えると:

  • プロジェクト間の隔離が自動的に保たれる
  • マルウェアが含まれる可能性のあるコードを安全に扱える
  • クライアントごとに完全に独立した環境を持てる

「面倒くさい」のと「安全」はトレードオフですが、セキュリティを重視する開発者には最高の環境です。