Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法
简介
大家都知道,Linux现在用Luks全盘加密一直有一个痛点,就是每次开机都需要输入解密硬盘的密码,之后又要输入用户密码,非常的麻烦!本文正是为了解决这个问题诞生的!
本文多硬盘加密带来的效果是,当你的硬盘被拔出,其他人试图拿到数据时必须需要密码。而硬盘如果一直留在原来的主机中,且硬件没有发生大的变化,则不需要密码即可自动解密硬盘开机。
密钥验证逻辑链路如下:
使用TPM芯片验证当前环境是否可行,如果可信的话,则释放密钥给系统硬盘。系统启动后会释放其他硬盘的密钥来进行解锁。
其中任何一个链路被破坏,都将无法再自动解锁,必须输入密码。(其实这里有个可改进的地方,如果System Storage不是通过TPM解锁的,则销毁解密其他存储器的密钥)
- 在安装Ubuntu的时候,进行仅对根目录进行加密
- 设置根目录在开机时通过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
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查看当前根目录所在分区
此处可以发现是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'
然后就结束了,重启测试一下是否还需要输入密码解锁加密硬盘吧
- 处理其他硬盘,设置加密并且打开格式化
查看还未处理的硬盘
可以看到sda和sdb还没有处理,之后我们就会对它们进行处理
创建加密分区
sudo cryptsetup luksFormat /dev/sda
sudo cryptsetup luksFormat /dev/sdb
是否覆盖那里,需要输入大写的YES,然后就是输入密码。
处理后执行lsblk看看
打开加密分区(打开后映射出的虚拟设备会放在/dev/mapper/[映射名称])
# sudo cryptsetup luksOpen [加密的part path] [映射名称]
sudo cryptsetup --allow-discards luksOpen /dev/sda AndroidCodes
sudo cryptsetup --allow-discards luksOpen /dev/sdb Store
--allow-discards是为luks的打开参数,允许trim
执行完成后,lsblk看看打开的状态
格式化加密分区映射出的虚拟设备为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
修改挂载点权限
sudo chown miovea /Store
sudo chown miovea /AndroidCodes
sudo chgrp miovea /Store
sudo chgrp miovea /AndroidCodes
到这里就完成了,但是每次开机都需要手动打开加密分区,再挂载非常麻烦,所以我们打算开机自动运行挂载脚本。
- 编写开机自动解密脚本
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
- 设定开机自动运行脚本
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中追加指令即可!
End of Document
Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法相关推荐
- kal8linux密码,KAL1 LINUX 官方文档之arm上的ka1i---树莓派全盘加密
以下文档尚不可用.在以下链接中关注状态:https://gitlab.com/ka1ilinux/documentation/ka1i-docs/issues/49 译者注:以下文章有操作有问题,因此 ...
- 自动解锁Bitlocker加密硬盘
自动解锁Bitlocker加密硬盘有两种方式,一种是将系统盘也加密,然后数据盘启动自动解锁.但是系统盘加密会降低系统运行速度,还是比较明显的. 第二种方式就是编写程序,开机后启动程序或者开机自动运行, ...
- 固态硬盘硬件全盘加密机制绕过漏洞论文分析(Self-Encrypting Deception: Weaknesses in the Encryption of Solid State Drives)
论文传送门:<Self-Encrypting Deception: Weaknesses in the Encryption of Solid State Drives> 本文内容: 一. ...
- luks linux 加密磁盘,用luks方式对磁盘进行加密以及加密磁盘的自动挂载
1.关于luks加密 LUKS(Linux Unified Key Setup)为Linux硬盘分区加密提供了一种标准,它不仅能通用于不同的 Linux发行版本,还支持多用户/口令.因为它的加密密钥独 ...
- 装完linux硬盘有密码吗,deepin 15.11安装过程中全盘安装/全盘加密后查看磁盘信息...
在安装深度deepin 15.11系统过程中,可以选择全盘安装/全盘加密,可参考安装深度Deepin 15.11操作系统的方法,在安装完后,可以查看磁盘信息,以下为你分享. 全盘加密安装后查看磁盘信息 ...
- linux如何更改密钥环密码,Linux系统教程:Ubuntu桌面上禁用默认的密钥环解锁提示...
问题:当我启动我的Ubuntu桌面时,出现了一个弹出对话框,要求我输入密码来解锁默认的密钥环.我怎样才能禁用这个"解锁默认密钥环"弹出窗口,并自动解锁我的密钥环? 密钥环是一个以加 ...
- Android加密之全盘加密详解
前言 Android 的安全性问题一直备受关注,Google 在 Android 系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统. 在 Android 的安全性方面,有很多模 ...
- Android加密之全盘加密(FDE)
全盘加密 注意:搭载 Android 7.0 - 9 的设备支持全盘加密.搭载 Android 10 及更高版本的新设备必须使用文件级加密. 全盘加密是使用密钥(密钥本身也经过加密)对 Android ...
- 黑客词典:什么是全盘加密
近日,Android系统被曝新漏洞,可导致全盘加密功能 (Full Disk Encryption) 被暴力破解.没有尽快升级的用户都有可能受到影响. "暴力破解" 就是用穷举法来 ...
最新文章
- 如果有电脑——计算机达人成长之路(36)
- 工具库 --- Validator (JS正则)
- EXPLAIN PLAN获取SQL语句执行计划
- linux 批量处理 dos2unix
- 第三章计算机试题,计算机等级考试二级VB测试题(第三章)
- LeetCode 1707. 与数组中元素的最大异或值(Trie树)
- go 访问数据库mysql基础
- oracle-01940,ORA-01940: 无法删除当前已连接的用户的错误,该如何解决呢?
- redis安装包_Linux中安装Redis
- ansi c标准_C语言为什么需要有标准库
- Python 标准库 —— urllib(下载进度)
- python爬取网易云音乐付费音乐_python爬虫学习教程,爬取网易云音乐!
- 学习C语言编程,推荐你看这6本书
- 解决Windows10专业版无法安装语言包!!!
- 机器人主流编程语言盘点 及优缺点分析
- 关于Generator expression must be parenthesized out报错或者Error creating Django application: Error on pyt
- War3地图编辑器基础:物体编辑器F6(自定义单位+单位属性设置)
- Linux下优雅的让程序后台运行
- 央行降息楼市应声而动:购房者出现恐慌苗头
- 微信小程序—点击实现页面跳转
热门文章
- 货郎担问题(TSP问题)
- HTML5 Video播放本地文件
- python 导入的nan怎么解决_如何在Python中使用Lmfit解决NaN值错误
- Python连接MySQL insert插入语句
- ADB interface驱动安装失败解决方法
- java 线程执行结束_java中怎么判断线程执行完毕
- 安卓手机微信数据导出方法 -- adb备份(无需root)
- LoRA转4G及网关中继器工作原理
- easyUI日期框的日期范围限制
- c++语言打开文件对话框,C++采用openfilename打开文件对话框用法实例