
2026/03/06 3:43
リモートで暗号化されたハードディスクをロック解除する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この記事では、Arch Linux システムのブートパーティションを暗号化し、ルートファイルシステムが復号される前にネットワーク経由でアクセス・ロック解除できるように設定する方法を説明しています。
-
必要なパッケージのインストール:
と AUR パッケージpacman -S dropbear
、mkinitcpio-systemd-extras
をインストールします。mkinitcpio-tailscale -
mkinitcpio の設定:既存のフックに加えて、
をsd-network tailscale sd-dropbear
に追加し、/etc/mkinitcpio.conf
を設定します。SD_NETWORK_CONFIG=/etc/systemd/network-initramfs -
initramfs で Tailscale をセットアップ:
を実行し、Web コンソールでマシンにsetup-initcpio-tailscale
タグを付与し、キーの有効期限を無効化します。tag:initrd -
Dropbear の設定:
を設定し、公開鍵をSD_DROPBEAR_COMMAND="systemd-tty-ask-password-agent"
にコピーしてからホストキーを生成します(/root/.ssh/authorized_keys
)。dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key -
早期ネットワークの有効化:DHCP を使用した
を作成し、initramfs を再構築します(/etc/systemd/network-initramfs/10-wired.network
)。mkinitcpio -P -
ブートローダーエントリの調整:systemd-boot で
を追加し、復号プロンプトが無期限に待機するようにします。rootflags=subvol=/@,x-systemd.device-timeout=0 -
再起動してロック解除:再起動後、Dropbear を介して
に SSH 接続し、<hostname>-initrd
で暗号化ディスクのパスフレーズを入力します。systemd-tty-ask-password-agent
このガイドでは、物理アクセスが不可能なヘッドレスサーバーや IoT デバイスに最適であることを強調し、さらに Tailscale の ACL やキー有効期限の無効化などの追加セキュリティ対策を提案しています。
本文
あなたのミッション(もし受け入れる意思があるなら)は、起動プロセスの最初の段階に忍び込み、スタートアップ設定を壊すことなく差し替え、痕跡を残さず離脱することです。
準備はできましたか?始めましょう。
設定
ここでヒーローたちが紹介され、舞台が整えられます。
長い間、私はバッテリーが持続しない古い ThinkPad を使っていました。特に Windows では寿命が短く、旅行先で頻繁に電源が切れてしまいます。家から離れるときは、SSH で自宅のデスクトップに戻り、ラップトップのバッテリーがなくても永続的な状態を保ち、さらに高速ビルドでバッテリー消耗を抑えるようにしています。
これには二つの小さな問題があります:
- 時々家が停電し、デスクトップがシャットダウンします。
- 電源が復旧すると、新しいパブリック IP が割り当てられることがあります。
長い間、BIOS の「Restore AC Power Loss」の後に「Power On」を有効化することで 1 を解決し、Tailscale で 2 を対処してきました。しかし最近、暗号化されたブートパーティションを持つ Arch をインストールしたため、起動が完了するまで暗号鍵の入力が必要になりました。
それならば、initramfs に Tailscale を入れるとどうでしょう?
計画
ここで勇敢なヒーローたちは今後直面する課題を描きます。
initramfs
Linux の起動初期は、実際には小型の第二オペレーティングシステムが実行されるだけです。これは
/boot にある圧縮アーカイブからロードされ、メモリ上で実行されます。永続ストレージへのアクセスはありません。このメモリ上で動作する OS を initramfs(initial RAM filesystem)と呼びます。
したがって、次のような画面を見たら:
これは実際には完全に機能する OS です。PID やサービス管理もすべて揃っています。
ということは、その上で何かをインストールできるわけです。
制約
以下の三つが課題となります:
- initramfs 内でのネットワーク
- initramfs への Tailscale
- initramfs での SSH
さらにセキュリティも重視したいので、追加で検討すべき点があります:
- initramfs に Tailscale を入れると、暗号化されていない鍵が残ります。
- Tailscale の鍵はデフォルトで 90 日後に失効します。すると全てが壊れます。
- 初期起動環境に SSH アクセスを許可したくありません。
これらは次のように解決できます:
- Tailscale ACL を使い、initramfs へのインバウンドのみ許可しアウトバウンドは禁止する。
- 鍵の有効期限を無限に設定する。
- SSH サーバーで実際のロック解除コマンド(
)以外はすべて拒否する。systemd-tty-ask-password-agent
Tailscale ACLs
Tailscale の ACL(アクセス制御リスト)について簡単に説明します。
ユーザーは特定のログイン方法に紐づいており、パスキーを追加すると元のアカウントとは別個のユーザーとして扱われます。さらに「グループ」や「オートグループ」、ホスト(ネットワークに接続したマシン)、タグが存在します。
タグはユーザーではなくホストをまとめるために使われ、ホストにタグを付与すると、そのログイン方法として扱われます。その結果、
autogroup:member にはタグ付きマシンは含まれません。
したがって次のようなポリシーを書けます:
{ // デバイスに適用できるタグとそれを使用するユーザーを定義 "tagOwners": { "tag:initrd": ["autogroup:admin"] }, // ユーザー、グループ、オートグループ、タグ、Tailscale IP、サブネット範囲の ACL を定義 "acls": [ {"action":"accept","src":["autogroup:member"],"dst":["*:*"]} ], // 保存時にアクセスルールをテスト "tests":[ { "src":"100.76.34.8", "accept":["100.102.101.127:22","100.101.55.73:10078"] }, { "src":"100.102.101.127", "deny":["100.101.55.73:10078"] } ] }
これは「ユーザーアカウントに紐づくデバイスは他の任意のデバイスへアクセスでき、タグ付きデバイスには全ての権限が与えられない」という意味です。
Systemd で起動前
initramfs はほぼ通常の Linux システムと同じため、独自の
init PID 1 を持ちます。Arch ではその PID が systemd です。つまり initramfs に systemd サービスを追加できるわけです! Arch には mkinitcpio-systemd-extras というパッケージに多くのサービスが用意されており、mkinitcpio は initramfs を再生成するツールです。
ここでは SSH サーバー(dropbear)とネットワーク起動(
sd-network)を追加します。
盗み作戦
以下は Arch システムで実行すれば、著者が持つのとほぼ同じ構成になる手順です。多くのコマンドは root 権限で実行してください。
-
dropbear SSH サーバーをインストール
pacman -S dropbear -
systemd パッケージをインストール
yay -S mkinitcpio-systemd-extras mkinitcpio-tailscale -
にネットワーク (/etc/mkinitcpio.conf
)、tailscale (sd-network
) と dropbear (tailscale
) を追加:sd-dropbearHOOKS=(base systemd autodetect microcode kms modconf block keyboard sd-vconsole plymouth sd-encrypt filesystems) +HOOKS=(base systemd autodetect microcode kms modconf block keyboard sd-vconsole plymouth sd-network tailscale sd-dropbear sd-encrypt filesystems) -
新しい Tailscale デバイス用の鍵を設定
setup-initcpio-tailscale -
Tailscale の Web コンソールで新デバイスに
を付与し、キーの有効期限を無効化。tag:initrd -
で dropbear が実行できるコマンドを限定/etc/mkinitcpio.confSD_DROPBEAR_COMMAND="systemd-tty-ask-password-agent" -
systemd に暗号パスワード入力を永遠に待機させる。systemd‑boot を使っている場合は
の options セクションで/boot/loader/entries/linux-cachyos
を次のように拡張:rootflags=subvol=/@rootflags=subvol=/@,x-systemd.device-timeout=0 -
公開鍵を
にコピー(dropbear フックが拾う):/root/.ssh/authorized_keyscp ~/.ssh/authorized_keys /root/.ssh/ -
dropbear 用の新しい公開/秘密鍵ペアを生成:
dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key -
初期ネットワーク設定
以下はイーサネット接続のみ対象。
に次を追加:/etc/systemd/network-initramfs/10-wired.network[Match] Type=ether [Network] DHCP=yesそして
フックで読み込むようにsd-network
を登録:/etc/mkinitcpio.confSD_NETWORK_CONFIG=/etc/systemd/network-initramfs -
initramfs の再構築:
mkinitcpio -P -
再起動。
に SSH で接続でき、次のようなプロンプトが表示されるはずです。$(hostname)-initrd
逃走
ここでは教訓を述べ、シーンを締めくくります。
要点は、コンピュータに「不可能だ」と思うことがあるなら、もっと攻撃的に取り組む価値があるということです。
(私は Windows を信じていますが、確信はあまりありません)
時折 /boot/EFI
ここで「initrd」は「initramdisk」の略であり、私たちの initramfs システムを指します。
詳細は sd-dropbear のドキュメントをご覧ください。