こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
今回はディスクデバイスぜんたいを暗号化して使用する方法を記載していきたいと思います。
環境イメージ
ubutnu22.04の仮想マシンをVirtualBox上に用意します。
その仮想マシンに対してディスクを1つ追加し、そのディスクを暗号化して使用していく方法を理解していきたいと思います。
手順
仮想マシン立ち上げ直後のディスク等の状態を確認しておきます。
root@LPIC303:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /snap/core20/2318
loop1 squashfs 4.0 0 100% /snap/lxd/29351
loop2 squashfs 4.0 0 100% /snap/snapd/21759
sda
sda1
sda2 ext4 1.0 0e713afc-17be-4cea-ad81-f41c2fdbae01 20G 13% /
sr0
VirtualBox上でのディスク追加手順は省略しますが、以下のように追加しています。
改めてlsblkコマンドを実行してみます。
sdbという出力がありますが、これが上記スクショのLPIC303_1.vhdとなります。
root@LPIC303:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /snap/snapd/21759
loop1 squashfs 4.0 0 100% /snap/core20/2318
loop2 squashfs 4.0 0 100% /snap/lxd/29351
sda
sda1
sda2 ext4 1.0 0e713afc-17be-4cea-ad81-f41c2fdbae01 20G 13% /
sdb
sr0
この時のイメージです。再三ですがsdbはVirtualBoxではLPIC303_1.vhdです。
このディスクデバイスに対してcryptsetup luksFormatコマンドで暗号化を行います。
暗号化を行う際、パスフレーズを求められるので任意のものを入力します。
今回はpasswordとしています。
root@LPIC303:~# cryptsetup luksFormat /dev/sdb
WARNING!
========
This will overwrite data on /dev/sdb irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdb:(passwordと入力)
Verify passphrase:(passwordと入力)
root@LPIC303:~#
暗号化出来ているかを確認します。
cryptsetup luksDumpコマンドにおいて、LUKS ver2でデバイス自体が暗号化されていることがわかります。
或いはlsblk -fの出力結果を見てもsdbのところにcrypto_LUKSと記載されているところからも確認できます。
root@LPIC303:~# cryptsetup luksDump /dev/sdb
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: ce6f2802-93cd-43ce-8723-bd1edabd2a8f
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2id
Time cost: 4
Memory: 313426
Threads: 1
Salt: 06 a5 4c 81 fb 33 b3 82 f7 39 78 08 d8 78 9d 9f
52 e8 90 e5 fe 7e 8f 8a 40 55 99 c3 15 3c 5f 37
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 38641
Salt: ec eb 7e 9c 77 3a 09 fd a9 48 79 5a b4 40 d1 83
29 9b 0c f8 8e 7e 48 fd 85 39 b4 48 13 ad 1c 33
Digest: 21 33 c3 0f 83 8c 3a 04 8f 3d 9d 2b e3 d2 52 9a
75 b8 97 59 af 45 8e c6 b3 15 e5 6d c1 b8 1a e6
root@LPIC303:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /snap/snapd/21759
loop1 squashfs 4.0 0 100% /snap/core20/2318
loop2 squashfs 4.0 0 100% /snap/lxd/29351
sda
sda1
sda2 ext4 1.0 0e713afc-17be-4cea-ad81-f41c2fdbae01 20G 13% /
sdb crypto_LUKS 2 ce6f2802-93cd-43ce-8723-bd1edabd2a8f
sr0
この時のイメージです。デバイス自体が暗号化された状態です。
暗号化したデバイスにデバイスマッパー名を付けていきます。
デバイスマッパー名とは、物理的なデバイス(例えばLUKSで暗号化されたディスク)を、仮想的なブロックデバイスとして操作できるようにすることになります。
cryptsetup luksOpenコマンドを実行することで暗号化しているディスクデバイスを復号化しつつ、デバイスマッパー名を付けているというイメージになります。復号化する際にパスフレーズを求められます。
今回はデバイスマッパー名をmy_encrypted_volumeとしています。
デバイスマッパー名を付けた後、lsblkコマンドの出力が変わっており、また/dev/mapper/配下に名付けたマッパー名が存在することを確認します。
root@LPIC303:~# cryptsetup luksOpen /dev/sdb my_encrypted_volume
Enter passphrase for /dev/sdb:(passwordと入力)
root@LPIC303:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /snap/snapd/21759
loop1 squashfs 4.0 0 100% /snap/core20/2318
loop2 squashfs 4.0 0 100% /snap/lxd/29351
sda
sda1
sda2 ext4 1.0 0e713afc-17be-4cea-ad81-f41c2fdbae01 20G 13% /
sdb crypto_LUKS 2 ce6f2802-93cd-43ce-8723-bd1edabd2a8f
my_encrypted_volume
sr0
root@LPIC303:~# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 236 1月 25 22:43 control
lrwxrwxrwx 1 root root 7 1月 25 23:04 my_encrypted_volume -> ../dm-0
この次に、このデバイスマッパーを引数にファイルシステムを作成していきます。
ファイルシステム作成後、lsblkコマンドを実行しFSTYPEのところにファイルシステムを作成した際に指定したext4が出力されていることを確認します。
root@LPIC303:~# mkfs -t ext4 /dev/mapper/my_encrypted_volume
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 258048 4k blocks and 64512 inodes
Filesystem UUID: b1bc55da-2ea4-4789-8325-65eebbd72ded
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
root@LPIC303:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 squashfs 4.0 0 100% /snap/snapd/21759
loop1 squashfs 4.0 0 100% /snap/core20/2318
loop2 squashfs 4.0 0 100% /snap/lxd/29351
sda
sda1
sda2 ext4 1.0 0e713afc-17be-4cea-ad81-f41c2fdbae01 20G 13% /
sdb crypto_LUKS 2 ce6f2802-93cd-43ce-8723-bd1edabd2a8f
my_encrypted_volume ext4 1.0 b1bc55da-2ea4-4789-8325-65eebbd72ded
sr0
最後に、このファイルシステムをマウントして使用できるようにしていきます。
mount デバイスマッパー名 マウントポイントです。
root@LPIC303:~# mkdir /mnt/my_encrypted_volume
root@LPIC303:~# mount /dev/mapper/my_encrypted_volume /mnt/my_encrypted_volume/
アンマウントする際は以下のように行います。
アンマウント後、cryptsetup luksCloseを実行して、ディスクデバイスを暗号化することを忘れないようにしましょう。これをしていないと閲覧されてしまいます。
root@LPIC303:~# umount /mnt/my_encrypted_volume
root@LPIC303:~# cryptsetup luksClose my_encrypted_volume
root@LPIC303:~# ls /dev/mapper/
control
この時のイメージです。
ディスクデバイスを暗号化していることで、その中に存在するファイルシステム(ないしそこに存在するファイル等)が暗号化されているという事ですね。
ディスクデバイスを暗号化せずに、ファイルシステムを暗号化する方法もありますが、それはそのうち。