Protecting Data with LUKS and NBDE —— 使用 LUKS 和 NBDE 保护数据
本文是 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 # 清除实验环境