Linux 4.1でext4の暗号化ファイルシステムが取り込まれているのに気づいたので少し試してみました.
cCryptFSやEncFSなどと同じようにファイル単位での暗号化です.前もって暗号化フラグを設定してあれば一般ユーザが勝手に暗号領域を作ることも可能でした.eCryptFSやEncFSのような使い方も可能そうです.恐らく速度はこちらのほうが速いでしょう(未確認).ただ,パスフレーズがわかってしまうと別のユーザからもマウント可能だしパーミッションがあれば読み書きも出来るので通常のファイルシステムと同様パーミッションの設定は必須ですね.
パーティション内全てを暗号化することは出来ないようなのでLUKS(dm-crypt)とは単純に空きかえることはできなさそうです.
そんなこんなでもともとAndroid向けということもあってPC/Serverではあまり使いみちが思いつかない感じです.(何かいい使い方ありそうだけど…….)
必要条件確認
- CONFIG_EXT4_ENCRYPTIONが有効
$ grep CONFIG_EXT4_ENCRYPTION /boot/config-`uname -r`
CONFIG_EXT4_ENCRYPTION=y
$ dpkg-query -W e2fsprogs
e2fsprogs 1.43.4-2
$ sudo dumpe2fs /dev/loop0 | grep -i 'block size'
dumpe2fs 1.43.4 (31-Jan-2017)
Block size: 4096
必要なパッケージの導入
$ sudo apt install e2fsprogs keyutils util-linux coreutils mount
ファイルシステムの用意
今回は既存のファイルシステム内にディスクイメージを作成してそれを利用
$ dd if=/dev/zero of=ext4-crypt.img seek=1073741824 bs=1 count=1
1+0 レコード入力
1+0 レコード出力
1 byte copied, 0.000118528 s, 8.4 kB/s
$ /sbin/fdisk ext4-crypt.img
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xa25a3988.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):
Created a new partition 1 of type 'Linux' and of size 1023 MiB.
Command (m for help): w
The partition table has been altered.
Syncing disks.
$ /sbin/mkfs.ext4 ./ext4-crypt.img
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in ./ext4-crypt.img
Proceed anyway? (y,N) y
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: dc44fd43-7d7a-4dfc-87f1-dc52410e2dd1
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mount -o loop ./ext4-crypt.img /mnt
$ grep /mnt /etc/mtab
/dev/loop0 /mnt ext4 rw,relatime,data=ordered 0 0
$ sudo chown `id -u`.`id -g` /mnt
$ ls -la /mnt
合計 36
drwxr-xr-x 3 mk mk 4096 4月 2 04:58 .
drwxr-xr-x 1 root root 248 3月 28 02:19 ..
drwx------ 2 root root 16384 4月 2 04:58 lost+found
ext4暗号化ファイルシステムの利用
$ sudo tune2fs -O encrypt /dev/loop0
$ sudo dumpe2fs /dev/loop0 | grep -io encrypt
dumpe2fs 1.43.4 (31-Jan-2017)
encrypt
$ /usr/sbin/e4crypt add_key
Enter passphrase (echo disabled):
Added key with descriptor [07a3ce5a6ebf0396]
$ keyctl show
Session Keyring
1048296028 --alswrv 1000 1000 keyring: _ses
615559430 --alsw-v 1000 1000 \_ logon: ext4:07a3ce5a6ebf0396
※パスフレーズの入力は1回だけで確認されないので初回は特に注意.利用しはじめる前にキーリングをクリアして登録し直してパスフレーズが正しいか確認しておく.
このとき対象ディレクトリが空ではない場合エラーとなる( Error [Directory not empty] setting policy.
)ので注意.
マウントポイントにはlost+found
が存在するので必ずサブディレクトリ以下である必要がある.
$ mkdir /mnt/encryption
$ /usr/sbin/e4crypt set_policy 07a3ce5a6ebf0396 /mnt/encryption
Key with descriptor [07a3ce5a6ebf0396] applied to /mnt/encryption.
※鍵の生成とキーリングへの追加と暗号化ポリシーの設定は次のようにすることで一度に設定可能
$ /usr/sbin/e4crypt add_key /mnt/encryption
$ echo 'hello' > /mnt/encryption/test.txt
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096 4月 2 05:07 .
drwxr-xr-x 4 mk mk 4096 4月 2 05:06 ..
-rw-r--r-- 1 mk mk 6 4月 2 05:07 test.txt
$ sudo keyctl clear @s
$ sudo keyctl show
Session Keyring
1048296028 --alswrv 1000 1000 keyring: _ses
キーリングをクリアしただけではアクセスできる
$ ls -lA /mnt/encryption
合計 12
-rw-r--r-- 1 mk mk 6 4月 2 05:07 test.txt
キーリングをクリアした状態でアンマウントすると暗号化された状態に戻る
$ sudo umount /mnt
$ sudo mount -o loop ./ext4-crypt.img /mnt
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096 4月 2 05:42 .
drwxr-xr-x 4 mk mk 4096 4月 2 05:06 ..
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
$ cat /mnt/encryption/uzUlJZQfaxMx,7cC63,53A
cat: /mnt/encryption/uzUlJZQfaxMx,7cC63,53A: 要求されたキーが利用できません
ユーザ,グループ,パーミッションなどは見える.内容にはアクセスできない.
鍵の生成とキーリングへの追加と暗号化ポリシーの設定をし直すとアクセスできるようになる
$ /usr/sbin/e4crypt add_key /mnt/encryption
Enter passphrase (echo disabled):
Added key with descriptor [07a3ce5a6ebf0396]
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096 4月 2 05:42 .
drwxr-xr-x 4 mk mk 4096 4月 2 05:06 ..
-rw-r--r-- 1 mk mk 6 4月 2 05:42 test.txt
ファイル名長の確認
EncFSなどはファイル名のメタデータがファイル名内にあるので利用できるファイル名長が短くなってしまう.ext4ではどうか試す.
$ touch /mnt/1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
touch: '/mnt/1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456' に touch できません: ファイル名が長すぎます
$ touch /mnt/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
$ touch /mnt/encryption/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
$ ls -lA /mnt/encryption/
合計 4
-rw-r--r-- 1 mk mk 0 4月 2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 mk mk 6 4月 2 05:42 test.txt
-rw-r--r-- 1 mk mk 0 4月 2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
復号状態のファイル名は別の場所に記録されているよう.
複数の暗号化領域を作ってみる
$ mkdir /mnt/encryption2
$ ls -la /mnt/encryption2
合計 8
drwxr-xr-x 2 mk mk 4096 4月 2 06:49 .
drwxr-xr-x 5 mk mk 4096 4月 2 06:49 ..
$ sudo e4crypt add_key /mnt/encryption2
Enter passphrase (echo disabled):
Key with descriptor [9640dd016062b432] already exists
Key with descriptor [9640dd016062b432] applied to /mnt/encryption2.
$ keyctl show
Session Keyring
1048296028 --alswrv 1000 1000 keyring: _ses
94779002 --alsw-v 0 0 \_ logon: ext4:69ca01e214957173
219437542 --alsw-v 0 0 \_ logon: ext4:07a3ce5a6ebf0396
1025344233 --alsw-v 0 0 \_ logon: ext4:9640dd016062b432
$ touch /mnt/encryption2/hoge
$ keyctl clear @s
$ keyctl show
Session Keyring
1048296028 --alswrv 1000 1000 keyring: _ses
$ sudo umount /mnt
$ sudo mount -o loop ./ext4-crypt.img /mnt
$ sudo e4crypt add_key /mnt/encryption2
Enter passphrase (echo disabled):
Added key with descriptor [9640dd016062b432]
Key with descriptor [9640dd016062b432] applied to /mnt/encryption2.
$ ls -la /mnt/encryption*
/mnt/encryption:
合計 12
drwxr-xr-x 2 mk mk 4096 4月 2 06:11 .
drwxr-xr-x 5 mk mk 4096 4月 2 06:49 ..
-rw-r--r-- 1 mk mk 0 4月 2 06:11 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
/mnt/encryption2:
合計 8
drwxr-xr-x 2 mk mk 4096 4月 2 06:51 .
drwxr-xr-x 5 mk mk 4096 4月 2 06:49 ..
-rw-r--r-- 1 mk mk 0 4月 2 06:51 hoge
暗号化領域に鍵が登録されてない状態でファイルを作ってみる
暗号化領域に鍵が登録されてない状態でファイルを作るとどうなるかを確認.
$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0 4月 2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
mk@x220:~ (1180)$ touch /mnt/encryption/test
touch: '/mnt/encryption/test' のタイムスタンプを設定中です: そのようなファイルやディレクトリはありません
mk@x220:~ (1181)$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0 4月 2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
エラーとなって作れない.
別のユーザで利用
$ id
uid=1001(gm) gid=1001(gm) groups=1001(gm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),107(netdev)
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096 4月 2 06:11 .
drwxr-xr-x 7 mk mk 4096 4月 2 07:48 ..
-rw-r--r-- 1 mk mk 0 4月 2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
$ ls -la /mnt/encryption
合計 12
drwxrwxrwx 2 mk mk 4096 4月 2 06:11 .
drwxr-xr-x 7 mk mk 4096 4月 2 07:48 ..
-rw-r--r-- 1 mk mk 0 4月 2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 mk mk 6 4月 2 05:42 test.txt
$ touch /mnt/encryption/other_user
$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0 4月 2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 gm gm 0 4月 2 07:55 other_user
-rw-r--r-- 1 mk mk 6 4月 2 05:42 test.txt
$ /usr/sbin/e4crypt add_key /mnt/encryption
/mnt/encryption: Permission denied
$ ls -la /mnt/encryption
合計 12
drwxrwxrwx 2 mk mk 4096 4月 2 07:55 .
drwxr-xr-x 7 mk mk 4096 4月 2 07:48 ..
-rw-r--r-- 1 gm gm 0 4月 2 07:55 97NmIBETx,1q9US96etRsA
-rw-r--r-- 1 mk mk 0 4月 2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6 4月 2 05:42 uzUlJZQfaxMx,7cC63,53A
$ /usr/sbin/e4crypt add_key /mnt/encryption
Enter passphrase (echo disabled):
Added key with descriptor [07a3ce5a6ebf0396]
Error [Permission denied] setting policy.
The key descriptor [07a3ce5a6ebf0396] may not match the existing encryption context for directory [/mnt/encryption].
$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0 4月 2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 gm gm 0 4月 2 07:55 other_user
-rw-r--r-- 1 mk mk 6 4月 2 05:42 test.txt