Protecting Data with LUKS and NBDE —— 使用 LUKS 和 NBDE 保护数据

2023-03-16
2023-03-18
4 min read
Hits

  本文是 RHCSS 培训课程第三节课的内容,博主结合红帽官方英文教材《RH415-RHEL7.5 Protecting Data with LUKS and NBDE》和红帽讲师翻译的中文教材《第三章 使用 LUKS 和 NBDE 保护数据》整理了如下笔记。

几行代码

(sudo)grep -i Ciphers /etc/ssh/sshd-config     # 查看可供协商的加密方式
ansible SERVERS -m file -a "path=/var/www/html/custom.html" state = absent     # 用 Ansible 删文件
sudo virsh console serverb     # 将 kvm 串行口信息打印出来
touch crypt-sec     # 创建文件用于存放密码
echo "……" > crypt-sec     # 将密码存入该文件
partprobe /dev/vdb     # 更新 kernal 中的 vdb

几个知识点

服务器安装 openssh 后,会在 /etc/ssh 目录下生成四到五对 host 密钥

~/.ssh/known_hosts 存放已信任的 hosts 公钥,当迁移或者克隆虚拟机后,host 密钥可能会变更,这时就需要从这个文件中删除对应的 host 公钥

Linux Kernal 2.6 之前不支持 LUKS,现在自研国产化系统都在研究 kernal 0.11、0.12

加入中间层(devicemapper)完成逻辑地址到线性地址的转换

MiB 是 1024 进制,MB 是 1000 进制

/sys 是真正的设备目录,PCI 总线上注册的设备都有,/dev 是逻辑设备目录

shell 中“*”代表匹配“n”个字符,用于 echo 时会忽略后面内容

硬盘分区

lsblk     # 查看硬盘
parted /dev/vdb print     # 通过 unrecognised disk label 查看硬盘是否被使用过,但是不一定准确
parted -s /dev/vdb mklabel gpt     # 给硬盘加上 gpt 标签
parted -s /dev/vdb mkpart p1 2048s 201MiB     # 给 /dev/vdb 磁盘分出 200M 分区,分区名为 p1,前端预留 1M 以改善硬盘寻址
parted -s /dev/vdb mkpart p2 201MiB 501MiB     # 给 /dev/vdb 磁盘分出 500M 分区,分区名为 p2,前端预留出 p1 分区的位置
parted /dev/vdb unit MiB print     # 查看 vdb 硬盘分区,加上“unit MiB”统一使用 MiB 作为单位

LVM

pvcreate /dev/vdb{1,2}     # 将新创建的分区标记为物理卷
vgcreate vgdata /dev/vdb{1,2}     # 创建卷组 vgdata
lvcreate -L 350M vgdata -n lvdata1     # 将 vgdata 分出 350M 给新的逻辑卷 lvdata1
lvdisplay /dev/mapper/vgdata-lvdata1     # 显示逻辑卷属性
lvs     # 查看逻辑卷
vgs     # 查看卷组
pvs     # 查看物理卷

LUKS(Linux Unified Key Setup)

设置 LUKS 加密需要重新格式化设备上的文件系统,且每次系统引导时都需要手动输入密文

cryptsetup luksFromat /dev/mapper/vgdata-lvdata1     # (不指定密钥槽)对块进行加密
blkid     # 查看块 ID 和块是否加密:TYPE = crypto_LUKS
cryptsetup luksDump /dev/mapper/vgdata-lvdata1     # 可以查看 key slot 密钥槽位,为了防止遗忘密码,LUKS 支持八个密钥槽位
cryptsetup luksAddKey --key -slot 5 / dev/mapper/vgdata-lvdata1     # 指定第五个密钥槽为已加密的设备添加新的密文
cryptsetup luksOpen /dev/mapper/vgdata-lvdata1 crypt1     # 手动打开 LUKS 加密分区,并将其映射至 /dev/mapper 中的逻辑设备
mkfs.ext4 /dev/mapper/crypt1     # 将加密块 crypt1 格式化为 ext4 格式,此操作只需第一次使用时进行。注意此命令会抹除该加密块上的所有数据!
mkdir /mnt/crypt1     # 建立一个挂载点
mount /dev/mapper/crypt1 /mnt/crypt1     # 挂载加密块 crypt1 至 /mnt/crypt1
df -Th | grep crypt1     # 查看加密块 crypt1 磁盘空间
unmount /mnt/crypt1     # 卸载加密块
cryptsetup luksClose crypt1     # 将逻辑设备映射器与 LUKS 加密设备取消映射
cryptsetup --help     # 查看 cryptsetup 用法
cryptsetup luksRemoveKey --key -slot 5 /dev/mapper/vgdata-lvdata1     # 删除五号槽位的 key

NBDE(Network-Bound Disk Encryption)

使用 LUKS 加密的设备实现永久挂载,需在 /etc/fstab 中定义外,还需在 /etc/crypttab 中定义,否则无法在系统引导时在控制台输入密文,而进入紧急模式!

[student@workstation ~]$ lab luks-nbde setup     # 实验环境准备
[student@workstation ~]$ ssh student@serverb     # 使用 ssh 登陆 serverb 的 student 账户
[student@serverb ~]$ sudo yum install -y tang     # 安装 tang 软件包
[student@serverb ~]$ sudo systemctl enable tangd.socket --now     # 激活 tangd 服务 socket 并设置开机自启
[student@serverb ~]$ sudo firewall-cmd --zone=public --add-service=http --permanent     # 防火墙放通 Tang 服务器所需的 http(80/TCP)端口
[student@serverb ~]$ sudo firewall-cmd --reload     # 重启防火墙
[student@serverb ~]$ logout     # 退出 serverb 返回至 workstation
[student@workstation ~]$ cd ~/RH415/labs/luks-nbde     # 切换至 /home/student/RH415/labs/luks-nbde 目录
[sutdent@workstation luks-node]$ ansible-playbook install_tang.yml     # 使用 Ansible 在 serverb、serverc、serverd 上配置 Tang 服务器
[sutdent@workstation luks-node]$ ssh student@servera     # 使用 ssh 登陆 servera 的 student 账户
[student@servera ~]$ sudo -i     # 提权至 root
[root@servera ~]# yum install clevis clevis-luks clevis-dracut     # 安装 clevis、clevis-luks 和 clevis-dracut 软件包以配置具有 LUKS 支持的 Clevis 框架
[root@servera ~]# cfg=$'{"t":3,"pins":{"tang":[\n     # 此处的"t":3 意为三台 Tang 服务器都可用才能自动解密,如改为 2 则只要两台服务器可用就能自动解密
> {"url":"http://serverb.lab.example.com"},\n
> {"url":"http://serverc.lab.example.com"},\n
> {"url":"http://serverd.lab.example.com"}]}}'     # 配置三台 Tang 服务器(可至 workstation 的 /home/student/RH415/labs/luks-nbde/tang-conf.txt 复制此命令)
[root@servera ~]# clevis luks bind -d /dev/vdb1 sss "$cfg"     # 将 /dev/vdb1 设备绑定至 SSS 策略,该策略定义了三个 Tang 服务器
[root@servera ~]# systemctl enable clevis-luks-askpass.path     # 启用 clevis-luks-askpass.path 以防止非根分区被提示输入密码
[root@servera ~]# vi /etc/crypttab     # 输入如下一行并保存
encryptedvdb1     /dev/vdb1     none     _netdev
[root@servera ~]# vi /etc/fstab     # 输入如下一行并保存
/dev/mapper/encryptedvdb1   /encrypted   xfs   _netdev   1   2
[root@servera ~]# logout     # 退出 servera 的 root 账户,返回至 student 账户
[student@servera ~]# logout     # 退出 servera 返回至 workstation
[student@workstation ]$ ssh student@serverb     # 使用 ssh 登陆 serverb 的 student 账户
[student@serverb ]$ sudo systemctl disable tangd.socket --now     # 禁用 tangd 服务,并在 Fonundation 中尝试重启 servera
[student@serverb ]$ sudo virsh console servera     # 将 servera 串行口信息打印出来,需要手动输入 LUKS 密码(因为 serverb 未运行 tangd 服务,所以配置了三台 Tang 服务器,实际现在只有 serverc、serverd 两台可用)

NBDE 更换 Tang 服务器密钥

[student@serverb ]$ sudo -i     # 提权至 root
[root@serverb ~]# cd /var/db/tang     # 切换至存放 Tang server key 的目录 /var/db/tang
[root@serverb tang]# jose jwk gen -i '{"alg":"ES512"}' -o signature.jwk     # 生成新密钥
[root@serverb tang]# jose jwk gen -i '{"alg":"ECMR"}' -o exchange.jwk     # 生成新密钥
[root@serverb tang]# mv gxB7oqYiEu3zrLayhymtD10sV9E.jwk .gxB7oqYiEu3zrLayhymtD10sV9E.jwk     # 在旧密钥前添加“.”隐藏旧密钥
[root@serverb tang]# mv k25k6PbmgUu-pWWUb210xgBelhfQ.jwk .k25k6PbmgUu-pWWUb210xgBelhfQ.jwk     # 在旧密钥前添加“.”隐藏旧密钥
[root@serverb tang]# logout     # 退出 serverb 的 root 账户,返回至 student 账户
[student@serverb ~]$ logout     # 退出 serverb 返回至 workstation
[student@workstation ~]$ lab luks-nbde cleanup     # 清除实验环境
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.