【2024年02月版】Linuxでディスク暗号化・LUKS・cryptsetup【初心者向け】

# はじめに

Linuxで暗号化を行いたい。 `LUKS` か `eCryptfs` が使われる。
今回は、`LUKS` を用いて、ディスクの暗号化と復号化の手順をメモ。

# 環境

- macOS上のPrallelsのUbuntu22.04

```terminal
$ uname -a
Linux ubuntu03 5.15.0-94-generic #104-Ubuntu SMP Tue Jan 9 15:26:57 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
```

- ディスク構成は、HDD2台で、1台はOS、もう1台が今回暗号化するディスク(`/dev/sdb`)

```terminal
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk 
├─sda1        8:1    0     1G  0 part /boot/efi
├─sda2        8:2    0     2G  0 part /boot
└─sda3        8:3    0  60.9G  0 part 
  └─vg0-lv0 253:0    0  60.9G  0 lvm  /
sdb           8:16   0     2G  0 disk 
```

- マウント先は、`/mnt/crypt` とする

# 手順

## マウント先の作成

```terminal
$ sudo mkdir -p /mnt/crypt
```

## 暗号化

### ディスクを丸ごと暗号化

- `YES` を大文字で入力する
- 暗号化のパスフレーズを入力する

```terminal
$ sudo 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: 
Verify passphrase: 
```

- 暗号化してもブロックデバイスとしてはぱっと見の変化なし

```
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk 
├─sda1        8:1    0     1G  0 part /boot/efi
├─sda2        8:2    0     2G  0 part /boot
└─sda3        8:3    0  60.9G  0 part 
  └─vg0-lv0 253:0    0  60.9G  0 lvm  /
sdb           8:16   0     2G  0 disk 
```

### ディスクを復号化してマッピング
  - 暗号化でつかったパスフレーズを入力する
  - マッピング名を指定する、今回は `cryptdisk` がマッピング名
  - `/dev/mapper/cryptdisk` にマッピングされる

```
$ sudo cryptsetup open /dev/sdb cryptdisk
Enter passphrase for /dev/sdb: 
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt 
$ ll /dev/mapper
total 0
  :
  :
lrwxrwxrwx  1 root root       7 Feb 11 01:38 cryptdisk -> ../dm-1
lrwxrwxrwx  1 root root       7 Feb 11 01:22 vg0-lv0 -> ../dm-0
```

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

```terminal
$ sudo mkfs.ext4 /dev/mapper/cryptdisk 
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 520192 4k blocks and 130048 inodes
Filesystem UUID: e5731e7a-14f3-4e23-a31d-bb264b1d37ed
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
```

### マウント

```terminal
$ sudo mount /dev/mapper/cryptdisk /mnt/crypt
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt /mnt/crypt
$ df -h
Filesystem             Size  Used Avail Use% Mounted on
  :
  :
/dev/mapper/vg0-lv0     60G  5.7G   51G  11% /
/dev/sda2              2.0G  250M  1.6G  14% /boot
/dev/sda1              1.1G  6.4M  1.1G   1% /boot/efi
/dev/mapper/cryptdisk  2.0G   24K  1.9G   1% /mnt/crypt
```

### テストファイルの書き込み

- 1GBのテストファイルを書き込む

```terminal
$ cd /mnt/crypt/
$ sudo dd if=/dev/random of=./test.dat bs=1M count=1024 status=progress
964689920 bytes (965 MB, 920 MiB) copied, 2 s, 482 MB/s
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.24187 s, 479 MB/s
dev@ubuntu03:/mnt/crypt$ ls -alht
total 1.1G
-rw-r--r-- 1 root root 1.0G Feb 11 02:14 test.dat
drwxr-xr-x 3 root root 4.0K Feb 11 02:14 .
drwx------ 2 root root  16K Feb 11 01:55 lost+found
drwxr-xr-x 3 root root 4.0K Feb 11 01:54 ..
```

### テストファイルのハッシュの採取

```terminal
$ md5sum test.dat 
ca12c1a7e0b7c805e01f13d93ffea3ea  test.dat
```

### マッピングの解除

- マウント解除し、その後、マッピング解除する
- マウントしていると close できないので注意

```terminal
$ sudo cryptsetup close cryptdisk
Device cryptdisk is still in use.
```

- マウント解除前の状況

```terminal
$ df -h
Filesystem             Size  Used Avail Use% Mounted on
  :
  :
/dev/mapper/vg0-lv0     60G  5.7G   51G  11% /
/dev/sda2              2.0G  250M  1.6G  14% /boot
/dev/sda1              1.1G  6.4M  1.1G   1% /boot/efi
/dev/mapper/cryptdisk  2.0G  1.1G  821M  56% /mnt/crypt
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt /mnt/crypt
```

- マウント解除

```
$ sudo umount /dev/mapper/cryptdisk
```

- マウント解除後の状況

```terminal
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt 
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
  :
  :
/dev/mapper/vg0-lv0   60G  5.7G   51G  11% /
/dev/sda2            2.0G  250M  1.6G  14% /boot
/dev/sda1            1.1G  6.4M  1.1G   1% /boot/efi
```

- マッピングの解除

```terminal
$ sudo cryptsetup close cryptdisk
```

- マッピング解除後の状況

```terminal
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk 
├─sda1        8:1    0     1G  0 part /boot/efi
├─sda2        8:2    0     2G  0 part /boot
└─sda3        8:3    0  60.9G  0 part 
  └─vg0-lv0 253:0    0  60.9G  0 lvm  /
sdb           8:16   0     2G  0 disk 
```

## 復号化

### ディスクを丸ごと復号化

```terminal
$ sudo cryptsetup open /dev/sdb cryptdisk
Enter passphrase for /dev/sdb: 
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt 
```

### マウント

```terminal
$ sudo mount /dev/mapper/cryptdisk /mnt/crypt
$ df -h
Filesystem             Size  Used Avail Use% Mounted on
  :
  :
/dev/mapper/vg0-lv0     60G  5.7G   51G  11% /
/dev/sda2              2.0G  250M  1.6G  14% /boot
/dev/sda1              1.1G  6.4M  1.1G   1% /boot/efi
/dev/mapper/cryptdisk  2.0G  1.1G  821M  56% /mnt/crypt
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
  :
  :
sda           8:0    0    64G  0 disk  
├─sda1        8:1    0     1G  0 part  /boot/efi
├─sda2        8:2    0     2G  0 part  /boot
└─sda3        8:3    0  60.9G  0 part  
  └─vg0-lv0 253:0    0  60.9G  0 lvm   /
sdb           8:16   0     2G  0 disk  
└─cryptdisk 253:1    0     2G  0 crypt /mnt/crypt
$ cd /mnt/crypt
$ ls -alth
total 1.1G
-rw-r--r-- 1 root root 1.0G Feb 11 02:14 test.dat
drwxr-xr-x 3 root root 4.0K Feb 11 02:14 .
drwx------ 2 root root  16K Feb 11 01:55 lost+found
drwxr-xr-x 3 root root 4.0K Feb 11 01:54 ..
```

### テストファイルのハッシュの比較

- `md5` が `ca12c1a7e0b7c805e01f13d93ffea3ea` かどうか確認する

```terminal
$ md5sum test.dat 
ca12c1a7e0b7c805e01f13d93ffea3ea  test.dat
```

# さいごに

かんたんでしたね

# 参考リンク

- [man page cryptsetup](https://man7.org/linux/man-pages/man8/cryptsetup.8.html)
- [ubuntu manual cryptsetup](https://manpages.ubuntu.com/manpages/jammy/en/man8/cryptsetup.8.html)