SSH による LUKS のリモート解錠:dropbear-initramfs と cryptroot-unlock
リモートサーバーの LUKS ルートを起動時に解錠する方法:dropbear-initramfs をインストールし、鍵を追加し、ポートと IP を設定し、initramfs を再構築したら、SSH で接続して cryptroot-unlock を実行します。
結論:`dropbear-initramfs` をインストールし、SSH 公開鍵を `/etc/dropbear/initramfs/authorized_keys`(Debian 12/13、Ubuntu 24.04)に置き、initramfs にネットワーク設定を与えて、`update-initramfs -u` を実行して再起動します。サーバーがパスフレーズを待っている間に、専用ポートで動く小さな Dropbear サーバーに SSH で接続して `cryptroot-unlock` を実行すれば、起動は通常どおり続行されます。
このガイドは、ルートファイルシステムがすでにLUKS によるルート暗号化ガイドのとおり LUKS 上にあり、Debian と Ubuntu のインストーラーのデフォルトどおり `/boot` が暗号化されていないことを前提としています。カーネルと initramfs を自分で管理できる KVM VPS ならどこでも動作し、小型 VPS 向けセルフホスティングスタックのようなサービスをディスクに載せる前の土台として最適です。
リモート解錠の仕組み
ルートが暗号化されたシステムでは、カーネルはまず initramfs を読み込みます。これは `/boot` に暗号化されずに保存された小さな一時ルートファイルシステムです。その役割は、LUKS デバイスを見つけ、パスフレーズを尋ね、デバイスを開いて本来のルートに引き継ぐことです。通常、このプロンプトはローカルコンソールにしか表示されません。
`dropbear-initramfs` は initramfs に3つのものを追加します。Dropbear SSH サーバー、ネットワーク設定のステップ、そして `cryptroot-unlock` ヘルパーです。Dropbear はパスフレーズのプロンプトより前に起動し、組み込んだ鍵による公開鍵ログインのみを受け付けます。`cryptroot-unlock` は、待機中の `cryptsetup` のプロンプトにあなたのパスフレーズを渡します。ルートが開かれると initramfs は Dropbear を終了し、通常の OpenSSH サーバーがいつもどおり起動します。
バージョンによってファイルパスが異なる
Dropbear 2022.83 の導入時に設定ディレクトリが移動しました。古いチュートリアルの多くはまだ旧パスを示しており、そこに置いた鍵は現在のリリースでは何の警告もなく無視されます。コマンドをコピーする前に、お使いのリリースを確認してください。
Note · オプションファイルは、どのリリースでも同じディレクトリの `dropbear.conf` です。initramfs のホスト鍵(`dropbear_ed25519_host_key` など)もここにあり、稼働中のシステムの OpenSSH ホスト鍵とは別物です。
| リリース | 設定ディレクトリ | 鍵ファイル |
|---|---|---|
| Debian 13 (trixie) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Debian 12 (bookworm) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Ubuntu 24.04 (noble) | `/etc/dropbear/initramfs/` | `/etc/dropbear/initramfs/authorized_keys` |
| Debian 11、Ubuntu 22.04 以前 | `/etc/dropbear-initramfs/` | `/etc/dropbear-initramfs/authorized_keys` |
Debian 12/13 と Ubuntu 24.04 での設定手順
- 01.パッケージをインストールします:`apt install dropbear-initramfs`。この時点で `authorized_keys` ファイルがない、または無効だという警告が出るのは想定どおりです。
- 02.公開鍵(できれば専用の Ed25519 鍵)を `/etc/dropbear/initramfs/authorized_keys` に1行1鍵で追加し、解錠しかできないように制限します。
- 03.`/etc/dropbear/initramfs/dropbear.conf` で Dropbear のオプションを設定します。initramfs のホスト鍵が `known_hosts` 内の通常の SSH ホスト鍵と衝突しないよう、デフォルト以外のポートも指定します。
- 04.`ip=` カーネルパラメーター(静的)で initramfs のネットワークを設定するか、VPS のネットワークが対応していれば DHCP に任せます。
- 05.`update-initramfs -u` で initramfs を再構築し、カーネルコマンドラインを変更した場合は `update-grub` を実行します。
- 06.万一に備えてコンソールアクセスを開いた状態で再起動し、接続して `cryptroot-unlock` を実行します。
apt install dropbear-initramfs
# 1. Key (forced command: the key can only unlock)
echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/cryptroot-unlock" ssh-ed25519 AAAA...yourkey unlock@laptop' \
> /etc/dropbear/initramfs/authorized_keys
chmod 600 /etc/dropbear/initramfs/authorized_keys
# 2. Options in /etc/dropbear/initramfs/dropbear.conf
# -p 2222 listen on port 2222
# -s disable password logins
# -j -k no local/remote port forwarding
# -I 300 drop idle sessions after 300 s
DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 300"
# 3. Rebuild
update-initramfs -uinitramfs のネットワーク設定
initramfs は `/etc/network/interfaces`、netplan、systemd-networkd を読みません。使うのはカーネルの `ip=` パラメーター、または `/etc/initramfs-tools/initramfs.conf` の `IP=` 行です。どちらも設定されていない場合はすべてのインターフェースで DHCP を試みます。多くのクラウドではこれで動きますが、静的割り当ての VPS では保証されません。
書式は `ip=<client-ip>::<gateway-ip>:<netmask>:<hostname>:<device>:off` です。稼働中のシステムで `ip -4 addr` と `ip route` の値を確認して使います。initramfs 内のインターフェース名は通常、同じ予測可能な名前(例:`ens3` や `eth0`)です。わからない場合はデバイス欄を空にすれば、最初のインターフェースが使われます。initramfs のネットワーク設定ステップでは IPv6 のサポートが限られているため、ここでは IPv4 が確実な選択です。
# /etc/default/grub (static IPv4 example, documentation addresses)
GRUB_CMDLINE_LINUX="ip=203.0.113.10::203.0.113.1:255.255.255.0::ens3:off"
update-grub
update-initramfs -u
# From your workstation after reboot:
ssh -p 2222 [email protected]
# without the forced command, type: cryptroot-unlock解錠と日常の運用
再起動後、サーバーがポート 2222 で応答するまで待ち、`root` として接続します。設定手順の強制コマンドを使っていれば `cryptroot-unlock` がすぐに起動して LUKS パスフレーズを尋ねます。使っていない場合は BusyBox シェルが開くので、自分で `cryptroot-unlock` と入力します。成功するとセッションが閉じ、initramfs が起動を続け、1分ほどでSSH 強化ガイドのとおり強化した通常の SSH サーバーがポート 22 で応答します。
解錠用ポートには別の `known_hosts` エントリーを使いましょう。例えば `~/.ssh/config` に `Port 2222` と `HostKeyAlias myserver-unlock` を含む `Host myserver-unlock` ブロックを作ります。カーネルが更新されるたびに Debian と Ubuntu は initramfs を再生成し、Dropbear の鍵とオプションは保持されますが、大きなアップグレードの後は一度再起動してテストしてください。
- ▹Connection refused(接続拒否):ネットワーク設定が間違っています。コンソールで `ip=` の値を確認してください。
- ▹ホスト鍵の警告:通常のエイリアスで initramfs のホスト鍵に接続しています。別のエイリアスを使ってください。
- ▹`cryptroot-unlock` が待機中のデバイスがないと言う:システムがすでに起動しているか、`/etc/crypttab` にルートのエントリーがありません。
- ▹鍵を変更しても反映されない:旧パス `/etc/dropbear-initramfs/` を編集したか、`update-initramfs -u` を忘れています。
脅威モデル:リモート解錠が守るもの、守らないもの
リモート解錠付きの LUKS は保存データを守ります。電源の切れたディスク、コピーされたディスクイメージ、廃棄されたドライブ、停止中に押収されたサーバーから見えるのは暗号文だけです。これは VPS にとって現実的で有用な保証です。
ただし、ホストを支配する者から稼働中のサーバーを守ることはできません。`/boot` 内の initramfs とカーネルは暗号化されていないため、ハイパーバイザーやコンソールへのアクセス権を持つ者は、次回起動時にパスフレーズを記録するようそれらを改ざんできます。また、稼働中の VM のメモリ(LUKS マスター鍵を含む)はホストから読み取れます。リモート解錠は押収やディスク漏洩への対策と考え、悪意あるハイパーバイザーへの対策とは考えないでください。Dropbear のホスト鍵が変わっているなど、再起動時の異常は調査する価値があります。
Note · NoctisNode の VPS では、Debian 13/12 と Ubuntu 24.04 のイメージで KVM 上のフル root 権限が得られるので、この設定は記載どおりに動作します。どこでも同じ限界がここにも当てはまります。暗号化が守るのはディスクであり、稼働中のゲストではありません。プロバイダー側が何を記録し、何を記録しないかについてはノーログ VPS の解説を参照してください。
よくある質問
QDebian 12 で dropbear initramfs の authorized_keys ファイルはどこにありますか?
ADebian 12、13 と Ubuntu 24.04 では `/etc/dropbear/initramfs/authorized_keys` です。Debian 11 と Ubuntu 22.04 では `/etc/dropbear-initramfs/authorized_keys` でした。変更後は `update-initramfs -u` を実行してください。
Qcryptroot-unlock は何をするのですか?
A`cryptroot-unlock` は initramfs 内のヘルパーで、保留中の LUKS パスフレーズのプロンプトを見つけ、入力したパスフレーズをそこへ渡します。デバイスが開くと起動が続行され、Dropbear のセッションは終了します。
Qdropbear-initramfs の SSH ポートを変更するには?
A`/etc/dropbear/initramfs/dropbear.conf` に `DROPBEAR_OPTIONS="-p 2222"`(と必要なその他のフラグ)を設定し、`update-initramfs -u` を実行して再起動します。
QVPS で SSH による LUKS のリモート解錠は安全ですか?
A電源の切れたディスクやコピーされたディスク上のデータは守られます。ただし、ハイパーバイザーへのアクセス権を持つ者からは守れません。その人物は暗号化されていない initramfs を改ざんしたり、稼働中の VM のメモリを読み取ったりできます。
Qdropbear-initramfs で LUKS2 を使えますか?
Aはい。解錠は Linux のユーザー空間で `cryptsetup` によって行われるため、Argon2id を使う LUKS2 も動作します。フォーマットの違いについてはLUKS2 と LUKS1 の比較を参照してください。