Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法

Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法

原文链接:https://ovea-y.cn/ubuntu_mutli_disk_luks_full_encrypt_and_auto_unlock/

简介

大家都知道,Linux现在用Luks全盘加密一直有一个痛点,就是每次开机都需要输入解密硬盘的密码,之后又要输入用户密码,非常的麻烦!本文正是为了解决这个问题诞生的!
本文多硬盘加密带来的效果是,当你的硬盘被拔出,其他人试图拿到数据时必须需要密码。而硬盘如果一直留在原来的主机中,且硬件没有发生大的变化,则不需要密码即可自动解密硬盘开机。
密钥验证逻辑链路如下:
使用TPM芯片验证当前环境是否可信,如果可信的话,则释放密钥给系统硬盘。系统启动后会释放其他硬盘的密钥来进行解锁。
其中任何一个链路被破坏,都将无法再自动解锁,必须输入密码。(其实这里有个可改进的地方,如果System Storage不是通过TPM解锁的,则销毁解密其他存储器的密钥)

Flowchart

1. 在安装Ubuntu的时候,进行仅对根目录进行加密

Pasted image 20231112151503
Pasted image 20231112151514
Pasted image 20231112151521

2. 设置根目录在开机时通过tpm 2.0硬件自动解密

安装所需工具

sudo apt install clevis clevis-tpm2 clevis-luks clevis-udisks2 clevis-systemd clevis-initramfs 

更新tpm权限

sudo udevadm trigger

查看tpm可用的槽位

sudo tpm2_pcrread

Pasted image 20231112151544

PCR Use
0 Core System Firmware executable code (aka Firmware)
1 Core System Firmware data (aka UEFI settings)
2 Extended or pluggable executable code
3 Extended or pluggable firmware data
4 Boot Manager
5 GPT/Partition Table
6 Resume from S4 and S5 Power State Events
7 Secure Boot State
8 Hash of the kernel command line
9-10 Reserved for Future Use
11 BitLocker Access Control
12 Data events and highly volatile events
13 Boot Module Details
14 Boot Authorities
15-23 Reserved for Future Use

上面的表格中说明了TPM芯片各槽位的作用。

根据槽位的作用,我们最好选择PCR7作为密钥存储的位置。对于PC来说,我们也可以选择0和1作为存储位置(UEFI相关的用途)。我们选择安全性更高的SHA256作为启动密钥。

将TPM密钥与LUKS分区关联

首先执行lsblk查看当前根目录所在分区
Pasted image 20231112151555

此处可以发现是nvme0n1p3

将密钥用于根luks分区解密,执行下面这个指令后,需要输入挂在nvme0n1p3 luks分区所需密码,之后会自动进行配置

sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,1,7"}'

需要注意的是,TPM只能和一个系统分区关联!和Windows的Bitloader一样!所以别想着所有硬盘都通过这种方式来自动解密了!其他硬盘我们将会通过其他方式来自动解密!

更新initramfs

sudo update-initramfs -u -k 'all'

然后就结束了,重启测试一下是否还需要输入密码解锁加密硬盘吧

3. 处理其他硬盘,设置加密并且打开格式化

查看还未处理的硬盘

Pasted image 20231112151627

可以看到sda和sdb还没有处理,之后我们就会对它们进行处理

创建加密分区

sudo cryptsetup luksFormat /dev/sda
sudo cryptsetup luksFormat /dev/sdb

是否覆盖那里,需要输入大写的YES,然后就是输入密码。

Pasted image 20231112151639

处理后执行lsblk看看

Pasted image 20231112151649

打开加密分区(打开后映射出的虚拟设备会放在/dev/mapper/[映射名称])

# sudo cryptsetup --allow-discards luksOpen [加密的part path] [映射名称]
sudo cryptsetup --allow-discards luksOpen /dev/sda AndroidCodes
sudo cryptsetup --allow-discards luksOpen /dev/sdb Store

--allow-discards是为luks的打开参数,允许trim

执行完成后,lsblk看看打开的状态
Pasted image 20231112151721

格式化加密分区映射出的虚拟设备为Ext4

也可以是其他文件系统,按照大家的喜好来

# sudo mkfs.ext4 /dev/mapper/[映射名称]
sudo mkfs.ext4 /dev/mapper/Store
sudo mkfs.ext4 /dev/mapper/AndroidCodes

创建挂载点,并挂载

sudo mkdir /AndroidCodes
sudo mkdir /Store
sudo mount /dev/mapper/Store /Store
sudo mount /dev/mapper/AndroidCodes /AndroidCodes

Pasted image 20231112151731

修改挂载点权限

sudo chown miovea /Store
sudo chown miovea /AndroidCodes
sudo chgrp miovea /Store
sudo chgrp miovea /AndroidCodes

到这里就完成了,但是每次开机都需要手动打开加密分区,再挂载非常麻烦,所以我们打算开机自动运行挂载脚本。

  1. 编写开机自动解密脚本

sudo apt install vim
sudo passwd
su
vim /mountall.sh
chmod +x /mountall.sh

mountall.sh内容如下

echo [加密密码] | cryptsetup --allow-discards luksOpen /dev/sda AndroidCodes
echo [加密密码] | cryptsetup --allow-discards luksOpen /dev/sdb Store
mount /dev/mapper/Store /Store
mount /dev/mapper/AndroidCodes /AndroidCodes

5. 设定开机自动运行脚本

su
crontab -e

第一次使用会让你选择一个合适的编辑器

@reboot 在crontab的功能是在启动时执行的

后面的两行是为了在每天凌晨3点自动对存储器发送trim指令,因为自带的fstrim.service仅能对fstab或crypttab中带有discard的存储器自动发trim指令(毕竟我们不是立即挂载,所以没有把其他的存储器信息写在fstab或crypttab中,这个服务也不知道它们也需要)

记录内容为

@reboot /mountall.sh
0 3 * * * /usr/sbin/fstrim /AndroidCodes
0 3 * * * /usr/sbin/fstrim /Store

关于trim

由于叠瓦式机械硬盘和SSD都带有FTL层来存储逻辑数据位置,实际存储位置和逻辑位置并不相同,当我们格式化分区或者删除文件的时候,只是修改了元数据而已,而这些数据占一个分区或者一个文件大小来说是微乎其微的!其他数据虽然已经都不需要了,可是由于FTL层的存在,存储器只能认为刚才所谓的格式化或删除操作,只是在某个逻辑地址写了了一些数据,其他逻辑地址的数据都还需要,所以存储器并不会清空FTL层数据和实际的存储空间。

当操作系统写入数据到已经使用过的逻辑地址上时,存储器则需要临时去清除这块逻辑地址的空间,然后再存放数据,这样需要花费很长的时间!等到FTL的逻辑地址几乎消耗殆尽后,操作系统有更大的概率将数据写入到已经使用过的逻辑地址上,这也是存储器开始掉速的原因!

trim指令则是通过一种方式,告知存储器现在哪些逻辑地址还在使用,哪些不再使用了,这样存储器就会清除FTL表相关的逻辑地址,它们对应的存储空间也会立刻被混淆处理(防止数据泄露),空闲时再回收,下次存储器就可以直接使用了而无需再临时清除数据后再写入数据。

然后重启看看吧!之后如果需要在这些加密分区进行操作(比如挂载swap),都在mountall.sh中追加指令即可!
Pasted image 20231112151756

之后确认corntab是否正常运作的方法

cat /var/log/syslog | grep -w 'cron'

原文链接:https://ovea-y.cn/ubuntu_mutli_disk_luks_full_encrypt_and_auto_unlock/

End of Document

废弃内容

添加trim优化参数 绝对不能在这里添加!这里会在开机时自动挂载,这样就要输入密码了!我们通过--allow-discards参数来优化!

查看需要添加trim优化的分区UUID

sudo blkid

Pasted image 20231112151807

我这里需要的是/dev/sda和/dev/sdb的UUID

写入LUKS参数

sudo vim /etc/crypttab

内容如下

[映射名称] UUID=[打开前设备的UUID] none [参数]

nvme0n1p3_crypt UUID=0828f962-41b1-444d-a15e-66711659fe09 none luks,discard
AndroidCodes UUID=aee14e15-eb87-4141-995b-571fbbfb8f95 none luks,discard
Store UUID=eca7ad9e-3cd7-498b-af57-4337854c5e11 none luks,discard

Read more

香港银行开户指南

香港银行开户指南

注意:本文所有内容,都是需要前往香港的情况下才能使用! 本文主要介绍2家实体银行和3家虚拟银行! 实体银行包含: * 中国银行(香港) * 汇丰银行(香港),该银行也被称为“香港上海汇丰银行” 虚拟银行包含: * 众安银行 * 天星银行 * 蚂蚁银行 1、各银行所需资料和办理方式 银行名称 办理方式 所需材料 & 要求 备注 汇丰银行(香港) 提前预约,线下到营业点办理 (如果没预约,只能很早排队取线下号,不一定能取到) 必备证件: 1. 港澳通行证 2. 入境海关小票 3. 身份证 投资证明: 1. 证券App近三月股票交割单 2. 中国结算近三月交割单 3. 银行近三月流水单 4. 支付宝投资流水 资产证明: 1. 银行资产证明 2.

By 夕元
C++协程(Coroutines)

C++协程(Coroutines)

原文链接:https://ovea-y.cn/cpp_coroutine_20/ C++协程(Coroutines) 1. 简单介绍协程 协程可以简单的理解为,它是一个可以随时“中断”,并再次恢复执行的函数。 C++协程框架的特点: * 无栈协程 * 非对称设计(开发者可以自行设计协程调度器,做成对称设计) 2. 协程和函数的区别 函数:函数调用是线性、同步、一次性的执行模式,调用者必须等待被调用方法执行完成后返回。 协程:协程可以异步执行,调用者不需要等待协程完成,可以在协程挂起时继续做其他事情。在执行过程中通过特定的语法(co__yield_和_co__await)暂停执行,并在之后的某个时刻恢复执行。 2.1 普通函数的执行过程 一个普通函数在执行的时候,主要包含两个操作,分别是调用(call)和返回(return)

By 夕元
GitHub Workflows

GitHub Workflows

原文链接:https://ovea-y.cn/github_workflows/ 本文介绍GitHub工作流的创建和作用。 工作流创建方式 在git项目下,创建.github/workflows文件夹,里面编写的任何yml文件都是工作流的一部分。 secrets的创建方式 secrets.GITHUB_TOKEN是GitHub自动创建的,不需要自己创建。 secrets.SERVER_HOST这个的来源,需要在GitHub对应的项目的设置中设置。 readme的构建标签 配置好Branch、Event类型后,把下面这段内容复制到markdown文档里,就会自动显示自动化流程状态了。其实就是一张图片,由GitHub自动生成提供。 一. 自动构建网站并推送到远程服务器 自动构建hugo,并更新远程服务器的静态网站内容。 自动化流程文件 name: Deploy Hugo Site # 当推送到main分支时触发部署流程 on: push: branches: - main

By 夕元
代码版本管理工具(git/gerrit/repo)

代码版本管理工具(git/gerrit/repo)

原文链接:https://ovea-y.cn/code_version_control_tools__git_gerrit_repo/ 一、版本控制工具的历史 1.1 版本控制雏形 在版本控制软件出现之前,就具备diff与patch工具来对源码进行比较和打补丁了,在CVS出来的一段时间里,Linus一直在使用diff与patch工具管理着Linux的代码。diff与patch也是源码版本控制中最基本的概念。 1.1.1 diff —— 用于比较两个文件或目录之间的差异 -u 表示使用 unified 格式 -r 表示比较目录 -N 表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中 diff -urN a.c b.c > c.patch 1.1.2 patch —— 用于应用差异修改 通过patch可以将原始文件变成目标文件,

By 夕元