Thursday Feb 03, 2022

How To Encrypt Root Filesystem on Linux

システム管理者として、ディスクを暗号化することがどれほど重要かは、おそらくすでにご存じでしょう。

幸運なことに、ディスクに保存されたデータを暗号化することで、このような事態を防ぐ方法があります。 オンラインでは、たとえば、ファイルやホーム パーティションの暗号化に焦点を当てた他のチュートリアルを見つけることができるかもしれません。 ブートローダーの一部を暗号化します。

目次

前提条件

このガイドで詳述するすべての操作を行うには、当然ながらシステム管理者権限が必要です。

これが事実であることを確認するために、あなたが “sudo” グループ (Debian ベースのディストリビューションの場合) または “wheel” (RedHat ベースの場合) に属していることを確認してください。

以下の出力があれば、実行しても問題ないでしょう。

続ける前に、ディスクを暗号化することはリスクと無縁ではないことを知っておくことが重要です。

システム全体をバックアップするために必要な手順がわからない場合は、次のチュートリアルを読んで、わかりやすく説明することをお勧めします。

すべての設定が完了したら、システム全体の暗号化を開始します。

現在の状況を確認する

このチュートリアルは、直面しうるシナリオごとに 3 つのパートに分かれています。

現在の状況を確認した後、興味のある章に直接進むことができます。

暗号化されていないデータを含むシステムを暗号化する場合、2 つの選択肢があります。

  • コンピュータまたはサーバーに追加のディスクを追加して、それを起動ディスクになるように設定できます。

新しいシステムをインストールする場合、つまりディストリビューションをゼロからインストールする場合、グラフィカルインストーラから直接ディスク全体を暗号化することができます。 その結果、パート 3 に進むことができます。

ハードディスクのレイアウトを設計する

暗号化されているかどうかにかかわらず、新しいパーティションを作成するときはいつでも、前もってハードディスクの設計を選択することが非常に重要です。

ディスクの 2 番目のパーティションは LUKS-LVM パーティションとしてフォーマットされ、1 つの物理ボリューム (ディスク パーティション自体) と、ルートファイルシステム用と小さなスワップパーティション用の 2 つの論理ボリュームを含む 1 つのボリュームグループがあります。

おわかりのように、GRUB の第2ステージも暗号化されます:これは、ブートフォルダーを同じパーティションに格納することを選択したためです。

もちろん、ここで提供された設計に制限されることはありません。たとえば、ログ用に追加の論理ボリュームを追加できます。 その名前が示すように、data-at-rest 暗号化とは、システムが休んでいるか電源が切れているときに、システムを暗号化する、つまり、誰もそこから読み取ることができないようにすることを意味します。

この暗号化は、コンピュータが盗まれた場合に非常に便利です。

しかし、データが永久に消去されるリスクはあります。ディスクへの読み取りアクセスがないことは、ディスク上のパーティションを削除できないことを意味するわけではありません。

新しいディスク上のルート ファイルシステムを暗号化する

導入部で詳述したように、データをまったく含まない新しいディスクからルート ファイルシステムを暗号化するつもりです。 暗号化されたディスクはプロセスの中でフォーマットされるため、これは非常に重要です。

暗号化したいシステムに向かい、新しいディスクを挿入します。 まず、現在のディスク (おそらく「/dev/sda」という名前) と、今差し込んだディスク (おそらく「/dev/sdb」という名前) を識別します。

名前とディスクシリアルの対応に疑問がある場合、lsblk の「-o」オプションでベンダーとシリアルを追加することが可能です。

$ lsblk -do +VENDOR,SERIAL

この場合、データのあるディスクは “/dev/sda” という名前で、新しいディスクは “/dev/sdb” という名前です。

まず、冒頭に指定したレイアウト、つまり EFI パーティションと LUKS-LVM パーティションを 1 つ作成する必要があります。

基本ディスク レイアウトの作成

フル ディスク暗号化への旅の最初のステップは、2 つの単純なパーティションから始まります:1 つは EFI(将来的に変更したい場合に備えて、MBR を使用)、1 つは LVM 用です。

ディスク上に新しいパーティションを作成するには、「fdisk」コマンドを使用して、フォーマットするディスクを指定します。

$ sudo fdisk /dev/sdb

導入部で説明したように、最初のパーティションは 512 Mb で、もうひとつはディスクの残りの領域を使用します。

「fdisk」ユーティリティでは、「n」オプションで新しいパーティションを作成し、「+512M」で512メガバイトのサイズを指定することが可能です。

パーティション タイプを「t」オプションで W95 FAT32 に変更し、タイプに「b」を指定することを確認します。

素晴らしい、最初のパーティションができたので、興味のあるパーティションを作成します。

2番目のパーティションを作るのはよりシンプルにできます。

fdisk ユーティリティで、新しいパーティションを作成するために “n” を使用し、デフォルトのまま、つまり、すべてのステップで “Enter” を押すことが可能です。

ここで、もう一度 “fdisk” コマンドを実行すると、ディスク上で実行した変更について良いアイデアを得ることができます。

第 2 パーティションをフォーマットする準備ができたので、それに向かいましょう。

Creating LUKS & LVM partitions on disk

ディスクを暗号化するために、LUKS (Linux Unified Key Setup project) を使用しようと考えています。

LUKS は、Linux カーネルのいくつかのバージョンで実装されているいくつかのバックエンドの仕様です。

この場合、Linux ストレージスタックの “dm-crypt” サブモジュールを使用するつもりです。

その名前が示すように、「dm-crypt」はデバイス マッパー モジュールの一部で、物理ディスクとストレージ スタックを設計する方法の間に抽象化の層を作成することを目的としています。

Diagram from thomas-krenn.com

この情報は非常に重要で、これは「dm-crypt」バックエンドを使って、ほとんどすべてのデバイスを暗号化できることを意味します。

このケースでは、LVM パーティションのセットを含むディスクを暗号化しますが、USB メモリやフロッピー ディスクを暗号化することも可能です。

「dm-crypt」モジュールと対話するために、「cryptsetup」コマンドを使用する予定です。

当然ながら、まだインストールしていなければ、サーバーにインストールする必要があるかもしれません。

$ sudo apt-get instal cryptsetup$ which cryptsetup

コンピュータ上で cryptsetup が利用可能になったので、最初の LUKS-フォーマットパーティションを作成することにします。

LUKS パーティションを作成するには、「cryptsetup」コマンドの後に、指定したパーティション (またはディスク) をフォーマットする「luksFormat」コマンドを使用します。

 $ sudo cryptsetup luksFormat --type luks1 /dev/sdb2

Note : ではなぜ LUKS1 フォーマットタイプを指定するのでしょう。 2021年1月現在、GRUB (私たちのブートローダー) は LUKS2 暗号化をサポートしていません。 LUKS2がGRUBブートローダー用にリリースされたことに気づいたら、必ずコメントを残してください。

ご覧のように、この操作はディスクに保存されたすべてのデータを消去することが通知されています。 最後にもう一度フォーマットするディスクを確認し、準備ができたら「YES」と入力します。

その直後に、パスフレーズの入力を求められます。 LUKS は 2 つの認証方法を使用します。パスフレーズに基づく認証は、基本的に復号化の際に入力するパスワードになります。

また、LUKS は鍵を使用することもできます。

強力なパスフレーズを選択し、それを再度入力し、ディスクの暗号化が完了するのを待ちます。

完了したら、パーティションが LUKS として暗号化されているかを “lsblk” コマンドで確認することができます。

Awesome!

$ lsblk -f

パーティションが正しくフォーマットされていることを確認するには、「cryptsetup」コマンドに「luksDump」オプションを付けて、暗号化デバイスの名称を指定すれば良いのです。

$ sudo cryptsetup luksDump /dev/sdb2

LUKS1 形式ではバージョンが “1” に設定されており、キースロットの 1 つに暗号化パスフレーズがあるはずです。

Creating Encrypted LVM on disk

さて、LUKS 暗号化パーティションの準備ができたら、それを “open” することが可能です。 暗号化パーティションを「開く」とは、単にディスク上のデータにアクセスすることを意味します。

暗号化デバイスを開くには、「cryptsetup」コマンドの後に「luksOpen」、暗号化デバイスの名前と名前を続けます。

$ sudo cryptsetup luksOpen <encrypted_device> <name>

このケースでは、デバイスに「cryptlvm」と名前を付けることにしました。

結果として、再度「lsblk」コマンドを使用すると、既存のデバイスリストに新しいデバイスが追加されたことがわかります。

すべての準備が整ったので、2 つの LVM (ルートパーティション用とスワップ用) の作成を開始できます。

# Optional, if you don't have LVM commands : sudo apt-get install lvm2$ sudo pvcreate /dev/mapper/cryptlvm

物理ボリュームの準備ができたので、これを使用して「cryptvg」という名前のボリューム グループを作成します。

$ sudo vgcreate cryptvg /dev/mapper/cryptlvm

これでボリュームグループの準備ができましたので、2 つの論理ボリュームを作成できます。

ルートファイルシステムをホストするために、論理ボリューム上に EXT4 ファイルシステムを作成します。

$ sudo lvcreate -n lvroot -L 13G cryptvg$ sudo mkfs.ext4 /dev/mapper/cryptvg-lvroot

スワップパーティションの作成は、「lvcreate」と「mkswap」を使用して、同じ手順で行うことができます。

Transfer Entire Filesystem to Encrypted Disk

ファイルシステム全体を転送する前に、転送先のドライブに十分なスペースがあるかどうかを確認するとよいでしょう。

$ df -h 

ファイルシステム全体を新しく作成したパーティションに転送するには、「rsync」コマンドを使用します。

新しく作成した論理ボリュームをマウントして、ファイルおよびフォルダーを宛先ドライブに再帰的にコピーし始めます。

しばらくすると、ファイルシステム全体が暗号化されたドライブにコピーされるはずです。 これで「/boot」が暗号化されたので、それに応じて GRUB のステージ 1 を再インストールする必要があります。

Install and Configure GRUB Bootloader

では、なぜ GRUB を再インストールしてそれに応じて再設定する必要があるのでしょうか。

この質問に答えるには、BIOS/MBR の従来のブート プロセスを使用する場合のシステムの起動方法について基本的な知識を持つ必要があります。 GRUB ステージ 1 と GRUB ステージ 2 です。

ステージ 2 は、必要なモジュールのロード、カーネルのメモリへのロード、および initramfs プロセスの開始など、多くのタスクを担当します。

Re-install GRUB Stage 1 & 2

GRUB の最初のステージを再インストールするには、まず、GRUB 環境で暗号化デバイスへのアクセスを可能にする “cryptomount” を有効にしておく必要があります。

そのためには、「/etc/default/grub」ファイルを編集して、「GRUB_ENABLE_CRYPTODISK=y」オプションを追加する必要があります。

ただし、現在、暗号化しようとするシステムに座っている状態です。

Chroot in Encrypted Drive

暗号化されたドライブに chroot するには、次のコマンドを実行する必要があります。

$ vi /etc/default/grub
GRUB_ENABLE_CRYPTODISK=y

GRUB のドキュメントにあるように、このオプションは、暗号化されたデバイスを探して、それらを解読するために追加のコマンドを追加するように GRUB を設定します。

これで stage 1 が設定されたので、grub-install コマンドを使って MBR にインストールできます。

$ grub-install --boot-directory=/boot /dev/sdb

Note : 注意してください、「/dev/sdb1」ではなく、「/dev/sdb」を指定する必要があります。

GRUB インストールにオプションを指定しない場合、デフォルトで “i386-pc” インストール (BIOS ベースファームウェア用に設計) となることに、おそらく気づかれたでしょう。

GRUB ステージ 2 の再インストール

上記のステップを使用して、ステージ 1 は更新されましたが、ステージ 2 に対して、暗号化ディスクを扱っていることを伝える必要があります。

GRUB_CMDLINE_LINUX="cryptdevice=UUID=<encrypted_device_uuid> root=UUID=<root_fs_uuid>"

これは重要な行で、暗号化されたドライブがどこにあり、ルートパーティションがどこにあるかを GRUB の第2ステージに伝えます。

必要な UUID を特定するには、「lsblk」コマンドで「-f」オプションを使用すればよいのです。

$ lsblk -f 

これらの UUID を使用して、次の行を GRUB 設定ファイルに追加します。

現在の GRUB インストールを更新するには、chroot 環境で “update-grub2” コマンドを使用できます。

$ sudo update-grub2

GRUB インストールを更新したので、GRUB メニュー (すなわちステージ 2) が変更され、”/boot/grub/grub” を検査すると次の内容が表示されるようになるはずです。

見てのとおり、GRUB 設定ファイルは変更され、システムは暗号化されたドライブを見つけるために “cryptomount” を使用するようになりました。

システムが正しく起動するためには、以下を確認する必要があります。

  • 暗号ディスク、luks、lvm などの正しいモジュールをロードしていること、
  • 「暗号マウント」命令を正しく設定していること、
  • 前のセクションで設定した「暗号デバイス」命令を使ってカーネルがロードされていること。
  • 指定された UUID は正しく、”cryptdevice” は LUKS2 暗号化パーティションを、”root” は ext4 ルートファイルシステムを指しています。

Modify crypttab and fstab files

initramfs の最初のステップとして、ファイルシステム上の “/etc/crypttab” および “/etc/fstab” ファイルを使ってボリュームをマウントすることがあります。

結果として、また、新しいボリュームを作成するため、正しい UUID を置くためにこれらのファイルを修正する必要があるかもしれません。

まず、「/etc/crypttab」ファイルに移動し (まだ存在しない場合は作成してもよい)、次の内容を追加します

$ nano /etc/crypttab# <target name> <source device> <key file> <options> cryptlvm UUID=<luks_uuid> none luks

暗号化デバイスの UUID についてわからない場合、「blkid」を使用して情報を取得することができます。

$ blkid | grep -i LUKS 

これでcrypttabファイルが変更されたので、それに応じてfstabを変更するだけです。

$ nano /etc/fstab# <file system> <mount point> <type> <options> <dump> <pass>UUID=<ext4 uuid> / ext4 errors=remount-ro 0 1

もう一度、ext4ファイルシステムのUUIDが分からない場合は、再び「blkid」コマンドを使用できます。

$ blkid | grep -i ext4

ほぼ完了しました。

GRUB と設定ファイルが正しく設定されたので、あとは initramfs イメージを設定するだけです。

Re-configure initramfs image

すべての起動スクリプトの中で、 initramfs は前章で指定したルートファイルシステムを探します。

しかし、ルートファイルシステムを復号するために、正しい initramfs モジュール、すなわち “cryptsetup-initramfs” モジュールを起動する必要があります。 chroot 環境では、次のコマンドを実行できます。

$ apt-get install cryptsetup-initramfs 

initramfs イメージに cryptsetup モジュールを含めるために、「update-initramfs」コマンドを必ず実行してください。

これで、システム上に完全に暗号化されたディスクを作成するために必要なすべてのピースを組み立てることに成功しました。

Boot on Encrypted Device

起動時に表示される最初の画面は、GRUB の第 2 ステージの暗号化を解除しようとするものです。

このパスワードプロンプトが表示されたら、ステージ 1 構成でエラーがないことを意味します。

Note : この画面は、通常のキーボード レイアウトに従っていない可能性があることを認識しておいてください。 結果として、間違ったパスワードのプロンプトが表示された場合、たとえば US キーボードまたは AZERTY キーボードを使用しているように装ってみてください。

正しいパスワードを入力すると、GRUB メニューが表示されます。

この画面が出てきたら、ステージ1がステージ2を開くことができたということです。 Ubuntu」オプションを選択して、システムを起動できます。

次の画面では、パスフレーズを再度入力するように求められます。 結果として、ステージ 2 のロックを解除するために 1 つのパスフレーズが必要になり、ルート ファイルシステム全体のロックを解除するために 1 つのパスフレーズが必要になります。 これについては、ArchLinux のコントリビューターが素晴らしいチュートリアルを書いています。

この場合、パスフレーズを入力して Enter を押します。

しばらくして init プロセスが完了すると、ユーザーインターフェースのロック画面が表示されるはずです!

パスフレーズを入力して Enter を押します。

おめでとうございます。Linux でシステム全体の暗号化に成功しました!

既存ディスクのルートファイルシステムを暗号化する

いくつかのケースでは、コンピューター上のディスクを削除できずに既存のディスクを暗号化しなければならない場合があります。 このケースは、たとえば保証期間内のディスクがある場合に発生する可能性があります。

この場合、プロセスは非常に簡単です。

  • 選択したディストリビューションの ISO を含むブータブル USB (またはリムーバブルデバイス) を作成し、
  • そのデバイスを使って、ディストリビューションの LiveCD にログインし、
  • LiveCD から、ルート ディストリビューションを含むハードディスクを特定し、それのバックアップを取ってください。
  • 選択したフォルダーにプライマリパーティションをマウントし、前の章の指示に従います。

では、取り外し不可能なディスクを暗号化する場合、なぜ LiveCD を使用する必要があるのでしょうか。

メインのプライマリ ディスクを暗号化する場合、それをアンマウントする必要があります。

Encrypting Root Filesystem From Installation Wizard

ディストリビューターによっては、インストール ウィザードに暗号化プロセスを埋め込んでいる場合があります。

Ubuntu 20.04 を例にとると、インストール プロセスでは、ディスク構成ウィザードでディスク暗号化が提案されます。

このオプションを選択すると、前のセクションで行ったものと同様のセットアップが行われます。 しかし、ほとんどのディストリビューションは、「/boot」フォルダーを暗号化しないことを選択します。

「/boot」フォルダーを暗号化する場合は、このチュートリアルの最初のセクションをお読みいただくことを推奨します。

トラブルシューティング

オープン ソースは常に変化しているので、このチュートリアルのステップに注意深く従ったとしても、システムを起動できない可能性はあります。

しかし、ほとんどの場合、起動プロセスのどの段階で失敗しているかを知ることは非常に重要です。

「grub rescue」プロンプトが表示された場合、おそらくステージ 1 で停止しており、起動ローダーが第2ステージを含むディスクを見つけることができなかったことを意味します。

Initramfs プロンプトが表示された場合、おそらく init プロセス中に何か問題が起こったことを意味します :

  • Crypttab および fstab ファイルでマウントするファイルシステムを指定したことは確かですか?
  • すべてのモジュールが現在 initramfs イメージにロードされていることを確認しましたか? たとえば、cryptsetup や lvm モジュールが欠落していませんか?

以下はこのチュートリアルを書いている間に見つけた、あなたの問題に対する答えかもしれません:

  • Encrypting a entire system : ArchLinux の同様のチュートリアル;
  • Manual System Encryption on Ubuntu : root ファイルシステムで chroot するために使われるステップ。

Conclusion

このチュートリアルでは、LUKS 仕様を使用して “/boot” フォルダーを含むルートファイルシステム全体を暗号化する方法について学習しました。

コメントを残す

メールアドレスが公開されることはありません。

Back to Top