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

news2024/11/20 8:48:30

简介

大家都知道,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis持久化——RDB机制详解

在运行情况下,Redis 以数据结构的形式将数据维持在内存中,为了让这些数据在 Redis 重启之后仍然可用,需要将数据写入持久存储 持久化是指将数据写入持久存储,例如固态磁盘(SSD) Redis 提供了一系列持久化选项。这些包括&#xff1…

Java-黑马Java学习作业-day07综合练习

学习视频链接:黑马Java学习视频 文章目录练习一:飞机票练习二:打印素数练习三:验证码练习四:复制数组练习五:评委打分练习六:数字加密练习七:数字解密练习八:抽奖解法一:…

【C++11】—— 可变参数模板

目录 一、可变参数模板概念以及定义方式 二、参数包的展开 1. 递归函数方式展开参数包 2. 逗号表达式展开参数包 三、STL容器中的empalce相关接口函数 一、可变参数模板概念以及定义方式 在c11之前,类模板和函数模板只能含有固定数量的模板参数,c11…

JavaScript高级 ES5 面向对象原型继承

原型以及ES5中实现继承1. 对象和函数的原型1. 普通对象的原型 [[prototype]]2. 函数的原型 prototype2. new、constructor1. new 操作符2. constructor属性3. 将方法放到原型上4. 创建对象的内存表现5. 重写原型对象3. 原型链的查找顺序4. 原型链实现的继承5. 借用构造函数继承…

深入URP之Shader篇10: 深度值专题(1)

之前研究Unlit shader的时候就遇到一些Z值相关的问题,一笔带过了,比如ComputeFogFactor中的UNITY_Z_0_FAR_FROM_CLIPSPACE。今天就把URP Shader中出现的Z相关的问题做一个专题一起研究下。 深度缓冲的方向和UNITY_REVERSED_Z 先说这个关于z的宏&#x…

nacos:服务注册与发现

导入SpringCloudAlibaba相关的依赖&#xff0c;并在父工程将依赖进行管理 <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-s…

Java EE|多线程代码实例之定时器与线程池

文章目录&#x1f534;定时器什么是定时器以及开发中的作用标准库中的定时器定时器的实现&#x1f534;线程池什么是线程池标准库中的线程池创建一个线程池ThreadPoolExecutor构造方法解析线程池的实现&#x1f534;定时器 什么是定时器以及开发中的作用 程序中的定时器功能与…

【互联网大厂机试真题 - 华为】九宫格

题目描述 九宫格是一款广为流传的游戏,起源于河图洛书。游戏规则是:1到9九个数字放在3x3的格子中,要求每行、每列以及两个对角线上的三数之和都等于15. 在金麻名著《射雕英雄传》中黃蓉曾给九宫格的一种解法,口诀:戴九恩一,左三右七,二四有肩,八六为足,五居中央。解法…

【云原生进阶之容器】第四章Operator原理4.3节--Operator模式

1 Operator概述 1.1 诞生背景 Kubernetes实际是期望状态管理器。先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。Kubernetes的控制平面运行在Master节点上,它包含数个controller以调和应用达到期望状态: 检查当前的…

【阶段三】Python机器学习30篇:机器学习项目实战:智能推荐系统的基本原理与计算相似度的常用方法

本篇的思维导图: 智能推荐系统模型 智能推荐系统属于非监督式学习,是机器学习一个非常重要的应用领域,它能带来的经济价值往往是直接且非常可观的。 智能推荐系统的基本原理 智能推荐系统的应用场景 互联网每天都在产生海量信息,用户行为数据呈现爆发式增长…

PyTorch - 常见神经网络

文章目录LeNetAlexNetDropoutAlexNet 网络结构torchvision中的AlexNet的实现ZFNetVGG-NetsVGG 各网络VGG-16 网络结构GoogLeNet代码实现ResNetDenseNetRNNLSTMGRULeNet 1998年&#xff0c;由 LeCun 提出用于手写数字识别任务只有5层结构&#xff1b;目前看来不输入深度学习网络…

智能售货机系统帝可得

智能售货机 概述项目使用springcloudalibaba中提供的短信服务图形验证码生成多端登录/网关统一鉴权对象存储服务代码的自动填充微服务集成emq&#xff0c;发送emq工单业务流 接收工单 拒绝工单 运维工单补货工单使用xxl-job进行任务调度lkd集成xxl-job自动创建维修工单自动…

设计模式_结构型模式 -《代理模式》

设计模式_结构型模式 -《代理模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承…

Docker 架构和安装

Docker 包括三个基本概念: 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容器&#xff08;Con…

<Linux> Linux项目自动化构建工具—makemakefile的使用

< Linux> Linux 项目自动化构建工具—make/makefile的使用 文章目录< Linux> Linux 项目自动化构建工具—make/makefile的使用一、make/makefile的背景二、如何编写 makefile1.依赖关系和依赖方法2.makefile的使用3.clean的使用4.多文件编译5.伪目标 .PHONY6.三个时…

无约束优化——线性搜索法

无约束优化——线性搜索法&#xff08;line search&#xff09;前言概述构建关于步长的函数Wolfe条件Strong Wolfe条件Zoutendijk条件后记前言 该系列为学习笔记系列&#xff0c;所有内容可以在 Numerical Optimization (2nd Edition) 中找到&#xff0c;该书十分有用经典建议…

组件封装 - Tabs组件

首先我们先来看一下 Element UI 里面的 Tabs 是怎么样的 <template><el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane label"User" name"first">User</el-tab-pa…

基于matlab的汽车牌照识别程序详细教程

设计一个基于matlab的汽车牌照识别程序&#xff0c;能够实现车牌图像预处理&#xff0c;车牌定位&#xff0c;字符分割&#xff0c;然后通过神经网络对车牌进行字符识别&#xff0c;最终从一幅图像中提取车牌中的字母和数字&#xff0c;给出文本形式的车牌号码。关键词&#xf…

C语言 一个特殊的数组【柔性数组】

文章目录前言柔性数组的特点柔性数组的使用柔性数组的优势写在最后前言 也许你从来就没有听过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但他是真的存在&#xff1b;柔性数组的概念存在于C99标准当中&#xff0c;C99标准表示&#xff1a;结构体的最后…

Linux-进程概念

目录 进程状态&#xff1a; 操作系统简图 调用进程bin.exe的详细过程 cpu运行队列的结构 R进程和阻塞进程 进程状态&#xff1a;挂起&#xff1a; Linux操作&#xff1a; ​编辑 R运行状态 S休眠状态 T暂停状态&#xff1a; kill kill -18 表示继续 kill -9 杀死进程…