【Linux】Ubuntu LVM暗号化をリモート解除する方法【Dropbear SSH】

UbuntuでLVM暗号化を利用していて、起動時にパスフレーズをリモートで入力したい場合、Dropbear SSH を initramfs に組み込むことで実現できます。
Dropbear は軽量な SSH サーバーで、OS が完全に起動する前の初期起動段階 (initramfs) で動作させることができます。これにより、SSH 経由で接続し、LUKS 暗号化された LVM ボリュームのパスフレーズを入力して、システムの起動を継続させることが可能になります。
この記事ではDropbear SSH を initramfs に組み込み、リモートで暗号化を復号する方法を解説します。
環境
- Ubuntu Desktop 24.04
- LUKS (Linux Unified Key Setup) で暗号化された LVM が設定済みであること。
Dropbear SSH のセットアップ
Dropbear SSH と busybox のインストール
dropbear-initramfs
パッケージをインストールします。
これは、initramfs 環境で Dropbear を動作させるために必要なものです。busybox
も依存関係としてインストールされることが多いですが、念のため確認してください。
sudo apt update
sudo apt install dropbear-initramfs busybox
SSH 公開鍵の追加
SSH キー認証を利用することを強く推奨します。パスワード認証も可能ですが、セキュリティ上のリスクが高まります。
リモートから接続するために使用するクライアントの公開鍵(例えばid_rsa.pub)を、Dropbear が起動時に読み込む authorized_keys
ファイルに追加します。
公開鍵認証によるssh接続設定については以下の記事で解説しています。
(LVM暗号化をリモート解除しようとしているようなレベルの人には必要ないかな…笑)

まずは公開鍵と秘密鍵を作成しましょう。もうすでに持っている人はその鍵でもOKです。
以下のコマンドで作成します。(方式は好みのものでOK)
ssh-keygen -t rsa
公開鍵の内容をコピーして、authorized_keys
に追記します。
このファイルは/etc/dropbear/initramfs
に作成します。
もうすでにLinuxマシンにauthorized_keys
があり、同じ内容を用いたい場合は/etc/dropbear/initramfs
にauthorized_keys
をコピーしましょう。
新しく作成する場合は以下のコマンドで公開鍵の内容をファイルに追記できます。
sudo bash -c 'cat ~/.ssh/id_rsa.pub >> /etc/dropbear/initramfs/authorized_keys'
その後、authorized_keysファイルの権限設定を以下のとおり行います。
sudo chmod 600 /etc/dropbear/initramfs/authorized_keys
chmod 600
は、ファイル所有者 (root
ユーザー) のみが読み書きでき、他の誰も読み書き実行できないように設定します。
Dropbear の設定
/etc/dropbear/initramfs/dropbear.conf
を編集して、Dropbear の動作を設定します。
まず、以下のコマンドで上記ファイルを開きます。
sudo vi /etc/dropbear/initramfs/dropbear.conf
ファイル内の#DROPBEAR_OPTIONS=""
という記述を探します。見つけたら冒頭の#
を削除してコメントアウトを外しましょう。
そして、以下の通り編集します。
DROPBEAR_OPTIONS="-I 180 -j -k -p 222 -s -c cryptroot-unlock"
設定内容の説明
ポートの変更
標準のSSHポート (22) と衝突しないように、別のポートを設定することが推奨されています。ここでは以下の個所でポート222を接続先として設定しています。
-p 222
強制コマンド
SSH接続後、すぐに cryptroot-unlock
コマンドが実行されるように設定しています。
cryptroot-unlock
コマンドは、LVM暗号化のパスフレーズを入力し、システムがLVMを復号して、通常の起動プロセスを続行するものです。
rootログインについて
復号時にrootログインをする必要があるので、ここではrootログインを禁止していません。
Dropbear SSHがinitramfs内で起動し、LVMの復号が完了した後は、通常のOSの起動プロセスへと制御が移ります。このとき、initramfs環境は基本的にアンマウントされ、破棄されます。
そのため、復号後もDropbear SSHが起動したままになることはないので、大丈夫だと思います。
その他設定項目
-I
はアイドルタイムアウト-j -k
はポートフォワーディングの無効化-s
はパスワード認証の無効化
initramfs のネットワーク設定
静的IPアドレスの割り当て
もし静的IPアドレスを使用する場合、initramfs
起動時にネットワークが利用可能になるように設定が必要です。
まず、以下のコマンドでネットワークデバイス名とIPアドレスを確認します。
ip a
すると以下のようなテキストが出力されます。(説明に不要な個所は省略しています)
1: lo: <LOOPBACK,UP,LOWER_UP>
.
.
.
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
.
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic enp0s3
.
.
.
3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP>
.
inet 192.168.1.105/24 brd 192.168.1.255 scope global dynamic wlp0s20f3
.
.
enp0s3
やwlp0s20f3
がネットワークデバイス名で、
すぐ後に書いている数字がIPアドレスです。inet
ネットワークデバイス名と種類
lo
: これはループバックインターフェースで、内部通信用なので無視して構いません。enp0s3
: これが有線LANのデバイス名である可能性が高いです。最近のUbuntuではenp
やens
、eno
で始まる名前がよく使われます。(例:enp5s0
もこれに該当)-
wlp0s20f3
: これはWi-Fiインターフェースのデバイス名である可能性が高いです。wlp
で始まる名前が一般的です。
UP
と表示されているデバイスは、現在有効になっている(接続されている)インターフェースです。
次に、以下のコマンドで /etc/default/grub
を開きます。
sudo vi /etc/default/grub
ファイルの中に GRUB_CMDLINE_LINUX=
で始まる行があるか確認し、なければ追記、あればコメントアウトを解除して編集します。
静的IPアドレスを設定するための書式は以下の通りです。
GRUB_CMDLINE_LINUX="ip=<クライアントIP>:<サーバーIP>:<ゲートウェイIP>:<ネットマスク>:<ホスト名>:<デバイス>:<autoconf>"
各フィールドはコロン :
で区切られ、省略することも可能ですが、静的IPを設定する場合は必要な情報をすべて指定するのが一般的です。
各設定項目の説明
<クライアントIP>
- 割り当てたい固定IPアドレス
- 必須。
- 例:
192.168.1.100
<サーバーIP>
- 通常、TFTPサーバーなどのIPアドレス。
- 省略可能で、その場合は空にする。
- 空のままにする場合はコロンを連続させる
::
<ゲートウェイIP>
- デフォルトゲートウェイのIPアドレス
- 必須
- 例:
192.168.1.1
<ネットマスク>
- フル形式 (
255.255.255.0
) または CIDR 形式 (/24
) のどちらでも指定できるが、initramfs.conf
の場合はフル形式 (255.255.255.0
) を推奨 - 例:
255.255.255.0
- フル形式 (
<ホスト名>
- マシンのホスト名
- 任意
- 例:
erirubuntu
<デバイス>
- ネットワークインターフェース名
ip a
コマンドで確認した名前を使用する- 例:
enp0s3
<autoconf>
: 自動設定の方法。on
: DHCP/BOOTP を試みる。off
: 自動設定なし (静的IPアドレスの場合に指定)。dhcp
: DHCP を使用。bootp
: BOOTP を使用。
記述例は以下のようになります。
GRUB_CMDLINE_LINUX="ip=192.168.1.100::192.168.1.1:255.255.255.0:erirubuntu:enp0s3:off"
最後に以下のコマンドで修正を反映します。
sudo update-grub
initramfs の更新
設定を保存したら、以下のコマンドで initramfs
イメージを再構築します。
sudo update-initramfs -u -k all
復号後のIPアドレス固定
以上の設定でリモート復号はできるようになっているのですが、復号後のIPアドレスも復号前のものと合わせておかないと、外部ネットワークに接続できなくなることがあります。
そのため、以下復号後のIPアドレス固定を行っていきます。
Ubuntu側からIPアドレスを固定するには、/etc/netplan
に.yaml
ファイルを追加します。/etc/netplan
の中身を確認してみましょう。
ls /etc/netplan
すでにいくつかの.yaml
ファイルがあると思います。このファイルを使ってnetplanがネットワーク設定をしていくのですが、ファイル名のアルファベット順に処理されてゆき、設定が順に上書きされていきます。
そのため、新しく設定を追加する場合は上書きしたいのアルファベット順で最後になるようにファイル名つけて.yamlファイルを追加します。
例えば、以下のように90-config.yaml
を作成します。
sudo vi /etc/netplan/90-config.yaml
するとvim
の編集画面になります。以下の内容をファイルに記述します。(#はコメントです)
network:
version: 2
renderer: NetworkManager # もしくは networkd
ethernets:
enp3s0:
dhcp4: false
addresses:
- 192.168.1.100/24 # 192.168.1.100に固定する場合の例
routes:
- to: default
via: 192.168.1.1 # ← ルーターのIPアドレス
nameservers:
addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
8.8.8.8と8.8.4.4は、Google Public DNSと呼ばれる、Googleが無料で提供しているパブリックなDNS(Domain Name System)サーバーのIPアドレスです。
あとは以下のコマンドで変更を適用しましょう。
sudo netplan apply
再起動とテスト
システムを再起動します。コマンドで行う場合は以下の通りです。
sudo reboot
起動後、LUKS のパスフレーズ入力待ちの状態で止まります。
この時、Dropbear SSH サーバーが起動しているので、別のマシンからSSHで接続します。
ssh -p <設定したポート番号> -i <秘密鍵> root@<UbuntuマシンのIPアドレス>
パスフレーズを入力するように求められたら、LVM暗号化のパスフレーズを入力し、Enterキーを押します。
パスフレーズが正しければ、システムがLVMを復号し、通常の起動プロセスを続行することができます。
まとめ
この記事ではDropbear SSH を initramfs に組み込み、リモートで暗号化を復号する方法を解説しました。
これによって、マシンの前でしか復号できなかったのがリモートで行えるようになるので、かなり便利になるのではないでしょうか。