Cryptmountでファイルシステムとスワップ空間を保護する

  Cryptmount を使えば、ファイルシステムとスワップ空間の両方を暗号化できる。暗号化されたファイルシステムは、通常のファイルシステムと同じように(たとえば「/dev/sda2」を使って)ブロックデバイスに格納できるほか、別のファイルシステムに属する普通のファイル内に格納することもできる。後者の方法が特に役立つのは、パーティションテーブルを変更したりLVM(Logical Volume Manager)を使ったりせずに暗号化されたファイルシステムを扱いたい場合だ。Cryptmountではスワップ空間も暗号化できるので、暗号化されたファイルシステムに含まれる情報のセキュリティが、プロセスをハードディスクにスワップアウトするLinuxカーネルによって不用意に損なわれることもない。

 Cryptmountで設定した暗号化は、Linuxカーネルのデバイスマッパのレベルで行われる。これは、サポートされている任意のファイルシステムタイプをデバイスマッパで暗号化されたブロックデバイスファイル上に作成できることを意味する。Cryptmountで扱える部分は、デバイスマッパによる暗号化の設定と、暗号化されたデバイスマッパレイヤ上に存在するファイルシステムのマウントである。ただし、Cryptmountの簡単な使い方では、これらの詳細を知る必要はない。

 CryptmountのパッケージはUbuntu GutsyのUniverseリポジトリにあるほか、SlackwareやGentoo向けのものもさまざまな形で入手できる。また、SourceForge.netのCryptmountのページには、Fedora 8にインストールできるRPMファイルが用意されている。

 Cryptmountを試す一番簡単な方法は、対話式スクリプトcryptmount-setupを使うことだ。暗号化されたファイルシステムを1つのファイルとして手早く作成できる。なお、cryptmount-setupのデフォルト設定は、暗号化されたコンテンツ用のディレクトリを「/home」の下に作成するものになっている。

# cryptmount-setup
********************************
* cryptmount setup script
*
* This program will allow you to setup a secure filing-system that will
* be managed by "cryptmount". You will be able to select basic features
* such as the location and size of the filesystem - if you want more
* advanced features, you should consult the cryptmount manual page.
*
...
  Please enter a target name for your filesystem
  [opaque]: my-encrypted-files
  Which user should own the filesystem (leave blank for root)
  []:
  Please specify where "my-encrypted-files" should be mounted
  [/home/crypt]:
  Enter the filesystem size (in MB)
  [64]: 256
  Enter a filename for your encrypted container
  [/home/crypto.fs]:
  Enter a location for the keyfile
  [/etc/cryptmount/my-encrypted-files.key]:
...
enter new password for target "my-encrypted-files":
confirm password:
Formatting encrypted filesystem...
enter password for target "my-encrypted-files":

Your new encrypted filesystem is now ready for use.
To access, try:
    cryptmount my-encrypted-files
    cd /home/crypt
After you have finished using the filesystem, try:
    cd
    cryptmount --unmount my-encrypted-files

# cryptmount my-encrypted-files
enter password for target "my-encrypted-files":
e2fsck 1.40.2 (12-Jul-2007)
/dev/mapper/my-encrypted-files: clean, 11/65536 files, 18561/262144 blocks

# df /home/crypt
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/my-encrypted-files
                        253871     10288    230476   5% /home/crypt

 「cryptmount --unmount」という部分に注意してほしい。Linuxカーネルは「/home/crypt」をごく普通のファイルシステムと見なすだろうが、「umount /home/crypt」としてはならない。Cryptmountではまだアクティブと見なされているからだ。これを実行すると、カーネルのファイルシステムはアンマウントされるが、Cryptmount側で再マウントしようとしても“create ioctl failed:Device or resource busy”というメッセージが出て失敗することになる。

 このようにファイルシステムのアンマウントが行われてしまうと、本来は正しい「cryptmount --unmount my-encrypted-files」というコマンドの実行にも失敗し、指定されたファイルシステムがマウントされていないとのメッセージがCryptmountから出力されることになる。この問題を解決するには、「--release」オプションを使って、ほかの方法ですでにアンマウントされたcryptmount関連のリソースを解放するようにCryptmountに指示すればよい。

 上記のセッションでは、暗号化されたファイルシステムにext3が使われている。使用するファイルシステムのタイプ(ext2、ext3、XFSなど)やその他のオプションは、「/etc/cryptmount/cmtab」ファイル内に指定できる。先ほどの「cryptmount-setup」の実行により、「cmtab」ファイルには次のように新たなエントリが作成されるはずだ。

$ cat /etc/cryptmount/cmtab
...
# entry automatically generated by setup-script:
my-encrypted-files {
    dev=/home/crypto.fs
    dir=/home/crypt
    fstype=ext3
    fsoptions=defaults
    cipher=aes
    keyformat=builtin
    keyfile=/etc/cryptmount/my-encrypted-files.key
}

 「dev」オプションは暗号化ファイルシステムが格納されるブロックデバイスまたはファイルの名前を示しており、「dir」オプションは暗号化ファイルシステムの実際のマウント先である。「fstype」にはファイルシステムのタイプが、「fsoptions」には「fstab」ファイルと同じ方式でファイルシステムのオプションが指定されている。キー(鍵)の形式および場所については、説明は不要だろう。詳細については、cmtabのマニュアルページを参照してほしい。ここで指定されているもう1つのオプションは、キーを対象マシンとは別に保管できるようにキーファイルそのものをUSBフラッシュメモリに保存するためのものだ。

 「cipher」オプションでは、Cryptmountのファイルシステムで使用する暗号化アルゴリズムを指定できる。デフォルトはAESだが、ほとんどすべてのユーザはこの設定のままで問題ないだろう。後述のコマンドを使えば、実行中のカーネルで利用できる暗号化方式がわかる。あらかじめカーネルに組み込まれているか、現時点でカーネルにロードされているものがあれば、「/proc/crypto」ファイルに出力される。また、特定のカーネルモジュールで利用できるオプションを確認するには、「modprobe」を使ってモジュールをロードしたうえで「/proc/crypto」の情報をチェックすればよい。

$ ls -l /lib/modules/$(uname -r)/kernel/crypto/
$ cat /proc/crypto
...
$ sudo modprobe twofish
$ cat /proc/crypto
name         : twofish
driver       : twofish-generic
module       : twofish
priority     : 100
refcnt       : 1
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
...

 cryptmount-setupスクリプトは、同じような処理を実行する大半のコマンドと同様、rootで実行する必要がある。暗号化ファイルシステムの設定を手作業で行う方法はcryptmountのマニュアルページに載っているので、ここではオプションをいくつか変更してユーザのホームディレクトリに暗号化ファイルシステム全体を保存するように手を加えたものを示すことにする。

 IXFSを使用する64MBの暗号化ファイルシステムが、ホームディレクトリ内にマウントされるように設定を行うとしよう。一般ユーザは別のcmtabファイルパスを指定できないため、グローバルな「/etc/cryptmount/cmtab」を編集してそこにCryptmountの情報を記述することになる。キーのサイズは「--generate-key」オプションによってバイト単位で指定する。ここでは、キー長を256ビット(32バイト)とした。このとき、「/proc/crypto」ファイルの最小および最大のキーサイズに注意すること。双方の値で決まる範囲内の値を指定する必要がある。「--prepare」オプションを使うと、cryptmountによって暗号化ファイルシステム用のすべてのデバイスマッパファイルが設定されるが、暗号化ファイルシステムが実際にマウントされるわけではない。これこそが我々のねらいであり、デバイスマッパによって提供されるデバイスファイル上にファイルシステムが作成できるわけだ。先ほど説明したとおり、「--release」オプションの実行によってcryptmountはファイルシステムに関するすべてのリソースおよびデバイスマッパファイルを解放するので、次の行では(先に作成しておいた)ファイルシステムのマウントをcryptmountに改めて行わせることができる。続いてroot権限のままで、暗号化ファイルシステムのルートディレクトリに対する保護を変更して、ユーザ「ben」によるこのファイルシステムに対する読み書きとアンマウントを許可する。これで、ユーザ「ben」は暗号化ファイルシステムのマウント、読み書き、アンマウントが自由に行えるようになる。

$ dd if=/dev/zero of=~/myencfs.fs bs=1M count=64
$ mkdir -p ~/myencfs
$ su -l
# vi /etc/cryptmount/cmtab
...
home-ben-myencfs {
    dev=/home/ben/myencfs.fs
    dir=/home/ben/myencfs
    fstype=xfs
    fsoptions=noatime
    keyfile=/home/ben/myencfs.key
    flags=user,nofsck
}
...
# cryptmount --generate-key 32 home-ben-myencfs
# cryptmount --prepare home-ben-myencfs
# mkfs.xfs /dev/mapper/home-ben-myencfs
# cryptmount --release home-ben-myencfs
# cryptmount home-ben-myencfs
# chown ben.root myencfs
# chmod 700      myencfs
# cryptmount -u home-ben-myencfs
# exit
$ cd ~
$ cryptmount home-ben-myencfs
$ df ./myencfs
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/home-ben-myencfs
                         60736      3436     57300   6% /home/ben/myencfs
$ cd ~/myencfs
$ cp /tmp/linux-2.6.23.tar.bz2 .
$ ls -l
-rw-r----- 1 ben ben 45488158 2008-02-01 21:08 linux-2.6.23.tar.bz2

 ハードディスク上にあるスワップファイルの中身は一度マウントしてから次回のマウントまで保存しておく必要はないので、スワップファイルを保護するキーにはランダムデータが使える。下記のスクリプトでは、スワップファイルを再マウントするたびに新たなランダムキーが選択されるとともにmkswapによってスワップファイルが再生成される。これにより、スワップファイル用のパスワードを覚える必要がなくなる。ランダムキーの欠点はアンマウントしたスワップファイルの中身を決して復旧できないことだが、とりあえずデータの復旧には興味がないので「/dev/random」ファイルをキーに使えばよい。

 下記のコードにより、暗号化されたスワップファイルが「/var/swapfile」に作られる。ここでは、スワップ領域を32MBしか取っていないが、最初の「dd」コマンドで16GBのファイルを作っておけば、以降のコマンドをそのまま使うことで巨大な暗号化スワップファイルが得られる。

# dd if=/dev/zero of=/var/swapfile bs=1M count=32
# vi /etc/cryptmount/cmtab
...
swapfile {
  dev=/var/swapfile
  fstype=swap
  flags=mkswap
  cipher=twofish
  keyfile=/dev/random keymaxlen=16 keyformat=raw
}
...
# free -m
...
Swap:            0          0          0
/usr/bin/cryptmount --swapon swapfile
# free -m
...
Swap:           31          0         31
# /usr/bin/cryptmount --swapoff swapfile

 「cmtab」ファイルの「fstype=swap」でスワップマウントが指定されているので、「--swapon」オプションを使わなくても暗号化スワップファイルをマウントできるのではないかと思うかもしれない。こうした勘違いをして「mount」コマンドを実行すると、1画面分のエラーメッセージが出て、暗号化スワップパーティションの作成に失敗する。「fstype」が「swap」になっていても、暗号化されたスワップファイルのマウントには「--swapon」オプションを指定する必要がある。暗号化スワップとして別のパーティションを使う場合は、「dev=」という行のパスを置き換えて、スワップパーティション用のブロックデバイスを指定すればよい。ただし、設定の重複を避けるために「/etc/fstab」にはスワップ用のパーティションおよびファイルは記述しないように注意すること。

 「cmtab」には、リブート後に自動マウントを行うマウントポイントを指定するオプションがない。ブート時に起動するcryptmountの名前は、「/etc/default/cryptmount」ファイルに記述しておく必要がある。関係する2つの変数として、起動するファイルシステムを指定する「CM_BOOTFS」と、ブート時に設定する暗号化スワップを指定する「CM_BOOTSW」がある。以下に示すコマンドは、暗号化の対象となるファイルシステムおよびスワップ空間の双方を設定するものだ。この設定ファイルを適切に変更することで、cryptmountおよびcryptmount-earlyの各サービスがブート時に起動するように設定される。ブートの途中でシステムからhome-ben-myencfs(この例で“ben”となっている部分は適切なユーザ名に変えること)のパスワード入力が求められ、正しく入力するとブート処理が継続される。「home-ben-myencfs」もスワップもシステムのブート完了後にマウントされる。

/root# vi /etc/default/cryptmount
...
# list of swap targets to configure at boot:
CM_BOOTSW="swapfile"

# list of filesystem targets to mount at boot:
CM_BOOTFS="home-ben-myencfs"
...
/root# chkconfig --add cryptmount-early
/root# chkconfig --add cryptmount
/root# reboot

 暗号化ファイルシステムのパスワード変更には「cryptmount --change-password」を用いる。これにより、暗号化ファイルシステムのキーの暗号化に使われるパスワードが変更される。そのため、ファイルシステム側の変更は必要ない。

 Cryptmountは、Linuxが稼働するモバイル機器上の情報を保護するのに役立つ。ホームディレクトリとスワップファイルが共に暗号化されていることがわかっているので、ノートPCが盗まれても困ることや金銭面での損失を被ることはあるが、データが漏洩する可能性は低い。ただし、ノートPCの本体よりもデータのほうを狙う人物の魔の手(およびその他の危険)から情報を守るには、辞書攻撃に耐えられるパスワードの設定が必要であることはいうまでもない。

Ben Martinは10年以上もファイルシステムに携わっている。博士号を持ち、現在はファイルシステムのlibferrisと検索ソリューションに注力。

Linux.com 原文