search
LoginSignup
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

FreeBSD Advent Calendar 2020 Day 2

posted at

FreeBSD+GEOM/GELIでJail用パーティションを暗号化する

FreeBSD Advent Calendar 2020 2日目は、GEOM/GELIによるストレージ暗号化機能を利用し、Jailコンテナ用のパーティションを暗号化する方法を紹介しようと思います。

背景

以下の記事でも紹介しているように、私はさくらのVPSにFreeBSD+Jail環境を構築して利用しています。

Jail使う分には昨日の記事で紹介した手順で充分なのですが、クラウド上に用意した生活環境などはストレージを暗号化しておきたいなという気持ちもあります(気にする人は気にするよね、レベルの話です...)。

FreeBSDにはgeom(4)geliというディスク暗号化機能があり、これとJailを組み合わせることで、暗号化したストレージの上に生活環境を構築できそうです。

というわけで、今日の記事ではFreeBSD+Jail+GEOM/GELIを活用する方法を紹介してみます。

GEOM/GELIによるストレージの暗号化

GEOM/GELIによるストレージの暗号化を行う場合、FreeBSDインストールの段階でルートパーティションと暗号化ストレージ用のパーティションを分けて作成しておきます。以降の例では /jail を暗号化ストレージ用のパーティションとして設定して行きます。

$ df -h
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/vtbd0s1a    2.9G    1.3G    1.4G    48%    /
devfs            1.0K    1.0K      0B   100%    /dev
/dev/vtbd0s1b     15G     32M     14G     0%    /jail

/boot/loader.conf に以下の設定を追加し、FreeBSD起動時にGEOM/GELI用のカーネルモジュールがロードされるようにしておきます。

geom_bde_load=YES

上記の設定は再起動しないと参照されないため、暗号化設定の投入作業時においては以下のように手動でカーネルモジュールをロードしておきましょう。

$ kldload geom_bde
$ kldstat
Id Refs Address                Size Name
 1   14 0xffffffff80200000  243cd00 kernel
 2    1 0xffffffff8263d000    12248 geom_bde.ko

FreeBSDインストール直後の /jail パーティションはフォーマットされた状態なので、いったん unmount します。

$ sudo umount /jail

また、 /etc/fstab のエントリもコメントアウトしておきます。

$ sudo vi /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/vtbd0s1a   /               ufs     rw      1       1
#/dev/vtbd0s1b  /jail           ufs     rw      2       2
/dev/vtbd0s1d   none            swap    sw      0       0

暗号化パーティションの設定

パーティションを暗号化します。 /jail はデバイス /dev/vtbd0s1b として見えており、これに対してGEOM操作用コマンドである gbde init gbde attach を実行します。

gbde init を実行すると暗号化パーティションの設定ファイルが開きます。保存・終了時にパスフレーズの入力が求められ、ここで入力したパスフレーズを暗号化パーティションのアタッチ時に入力することになります。

$ # GBDE関連のファイルを置いておくディレクトリを作成。
$ sudo mkdir /etc/gbde
$
$ # "gbde init"で設定ファイルが開く。
$ # 保存時に新たにパスフレーズを聞かれるので設定する。
$ sudo gbde init /dev/vtbd0s1b -i -L /etc/gbde/vtbd0s1b.lock

gbde attach でアタッチすることで /dev/vtbd0s1b.bde のような形で暗号化パーティションが見えるようになります。

$ sudo gbde attach /dev/vtbd0s1b -l /etc/gbde/vtbd0s1b.lock
$
$ ls /dev/vtbd0s1*.bde
/dev/vtbd0s1b.bde

あとは通常のパーティションと同じく、 newfs を実行してフォーマットします。

$ sudo newfs -U /dev/vtbd0s1b.bde
/dev/vtbd0s1b.bde: 16256.8MB (33293824 sectors) block size 32768, fragment size 4096
        using 26 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1282432, 2564672, 3846912, 5129152, 6411392, 7693632, 8975872, 10258112,
 11540352, 12822592, 14104832, 15387072, 16669312, 17951552, 19233792,
 20516032, 21798272, 23080512, 24362752, 25644992, 26927232, 28209472,
 29491712, 30773952, 32056192

これで暗号化パーティションの設定とフォーマットが完了しました。 mount コマンドでパーティションをマウントすればそのまま使用できます。

$ sudo mount /dev/vtbd0s1b.bde /jail
$ df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
/dev/vtbd0s1a        2.9G    1.3G    1.4G    48%    /
devfs                1.0K    1.0K      0B   100%    /dev
/dev/vtbd0s1b.bde     15G    8.0K     14G     0%    /jail

これで必要な準備が完了しました。あとは 昨日の記事で紹介したJail環境を暗号化ストレージ上に構築することで安心(?)してFreeBSD環境を利用することができます。

クラウド上のインスタンスでGEOM/GELIを利用する際のコツ

暗号化したパーティションは、 /etc/rc.conf に以下のような記述を追加しておくことで、OS起動時にマウントすることができますが、クラウド上のインスタンスではこの設定はおススメしません。

理由としては、起動時に gbde attach を実行した時と同じくパスフレーズの入力が求められるため、コンソールが取れないような環境では入力待ちのまま起動が止まってしまうためです。
(さくらVPSの場合はコンソールが取れるため問題ありませんが、それでも起動時にWebコンソールを開くのは少々手間な感じです...)

gbde_autoattach_all="YES"
gbde_devices="vtbd0s1b"
gbde_lockdir="/etc/gbde"

そのため、私の環境ではインスタンスが起動したのち、 ssh でログインしてから gbde attachmount を実行する方法で運用しています。

まとめ

GEOM/GELIを用いたFreeBSDでの暗号化ストレージ設定方法を紹介しました。今回はストレージ上にJail環境を構築する前提での話でしたが、USBメモリのような暗号化しておくと安心といったデバイスにも応用ができるかと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2
Help us understand the problem. What are the problem?