最近追加されたboot/uefi-loader-loginの使い方について超カンタンに紹介します。
boot/login-simpleとは
boot/uefi-loader-loginの前に、boot/login-simpleについて説明しておきます。これは、暗号化した設定ファイルを読み込む機能を持つBIOS環境用のブートローダーです。bitvisor.confファイルの内容を設定してmakeすると、パスワードの入力を要求され、module1.binとmodule2.binというファイルが生成されます。
$ make
gcc -m32 -Wall -s -Wl,-Ttext,0x8000 -nostdlib -nostdinc \
-idirafter ../../include/share/ -o module1.bin asm.s main.c
gcc -Wall -idirafter ../../include -o config config.c loaddata.c \
configparser.c
./config < bitvisor.conf > config.raw
./makedata config.raw > module2.bin
Enter password:
Retype password:
module1.binにはパスワード入力画面を表示してパスワード入力を行うプログラム、module2.binには暗号化された設定項目が入っています。これらのファイルをGNU GRUBのkernelおよびinitrdとして指定するか、または、boot/loaderを用いてインストールすることにより、起動時にパスワード入力画面が表示され、正しいパスワードを入力すると復号されてシステムが起動するという仕組みです。
Simpleと名前に入っているのは、simpleじゃないやつがあるからなのですが、それはboot/loginに入っているもので、Linuxを一時的に立ち上げてスマートカードで認証を行い、スマートカードから暗号化鍵を読み出してストレージ暗号化に使用したり、スマートカードの秘密鍵を利用してVPN接続をしたりするためのものです。Simpleはスマートカードを使わず、ストレージ暗号化やVPNの共通鍵などを含む設定全体を、共通鍵によって暗号化しておこうというアイディアによるものです。起動の仕組み自体はどちらも同じものを使用していますが、simpleはLinuxを使わず、入出力をすべてBIOSで行っていますので、コンパクトなサイズに収まっているだけでなく、USBコントローラーの初期化等も行わないため、認証後にUSBキーボードが使えなくなるなどの問題も発生しにくくなっています。
boot/uefi-loader-loginとは
暗号化した設定ファイルを読み込む機能を持つUEFI環境用のブートローダーです。今のところ、BIOS環境でboot/login-simpleに実装されているもののUEFI版に相当します。
UEFI環境ではその仕様上、BIOS環境のようにLinuxを一時的に起動するというような手法を使うのは困難です。その代わり、理論的にはUEFIだけでスマートカードへの対応も可能と考えられます。よって名前にsimpleが入っていないようです。
認証を通過すると本プログラムはboot/uefi-loaderと同様に単に終了します。続けてオペレーティングシステムを起動するなどの処理を行いたい場合は、適切にBootOrderなどを設定しておきます。
ビルド
boot/uefi-loader-loginのビルドは、makeを実行するだけです。MinGWクロスコンパイラーを使用します。
設定ファイルの準備
bitvisor.confを用意してboot/login-simpleをビルドしておいてください。出来上がったmodule2.binを使用します。
インストール
boot/uefi-loaderの場合と同様に、boot/uefi-loader-loginに生成されたloadvmm.efiと、bitvisor.elfに加えて、module2.binを、UEFIファームウェアがアクセスできる同じディレクトリにコピーすれば完了です。USBマスストレージ等からの起動を行う場合は、loadvmm.efiを\EFI\BOOTディレクトリにBOOTX64.EFIというファイル名で置き、それ以外のファイルは同じディレクトリに名前を変えずに置きます。
起動
loadvmm.efiを起動するとパスワード入力を求める画面が現れますので、パスワードを入力してEnterキーを押すと先に進みます。
パスワードを間違えるとエラーになり再度入力を求められます。
3回間違えると再起動しかなくなります。
仕組み
実は実装の単純化のため、復号はVMM側で行っています。core/vmmcall_boot.cにあるルーチンが復号を担当します。
BIOS環境で追加モジュールがロードされている場合、VMMは各ドライバーをロードする前に (暗号化等が有効になる前に) 仮想マシンを開始し、追加モジュールを起動します。そのようにして開始されたmodule1.binはパスワード入力後、VMM呼び出しでそのパスワードをVMMに渡します。復号に成功したら、ドライバーのロードを行い、割り込みコントローラーなどのデバイスを一部再初期化して、仮想マシンもリセットして起動を継続します。
UEFI環境ではもっと単純です。本プログラムが使用された場合は、VMMは各ドライバーをロードする前に仮想マシンを開始し、仮想マシン上で制御をローダーに返します。ローダーがパスワード入力を行い、VMM呼び出しでVMMに渡します。復号に成功したら、ドライバーのロードを行い、引き続き実行を継続します。ローダーは最後の後始末を行い、終了します。デバイス等はUEFIファームウェアの制御下にあるままですので、リセット等は行いません。
制限
起動デバイスの暗号化にはまだ対応していません。ファイルシステムを再認識させる必要があります。