VPSの暗号化は一行で終わるように見えます — cryptsetup luksFormat、それで完了、と。しかし実際には、多くの人が期待していたものを静かに裏切ります。レンタルしているマシンでは、カーネルの下にハイパーバイザーが存在するため、脅威モデルはフルディスク暗号化が本来想定していたものとは異なります。本ガイドはその実情を率直に扱います。LUKSがVPS上で何を防ぎ、何を防がないのか、実際に機能する2つのパス、そして自分のサーバーから締め出されないように暗号化したルートをSSH経由でロック解除する方法までを解説します。
レンタルサーバーでの暗号化が実際にもたらすもの
フルディスク暗号化が守るのは「静止状態のデータ」です。この一言にはさまざまな意味が詰め込まれており、VPSにおいてはどの瞬間が静止状態に該当し、どの瞬間が該当しないのかを明確にしておく価値があります。多くの期待が崩れるのは、まさにこの2つの間のギャップにおいてです。
廃棄されたハードウェア
ドライブは故障し、交換され、ラックから運び出されます。稼働を終えたディスク上のLUKSボリュームは、次にそれを扱う人にとってはただのノイズの塊にすぎません。この場合、暗号化は完全に問題を解決します。
切り離された、あるいは複製されたボリューム
マシンの電源が切れている間にボリュームがインスタンスから切り離されたり、クローンやイメージ化されたりしても、そこにあるのは暗号文とヘッダーだけで、あなたのファイルではありません。
稼働中のマシン
ボリュームが一度開かれると、マスターキーはカーネルメモリ上に存在します。ハイパーバイザーレベルのアクセス権があれば、理屈のうえではそこに到達できます。暗号化はここでのコストを引き上げますが、扉を完全に閉じるわけではありません。
自分自身のミス
暗号化されていないswap、平文のバックアップ、マウント前に書き込まれたログはすべて、暗号化コンテナの外側にあります。暗号化されたサーバーからの実際の漏洩の多くは、暗号方式そのものではなく、ここから発生します。
この限界は言葉にしておく価値があります。ボリュームのロックが解除されている間、鍵は自分が所有していないハードウェア上のRAMに存在します。VPS上のLUKSは、オフラインアクセスに対しては強力な答えですが、稼働中のアクセスに対しては部分的な答えにとどまります。信頼できる法域の代わりとして扱うのではなく、実際に信頼できる法域と組み合わせてください。詳しくは /offshore-hosting をご覧ください。
コマンドを打つ前に、構成の形を選ぶ
実際のニーズのほとんどは、次の4つの構成でカバーできます。選択を誤ると再インストールという代償を払うことになるため、途中でではなく、ここで決めておきましょう。
パスA — 稼働中のサーバーでデータボリュームを暗号化する
ほとんどの人が実際に求めているのはこちらです。作業時間はおよそ10分、再インストールは不要で、重要なものはすべて暗号化コンテナの中に収まります。まず2台目のボリュームを接続してください。/storage プランであれば大容量ディスクがそれにあたり、標準の /vps であればデプロイ時に追加できます。
- 1
対象のデバイスを確認する
lsblkを実行し、これからフォーマットしようとしているデバイスが空のものであることを確認してください。luksFormatはその中身をすべて破壊し、元に戻すことはできません。
- 2
LUKS2コンテナを作成する
cryptsetup luksFormat --type luks2 /dev/vdb を実行すると、大文字でYESと入力するよう求められ、続いてパスフレーズの設定を求められます。入力履歴もエコー表示もないコンソール上で正確に打ち直せるものを選んでください。
- 3
ボリュームを開き、ファイルシステムを作成する
cryptsetup open /dev/vdb cryptdata を実行すると /dev/mapper/cryptdata が作成されます。続けて mkfs.ext4 /dev/mapper/cryptdata を実行し、データを置く場所、たとえば /srv/data にマウントします。
- 4
起動時のロック解除方法を決める
再起動のたびにパスフレーズを入力するか、cryptsetup luksAddKey でキーファイルを追加してルート上に保存するかのいずれかになります。キーファイルは便利ですが、その分確実に弱くなります。どちらのトレードオフを選んでいるのかを明確にしておいてください。
- 5
crypttabとfstabを設定する
デバイス名ではなくUUID=を使って /etc/crypttab にマッピングを追加し、/etc/fstab では nofail を付けてマウントすることで、ロック解除に失敗しても起動が止まらないようにします。
キーファイルを暗号化されていないルート上に置く場合、それで何が守られているのかを正確に把握しておいてください。ラックから運び出されたディスクや、インスタンスから切り離されたディスクに対しては保護されますが、VM全体のコピーに対しては保護されません — そのコピーには鍵そのものも含まれているからです。それ以上の強度を求めるなら、パスフレーズはサーバーの外部から供給する必要があります。
パスB — カスタムISOで暗号化ルートを構築する
電源が切れている間、マシン上に読み取り可能なものを一切残さないことが要件になる場合は、ルート自体をLUKSの中に置く必要があります。つまり、独自のISOを起動できるプロバイダー上で、コンソールから新規インストールを行うということです。
- 1
コンソールからインストーラーを起動する
DebianまたはUbuntuのnetinst ISOをカスタムISOとしてマウントし、VNCまたはシリアル経由でインストールを進めます。この段階ではSSHはまだ使えません — 接続先となるシステム自体がまだ存在しないためです。
- 2
ガイド付きパーティショニングで暗号化LVMを使う
インストーラーは小さな /boot を平文のまま残します。これはボリュームが開く前に何かが実行される必要があるためです。そのうえで、rootとswapを1つのLUKSコンテナの中にまとめて配置します。
- 3
画面を見ずに打てるパスフレーズを選ぶ
再起動のたびに、エコー表示も自動補完もないSSH経由でこれを打ち直すことになります。記号だらけの文字列よりも、5つの単語を並べたパスフレーズの方がここでは有効です。
- 4
ログアウトする前にリモートロック解除を設定する
暗号化したばかりのルートは、次の再起動後、パスフレーズの入力待ちのままいつまでも止まってしまいます。コンソールがまだ目の前にある同じセッションのうちに、リモートロック解除を設定しておいてください。
RAMが1〜2GBのプランでは、デフォルトのArgon2id鍵導出がinitramfsの持つメモリ以上を要求することがあり、パスフレーズが正しくても起動時のロック解除に失敗します。フォーマット時に cryptsetup luksFormat --pbkdf-memory 262144 で上限を設定するか、小規模インスタンスの無人再起動を信頼する前に cryptsetup luksDump で既存のヘッダーを確認してください。
dropbear-initramfsでSSH経由のリモートロック解除を行う
暗号化されたルートは、OSが存在する前の段階でパスフレーズを必要とします。dropbear-initramfsはinitramfsの中に小さなSSHサーバーを組み込み、どこからでもパスフレーズを入力できるようにします。これが、暗号化されたサーバーと、ただの暗号化された文鎮の分かれ目です。
- 1
パッケージをインストールする
apt install dropbear-initramfs を実行します。initramfsの生成処理にフックされ、以後生成されるすべてのカーネルイメージに自動的に組み込まれます。
- 2
鍵を許可し、実行できるコマンドを1つに絞る
公開鍵を /etc/dropbear/initramfs/authorized_keys に置きます — Debian 11以前では /etc/dropbear-initramfs/authorized_keys です。行の先頭に no-port-forwarding,no-agent-forwarding,no-x11-forwarding,command="cryptroot-unlock" を付けておけば、鍵が盗まれてもプロンプト以外は何も得られません。
- 3
initramfsにネットワークを持たせる
プロバイダーがDHCPを提供していればそれで問題ありません。そうでない場合は、静的な ip=ADDRESS::GATEWAY:NETMASK::eth0:off パラメーターを GRUB_CMDLINE_LINUX に追加して update-grub を実行してください。最後に update-initramfs -u -k all を実行し、変更をイメージに反映させます。
- 4
本番で頼る前に、完全な再起動でテストする
プロバイダーのコンソールを別ウィンドウで開いた状態で再起動し、接続してパスフレーズを入力し、起動が続くのを確認してください。テストしていないロック解除手段は機能ではなく、将来の障害の予約にすぎません。
initramfsは、起動後のシステムが提示するものとは別の、独自のSSHホスト鍵を持っています。そのため、再起動のたびにクライアント側でホスト鍵が変わったという警告が出ます。/etc/dropbear/initramfs/dropbear.conf の DROPBEAR_OPTIONS で dropbear を別ポートで動かすか、ssh -o HostKeyAlias=box-initramfs で接続するようにし、両方のフィンガープリントを記録しておいてください。
ディスク暗号化が失敗するのは、たいてい鍵管理の段階
暗号方式そのものが弱点になることは、これまで一度もありません。LUKSにまつわるトラブルのうち、実際に取り返しがつくものは、突き詰めればすべて鍵かヘッダーの問題です。両方をインフラの一部として扱ってください。
- ヘッダーは今すぐバックアップしてください — cryptsetup luksHeaderBackup /dev/vdb --header-backup-file luks-header.img — そしてサーバーの外に保管します。不用意な dd 一つでヘッダーが壊れれば、完璧なパスフレーズがあってもデータは永久に失われます。
- スロットは2つ使いましょう。LUKS2には32個のスロットがあります。1つにはパスフレーズを、もう1つには長いランダムなリカバリーキーをパスワードマネージャーで管理して入れておきます。スロットを1つしか使わないのは、自ら作り出す単一障害点です。
- リモートマシン上では正しい順序でローテーションしてください — luksAddKey で新しい鍵を追加し、それでボリュームが開くことを確認してから、luksKillSlot で古い鍵を削除します。この順序を逆にしてはいけません。
- パスフレーズとサーバーの接続情報は別々の場所に保管してください。1つのメモが漏れただけで、アドレスと鍵の両方が渡ってしまうという事態は避けるべきです。
暗号化がパフォーマンスに与えるコスト
オーバーヘッドは実在しますが、たいていは体感できません。何年も前のベンチマークを鵜呑みにするのではなく、実際に使っているマシンで計測してください。
見落とされがちな部分
暗号化されたボリュームの周辺から平文が漏れ出しているなら、それは偽物の安心感であり、暗号化していない場合よりもたちが悪い状態です。作業を完了したと言う前に、次の5点を塞いでおいてください。
- Swap。暗号化されていないswapパーティションには、メモリを通過したあらゆるものの断片が残る可能性があります。/etc/crypttab に /dev/urandom を使ったエントリーを設定し、起動のたびに新しいランダムな鍵で暗号化してください。
- マウント前に書き込まれるログ。暗号化ボリュームがまだ開いていない間に記録されるものは、すべて平文のルートに残ります。アプリケーションやデータベースのログの出力先は、コンテナ内のパスに向けてください。
- バックアップ。暗号化ボリュームの中身を平文のままオブジェクトストレージにコピーしてしまえば、それまでの作業がすべて無意味になります。restic、borg、ageなどでバックアップ自体を独立して暗号化し、その鍵は別の場所に保管してください。
- スナップショット。プロバイダーのスナップショットが取得するのはディスクであってRAMではないため、LUKSボリュームはその中でも暗号文のままです — ただし、暗号化されていないルートに残っているものは、そのままの状態で丸ごと取得されます。
- Discard。discardフラグをLUKS経由で通すとNVMeのtrimが機能し続けますが、その代わりどのブロックが未使用かが外部に伝わり、ファイルシステムがどれだけ埋まっていて、おおよそどんな形をしているかが漏れます。設定例をそのままコピーするのではなく、意図的に選択してください。
それでもホスト側が重要になる部分
暗号化は自分でコントロールできるレイヤーです。マシンの電源が切れた後や、ディスクが施設の外に持ち出された後に、あなたのデータを読み取るコストがどれだけ高くつくかを決めます。その外側のレイヤー — 誰がハードウェアへのアクセスを強制できるのか、どんな記録がサーバーとあなたを結びつけるのか — はプロバイダーとその法域に属します。ChainVPSの15リージョンのうち6拠点はプライバシー階層の法域です。一覧は /locations にあり、それによって実際に何が変わるかは /offshore-hosting で解説しています。
上記のパスがそもそも利用できるかどうかは、プロバイダーの3つの機能で決まります。カスタムISOブート — これがなければパスBは実現不可能です。アウトオブバンドのコンソールアクセス — リモートロック解除が復帰しない再起動の場面で必要になります。そして、そもそもマシンをあなたの法的身分に結びつけない申し込み方法です。当社の /offshore-vps と /storage の各プランはすべてカスタムISOでの起動に対応し、コンソールアクセスを提供し、KYCなしのプリペイド暗号資産残高から課金されます。つまり、暗号化されたディスクが、すでにあなたの名前を記した紙の記録の上に置かれることはありません。/guides では、ホスティング事業者に何が見えて何が見えないのかを正直に解説しています。
導入チェックリスト
- まず脅威を明確にする。暗号化が答えるのは廃棄されたドライブ、切り離されたボリューム、オフラインのイメージであり、稼働中のハイパーバイザーではありません。
- サーバーがすでに稼働している場合はデータボリュームを暗号化する(パスA)。ルート自体を暗号化する必要がある場合に限り、カスタムISOから再インストールする(パスB)。
- LUKS2とaes-xts-plain64を使用し、RAMが2GB未満のプランではArgon2idのメモリ使用量に上限を設定する。
- 1つの鍵スロットにはパスフレーズを、もう1つには長いランダムなリカバリーキーを設定し、どちらもサーバーの外に保管する。
- 実データを1バイトでも書き込む前に、LUKSヘッダーのバックアップを取得する。
- dropbear-initramfsはデフォルト以外のポートで動かし、鍵認証のみとし、実行できるコマンドをcryptroot-unlockに限定する。
- プロバイダーのコンソールを開いたまま、再起動からロック解除までの一連の流れを1回通しでテストする。
- オフサイトへの暗号化バックアップに加えて、復元訓練を1回実施する。テストしていないバックアップはただの願望であり、バックアップとは呼べません。
ディスク暗号化を行えば、ホスティングプロバイダーにデータを読まれずに済みますか。
静止状態においてはそうです。マシンの電源が切れれば、ボリュームは暗号文になり、パスフレーズはあなたの頭の中から外に出たことがありません。サーバーが稼働してボリュームが開いている間は、マスターキーはプロバイダーが運用するハードウェア上のRAMに存在します。暗号化は、廃棄されたドライブ、切り離されたボリューム、コールドイメージといったオフラインの経路をすべて塞ぎ、それ以外の経路についてもコストを引き上げます。信頼できる法域の代わりになるものではなく、それを補完するものです。
再インストールせずに、既存のVPSを暗号化できますか。
独立したデータボリュームであれば、10分程度で可能です — それが上で説明したパスAです。ルートファイルシステムについては、現実的には難しいと言えます。cryptsetup reencrypt を使えばファイルシステムをその場で変換できますが、リモートマシン上で処理の途中に接続が切れたり電源イベントが発生したりすると、起動しないサーバーと長い徹夜作業が残ります。カスタムISOから再インストールする方が速く、はるかに安全です。
LUKSはどの程度パフォーマンスを犠牲にしますか。
多くの人が思っているより小さく済みます。AES-NIがあれば、一般的な混合ワークロードにおいてAES-XTSのコストは数パーセント程度で、現行世代のEPYCコアで cryptsetup benchmark を実行すると数GB/s台の値が出ます。目に見える影響が出るのは、高速なNVMeに対するシングルスレッドのシーケンシャルI/Oのケースで、ドライブより先に1コアが飽和することがあります。推測に頼らず、自分のインスタンスでベンチマークを取ってください。
パスフレーズを忘れてしまったらどうなりますか。
データは失われます。復旧の仕組みも、プロバイダー側のマスターキーも、それを取り消せるサポートチケットも存在しません — その性質自体が、この設計の狙いです。ランダムなリカバリーキーを入れた2つ目の鍵スロットと、サーバー以外の場所に保管したLUKSヘッダーのバックアップで自分を守ってください。
initramfsの中でSSHを動かすのは危険ですか。
リスクは小さく、性質もよく分かっています。dropbearが動くのはルートファイルシステムが存在するようになるまでのわずかな秒数だけで、公開鍵認証のみを受け付け、パスフレーズの入力を促すだけの単一の強制コマンドに制限できます。デフォルト以外のポートを使い、initramfsのホスト鍵を別途記録しておけば、実質的なリスクは、それがない場合に確実に締め出されることと比べればごくわずかです。


