BitVisor起動ディスク暗号化設定法

BitVisorで起動ディスク暗号化を設定する方法の例を簡単にご紹介します。

# BIOS・UEFI共通

起動ディスク暗号化について、ディスク全体を暗号化するのは難しいので、オペレーティングシステムが使用するパーティションのみを暗号化するものとします。

暗号化に使用する共通鍵は32バイトで、これを含む設定をパスワードで暗号化して起動ディスクに入れておくこととします。

暗号化にあたってはライブLinux環境でバックアップとリストアを行うものとしますので、必要なストレージを準備してください。

# BIOS環境

## 暗号化

BIOS環境では、パスワード認証のためにboot/login-simpleのプログラムを使用します。まず、同ディレクトリにbitvisor.confというファイル名の設定ファイルを作成します。bitvisor.conf.tmplというファイルがあるので参考にしてください。

```
# ディスク暗号化の設定                                                          
#storage.conf0.type=ATA                                                  
storage.conf0.host_id=0
storage.conf0.device_id=0
#storage.conf0.lba_low=63                                                       
#storage.conf0.lba_high=12851999                                                
storage.conf0.lba_low=527478210
storage.conf0.lba_high=605602304
storage.conf0.keyindex=0
storage.conf0.crypto_name=aes-xts
storage.conf0.keybits=256
```

ここが重要なところです。storage.conf0.type=ATAのコメントは外すとして... ATA, AHCI, NVMEがありますので適切に選んでください。機種によってはBIOS環境ではATA, オペレーティングシステムはAHCIが使われる場合がありますので、その場合は2種類の設定が必要です。

また、host_idとdevice_idでデバイスを特定します。AHCIの場合はドライバーだけ入れてBitVisorを起動し、ディスクにアクセスすると最初に"AHCI 0:1 IDENTIFY"みたいなログが残ります。この場合は0がhost_idで1がdevice_idになります。よくわからない場合は-1を指定するとすべてのデバイスが対象になります。

lba_lowとlba_highで対象のLBA範囲を指定します。対象パーティションが含まれるように設定しておきます。

keyindexは暗号化に用いる共通鍵を選択します。crypto_nameとkeybitsは変更できません。

暗号化に用いる共通鍵については:

```
storage.encryptionKey0.place=./StorageKey0
```

デフォルトでこんな設定(とファイル)が置かれているので、適切に修正してください。放っておくと誰でもわかる鍵になってしまいます。

後はドライバーの設定:

```
vmm.driver.pci=driver=ahci
```

AHCIの場合はこんな感じです。適切に設定してください。

makeしてパスワードを入れるとmodule1.binとmodule2.binというファイルができます。それとbitvisor.elfが用意できたら、まずはそれらをGNU GRUBとライブLinux環境が入った適当なUSBメモリーにでも入れておきます。GNU GRUBからは:

```
menuentry 'BitVisor' {
  multiboot bitvisor.elf
  module module1.bin
  module module2.bin
}
```

のようなエントリーで起動できるようにしておきます。

一度そのUSBメモリーでまずはライブLinux環境を起動し、BitVisorインストール用の空きパーティション(100MB程度)を作り、起動パーティションがアクティブになっていることを確認の上、暗号化対象のパーティションのバックアップを行います。ddが簡単ですが、NTFSについてはntfscloneというコマンドを使うと必要な場所だけバックアップが取れるのでとても便利です。

バックアップが取れたら今度はBitVisor上でライブLinux環境を起動します。ddコマンド等により暗号化が有効になったことが確かめられたら、バックアップからリストアを行います。

## インストール

暗号化ができたら、次にBitVisorを起動ディスクに入れます。パスワードを入れたら自動的にオペレーティングシステムが起動するようにするには以下の設定をbitvisor.confに入れます:

```
vmm.boot_active=1
```

それでmodule1.bin, module2.bin, bitvisor.elfが用意できたら、今度はboot/loaderディレクトリにあるプログラムを使います。ここでmake後、install.shというシェルスクリプトでハードドライブのMBRにインストールします。インストールの際はディスク上に空き領域が必要です。

```
$ boot/loader/install.sh 
usage: boot/loader/install.sh [-f] device lba1 lba2 loader elf [module1] [module2]
  -f      first time (do not check existing data)
  device  write to device (ex. /dev/sda)
  lba1    install a boot record to device's lba1 (0 for MBR)
  lba2    install images to device's lba2
  loader  /path/to/bootloader
  elf     bitvisor.elf
  module1 login program (vmlinux)
  module2 login data (initrd)
```

こんな感じのコマンドになっていて、例えば:

```
# boot/loader/install.sh -f /dev/sda 0 100 boot/loader/bootloader bitvisor.elf boot/login-simple/module1.bin boot/login-simple/module2.bin
```

のようにしてインストールできます。(LBA 100〜が空き領域の場合)

## 起動

うまくいけば、起動時に自動的にBitVisorが起動し、パスワード入力を求められ、それを入力すれば続いてアクティブパーティションのオペレーティングシステムが起動し始めます。

# UEFI環境

## 暗号化

bitvisor.confの書き方はBIOS環境と同様です。module2.binファイルも同様に作成します。EFI Systemパーティションは暗号化しないでください。vmm.boot_activeは無視されます。

UEFI環境ではboot/uefi-loader-loginにあるプログラムを使用します。これがBIOS環境で作成したmodule2.binファイルを読み込みます。loadvmm.efi, module2.bin, bitvisor.confをUEFIファームウェアがアクセスできるファイルシステムに置いておきます。

BitVisor boot/uefi-loader-loginの使い方
https://qiita.com/hdk_2/items/5f2556e6fede840607bc

作業用にEFI Shellが使えると便利です。もしGNU GRUBからBitVisorを起動する場合は、chainloaderコマンドを使ってloadvmm.efiを起動してください。BIOS環境と同様にライブLinux環境を起動してバックアップ(ただし、EFI Systemパーティションを使うので、パーティションの設定はいりません)、再起動してBitVisorを起動後にライブLinux環境を起動してリストアを行います。

## インストール

EFI Systemパーティションのルートディレクトリまたはどこかのディレクトリに、loadvmm.efi, module2.bin, bitvisor.confの3つのファイルをおきます。そして、ライブLinux環境でefibootmgrコマンドを使って以下のような雰囲気のコマンドで起動設定を仕込みます。

```
# efibootmgr -c -L BitVisor -l \\loadvmm.efi
```

## 起動

これですんなり起動してくれればいいのですが、ファームウェアの実装によってうまくいかない場合が考えられます。例えば...

* BitVisorは起動するが、その後ファームウェアの起動デバイス選択メニューが出てしまう(某L社製PC)
* BitVisorの起動メッセージ等が見えない(某A社製コンピューター)

また、某F社製PCや某L社製PCにおいては、勝手にブートオーダーを入れ替えられたり、どこからともなくWindows Boot Managerというブートエントリが作られたりする場合があります。EFI Systemパーティションは暗号化していませんから、BitVisorなしでもオペレーティングシステムのローダーまでは実行されてしまい、暗号化データを見て困ったローダーがエラーを出してしまう場合もありますので、ご注意ください。

なお、どうしようもない場合はEFI Shellが起動するようefibootmgrコマンドで設定をした上で、startup.nshというファイルをEFI Systemパーティションにおいて、その中にloadvmm.efiとオペレーティングシステムのローダー(\EFI\debian\grubx64.efiや\EFI\Microsoft\Boot\bootmgfw.efiなど)を書く手があります。

```
fs0:
\loadvmm.efi
\EFI\Microsoft\Boot\bootmgfw.efi
```