OpenBSD フルディスク暗号化 (on VirtualBox)
Tags: openbsd, security, encryption, virtualbox
Published: 2023-01-03 06:06:38

## はじめに

[OpenBSD](https://www.openbsd.org/) はフルディスク暗号化 (Full Disk Encryption, FDE) をサポートしています。[softraid](https://man.openbsd.org/softraid) と [bioctl](https://man.openbsd.org/bioctl) を用いることで実現できます。[チュートリアル (英語)](https://www.openbsd.org/faq/faq14.html#softraidFDE) が公式サイトで公開されています。FDE を施しておくことで、仮にコンピューターを紛失するような事態に遭っても、(暗号鍵が安全に保管されている限りは) あなたのデータは強固に保護されます。

FDE は、物理サーバーや VPS ([CloudSigma](https://www.cloudsigma.com/) や [ConoHa](https://www.conoha.jp/) のような OpenBSD マシンイメージをサポートしているサービス) のサーバーと同様に、[VirtualBox](https://www.virtualbox.org/) でも利用できます。

![openbsd-boot-under-full-disk-encryption](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mre5si978piqq6k2gcd.png)

本記事で VirtualBox の VM に対してフルディスク暗号化を行う方法を示します。手順ごとの出力内容と、他の環境に関する補足事項も記載しています。

### 環境

- OS: OpenBSD [7.2](https://www.openbsd.org/72.html)

### 注意 - 既存の全データが消えます

必要に応じて事前にバックアップを取っておくと良いかもしれません。

### (参考) デバイス名

デバイス名は環境によって異なります。私が VirtualBox で行った時は、`wd0` がオリジナルのデバイスに当たり、`sd0` が softraid による暗号化されたものに該当しました。別の例ですがVPS の場合は、前者が `sd0` で後者 `sd1` と言うように、異なることもありました。ハードウェア、特に SATA のようなドライブ次第で、変わります。

後述のチュートリアルの中で、デバイスを確認して選択する手順についても、記載しています。

#### 私が実際に行った時のデバイス名の対照表

| 環境 | オリジナル | softraid |
| --- | ------ | -------- |
| VirtualBox | `wd0` | `sd0` |
| 物理サーバー or VPS | `sd0` | `sd1` |

## チュートリアル

公式のチュートリアル (英語) に基づいています。(本記事の冒頭をご覧ください。)

### インストーラーメディアで VM を起動

Oracle VM Virtualbox はインストール済でしょうか ? VM に OpenBSD のインストーラー `.iso` (私の場合は `install72.iso` でした) はアタッチされているでしょうか ? もしそうでしたら始めましょう !

### Shell の実行

まず以下のようにたずねられるでしょう:

> Welcome to the OpenBSD/amd64 7.2 installation program.
> (I)nstall, (U)pgrade, (A)utoinstall or (S)hell?

"s" つまり Shell を選んでください。

次にキーボードマッピングを調整する必要があるかを確認します。必要な場合、以下を実行します。(私の場合 `kbd jp` が必要でした):

```console
# kbd %あなたの言語%
```

出力は以下の通りでした:

```console
kbd: keyboard mapping set to jp
```

### 暗号化するデバイスの選択

まず暗号化対象を選びましょう。下記のコマンドでデバイスの一覧を確認できます:

```console
# sysctl hw.disknames
```

出力は以下の通りでした:

```console
hw.disknames=wd0:(...),cd0:,cd1:,rd0:(...)
```

くりかえしになりますが、このチュートリアルでは `wd0` がオリジナルに該当します。

### オリジナルのディスクの確認

```console
# cd /dev

# sh MAKEDEV wd0
```

### (実施は必要に応じてですが推奨されます) ディスクにランダムデータを書き込む

いよいよディスクを操作する段階に来ました。

最初の手順は必ずしも必要ではありません。しかしながらマシンが実際に使用しているボリュームを隠す効果があります。
非常に時間が掛かることがあります。ディスクサイズ次第です。

注意点ですが、VPS などでは不利になる側面もあります。と言うのは、ボリューム全体を消費するため、スナップショット作成時のイメージサイズが非常に大きくなってしまうからです。

```console
# dd if=/dev/urandom of=/dev/rwd0c bs=1m
```

出力は以下の通りでした:

```console
dd: rwd0c: end of device
7169+0 records in
7168+0 records out
7516192768 bytes transferred in 57.711 secs (130236923 bytes/sec)
```

なお、効果は限定的になりますが、`count` を併用することで、部分的にランダムデータを書き込むことも可能です。以下は 2 GB だけ書き込む例です:

```diff
- dd if=/dev/urandom of=/dev/rwd0c bs=1m
+ dd if=/dev/urandom of=/dev/rwd0c bs=1m count=2048
```

### ディスクの初期化

MBR ブートを使用する場合は、以下を実行します:

```console
# fdisk -iy wd0
```

出力は以下の通りでした:

```console
Writing MBR at offset 0.
```

なお GPT で UEFI ブートする場合は、代わりに `fdisk -gy -b 960 wd0` を実行します。

### softraid パーティションの作成

次のコマンドを実行します:

```console
# disklabel -E wd0
```

そしてその中で、以下の通り進めます:

```console
Label editor (enter '?' for help at any prompt)
wd0> a a
offset: [64]
size: [14680000] *
FS type: [4.2BSD] RAID
wd0*> w
wd0> q
No label changes.
```

なおここでディスク全体を使用していますが、後ほど OS をインストールする時には複数パーティションに分割することが可能です。分割は暗号化されたディスクに対して行われます。

### 暗号化デバイスの構築

bioctl の出番です。

```console
# bioctl -c C -l wd0a softraid0
```

プロンプトで以下のようにパスフレーズをたずねられます。起動時に要求される文字列になります:

```console
New passphrase:
Re-type passphrase:
```

出力は以下の通りでした:

```console
sd0 at scsibus1 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006>
sd0: 7167MB, 512 bytes/sector, 14679472 sectors
softraid0: CRYPTO volume attached as sd0
```

`sd0` が CRYPTO ボリュームとして生成されました !!

ちなみにパスフレーズの代わりに [キーディスク (keydisk) (英語)](https://www.openbsd.org/faq/faq14.html#softraidFDEkeydisk) を使用することも可能です。

### CRYPTO デバイスの確認

```console
# cd /dev

# sh MAKEDEV sd0
```

ここまでのおかげで、このデバイスに書き込まれるすべてのデータが "XTS モードで AES (XTS-AES) 暗号化" されるようになりました。

### 新しい疑似デバイスの先頭にメガバイトデータを書き込む

これが、第一にして中心になる本章における、最後のステップです。実行してください:

```console
# dd if=/dev/zero of=/dev/rsd0c bs=1m count=1
```

出力は以下の通りでした:

```console
1+0 records in
1+0 records out
1048576 bytes transferred in 0.016 secs (64883162 bytes/sec)
```

### インストーラーに戻る

ディスクの準備が完了しました。

Shell に別れを告げましょう:

```console
# exit
```

インストーラーの Welcome メッセージがふたたび表示されます。

![installer-after-encryption](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajj9jh0kbc6c97hjw0jg.png)

### インストール時に暗号化ボリュームを選択する

残るは OS をインストールする場所を聞かれた時に、暗号化ボリュームを選択することです。

![choose-encrypted-volume](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nverffhjgiwvl5kvdk82.png)

`sd0` が私の暗号化ディスクであることに留意してください。(あなたにとっての暗号化ディスクが `sd1` であれば、もちろん `sd1` を選択してください。)

## おわりに

### インストールの完了

おめでとうございます 🎉🎉🎉

あなたは暗号化されたディスクに OpenBSD をインストールすることができました。

![installation-is-completed](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqfariu6haefhxx848st.png)

### 起動時にパスフレーズを聞かれる

次に起動した時、あなたのセキュリティシステムは見事な形で機能するでしょう。

![prompt-for-passphrase-under-full-disk-encryption](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mre5si978piqq6k2gcd.png)

正しいパスフレーズ (またはキーディスク) を入力することで、続行が認められます。そしてマシンが起動してあなたの力になってくれるでしょう。

![booted](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1uepr6vtrblcyd9bzdqj.png)