目录
cryptsetup是linux下的一个分区加密工具,它通过调用内核中的"dm-crypt"来实现磁盘加密的功能。
dm-crypt的特点
dm-crypt具有如下几个特点:
- 
支持多种加密格式
 
- 
LUKS(Linux Unified Key Setup)
 
- Plain
 
- loop-AES
 
- TCRYPT
 
一般我们比较常用的是LUKS格式
- 安装简单
 
dm-crypt是整合到linux内核中的,而它的命令行前端cryptsetup,在大多数主流的linux发行版中都会自带
- 可以与LVM无缝结合
 
使用cryptsetup创建加密磁盘
创建虚拟磁盘分区
为了方便,我这里用 dd 命令创建一个文件来代替真实的磁盘分区(因为操作过程会清空整个磁盘分区的内容:()。
| Text Only | 
|---|
 | dd if=/dev/zero of=/tmp/USB.img bs=1M count=100
ls -l /tmp/USB.img
-rw-r--r-- 1 lujun9972 lujun9972 104857600 4月  12 18:13 /tmp/USB.img
  | 
 
这就创建了一个100M的文件作为虚拟磁盘分区来用。
在实际使用中,你可以用cryptsetup来对实际的磁盘分区来进行操作。
创建加密磁盘分区
虽然说dm-crypt支持多种加密格式,但最常用的还是LUKS。
创建LUKS加密盘的命令为:
| Text Only | 
|---|
 | cryptsetup [其他参数] luksFormat 设备名
  | 
 
这里常用的参数有下面几个:
加密方式
密钥长度
散列算法
迭代时间,单位为毫秒。值越大,暴力破解越难,但打开加密盘的时间也越久
这里我们直接使用默认值
| Text Only | 
|---|
 | [lujun9972@X61 ~]$ cryptsetup luksFormat /tmp/USB.img 
WARNING!
========
这将覆盖 /tmp/USB.img 上的数据,该动作不可取消。
Are you sure? (Type uppercase yes): YES
输入 /tmp/USB.img 的密码:
确认密码:
[lujun9972@X61 ~]$ 
  | 
 
执行的过程中,命令会警告你将会清除磁盘上的所有数据,并要求你输入两次密码
打开密码盘
cryptsetup可以打开前面提到的各种加密盘。
打开加密盘的命令为
| Text Only | 
|---|
 | cryptsetup open --type 加密类型 加密磁盘 映射名称
  | 
 
或者也可以写成
| Text Only | 
|---|
 | cryptsetup 加密类型Open 加密磁盘 映射名称
  | 
 
比如,我们这个案例中可以执行:
| Text Only | 
|---|
 | [lujun9972@X61 ~]$ sudo cryptsetup luksOpen /tmp/USB.img USB
[sudo] lujun9972 的密码:
输入 /tmp/USB.img 的密码:
[lujun9972@X61 ~]$ 
  | 
 
注意这里需要用到root权限。
执行该命令后就会将 /tmp/USB.img 解密,并映射成 /dev/mapper/USB
像普通磁盘分区一样操作 /dev/mapper/USB
你可以像普通磁盘一样来操作 /dev/mapper/USB.
| Text Only | 
|---|
 | sudo mkfs.ext4 /dev/mapper/USB
sudo mount /dev/mapper/USB /mnt
sudo touch /mnt/secret
ls -l /mnt/secret
  | 
 
结果为
| Text Only | 
|---|
 | Creating filesystem with 100352 1k blocks and 25168 inodes
Filesystem UUID: b1557874-a538-4ffa-9ce0-c17e8feb4b1c
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729
Allocating group tables:  0/13     done                            
Writing inode tables:  0/13     done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information:  0/13     done
-rw------- 1 root root 0 Apr 12 18:39 /mnt/secret
  | 
 
查看加密盘状态
在打开加密盘后,可以查看该加密盘的状态,语法为
同样的,由于需要初始化device mapper,因此需要root权限:
| Text Only | 
|---|
 | sudo cryptsetup status USB
  | 
 
结果为
| Text Only | 
|---|
 | /dev/mapper/USB is active and is in use.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 256 bits
  key location: dm-crypt
  device:  /dev/loop0
  loop:    /tmp/USB.img
  sector size:  512
  offset:  4096 sectors
  size:    200704 sectors
  mode:    read/write
  | 
 
关闭加密盘
操作完磁盘后,使用下面命令关闭加密盘
像这样:
| Text Only | 
|---|
 | sudo umount /mnt
sudo cryptsetup close USB
  | 
 
让加密盘使用keyfile认证
创建随机文件作为keyfile
| Text Only | 
|---|
 | dd if=/dev/urandom of=/tmp/keyfile bs=1K count=64
  | 
 
查看key slot
LUKS格式的加密盘默认能够提供8个"key slot",每个"key slot"就是一个解密的钥匙,使用任何一把钥匙都能打开这个LUKS加密盘。
相当于是能有多种解密方式。
要查看LUKS密码盘的"Key Slot",可以用下面命令:
比如
| Text Only | 
|---|
 | cryptsetup luksDump /tmp/USB.img
LUKS header information for /tmp/USB.img
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        256
MK digest:      0b 6b f3 5d fb 94 1a 8f aa c6 7e 86 d8 64 b0 0b c7 bf 7b 7d 
MK salt:        02 9b dc c3 0e 34 79 0b ab a9 44 e6 e4 ad 67 30 
                35 f1 dd cf e0 33 0c 36 bf bc 55 f1 d5 ce fb ad 
MK iterations:  70167
UUID:           e4e7cfc4-f9ae-4ed1-b65b-1b0e7b84ca7f
Key Slot 0: ENABLED
        Iterations:             1122672
        Salt:                   d2 04 39 66 d7 cb 64 6d e3 ef d9 88 c7 1c 07 b2 
                                25 00 8f bf e3 6d f1 9e 3f 31 91 c6 f0 ff 6d 75 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
  | 
 
你会发现,这个LUKS加密盘目前只使用了一个Key Slot,也就是创建盘时设置的密码
添加keyfile认证
使用下面命令为LUKS加密盘添加keyfile认证
| Text Only | 
|---|
 | cryptsetup luksAddKey 加密盘 keyfile
  | 
 
比如
| Text Only | 
|---|
 | [lujun9972@X61 ~]$ cryptsetup luksAddKey /tmp/USB.img /tmp/keyfile
输入任意已存在的密码:
[lujun9972@X61 ~]$ 
  | 
 
再查一下Key Slot:
| Text Only | 
|---|
 | cryptsetup luksDump /tmp/USB.img
LUKS header information for /tmp/USB.img
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        256
MK digest:      0b 6b f3 5d fb 94 1a 8f aa c6 7e 86 d8 64 b0 0b c7 bf 7b 7d 
MK salt:        02 9b dc c3 0e 34 79 0b ab a9 44 e6 e4 ad 67 30 
                35 f1 dd cf e0 33 0c 36 bf bc 55 f1 d5 ce fb ad 
MK iterations:  70167
UUID:           e4e7cfc4-f9ae-4ed1-b65b-1b0e7b84ca7f
Key Slot 0: ENABLED
        Iterations:             1122672
        Salt:                   d2 04 39 66 d7 cb 64 6d e3 ef d9 88 c7 1c 07 b2 
                                25 00 8f bf e3 6d f1 9e 3f 31 91 c6 f0 ff 6d 75 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             1109604
        Salt:                   38 3a 6a 76 c3 10 7c a3 1f fd e8 7c 1a 7f 4b 4f 
                                2a bf 99 6c 1c 06 11 00 59 5e ce e4 99 79 79 f7 
        Key material offset:    264
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
  | 
 
会发现启用了新的key slot
使用keyfile打开加密盘
使用keyfile打开加密盘的方式跟普通打开加密盘的方式类似,只是要多用一个 --keyfile 来指定keyfile的路径
| Text Only | 
|---|
 | sudo cryptsetup --key-file /tmp/keyfile open --type luks /tmp/USB.img USB
  | 
 
删除keyslot
使用下面命令可以删除加密盘的其中一个key slot
| Text Only | 
|---|
 | cryptsetup luksKillSlot /tmp/USB.img 0
  | 
 
再查一下Key Slot:
| Text Only | 
|---|
 | cryptsetup luksDump /tmp/USB.img
LUKS header information for /tmp/USB.img
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        256
MK digest:      0b 6b f3 5d fb 94 1a 8f aa c6 7e 86 d8 64 b0 0b c7 bf 7b 7d 
MK salt:        02 9b dc c3 0e 34 79 0b ab a9 44 e6 e4 ad 67 30 
                35 f1 dd cf e0 33 0c 36 bf bc 55 f1 d5 ce fb ad 
MK iterations:  70167
UUID:           e4e7cfc4-f9ae-4ed1-b65b-1b0e7b84ca7f
Key Slot 0: DISABLED
Key Slot 1: ENABLED
        Iterations:             1109604
        Salt:                   38 3a 6a 76 c3 10 7c a3 1f fd e8 7c 1a 7f 4b 4f 
                                2a bf 99 6c 1c 06 11 00 59 5e ce e4 99 79 79 f7 
        Key material offset:    264
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
  | 
 
会发现key slot0已经被禁用了