如何从 USB 加载 LUKS 密码,然后返回键盘?

2024-04-25

我想设置一台具有全磁盘加密功能的无头 Linux (Debian Wheezy) PC,能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘。我的起点是使用 Debian 安装程序中基本的整个磁盘加密选项进行全新安装,该安装程序将 /boot 之外的所有内容作为 LUKS 加密的逻辑卷组进行管理,并为我提供了键盘选项。我将在答案中描述我当前的解决方案,希望它有用并且其他人可以对其进行改进。

以下是我遇到的一些问题:

  • 设置密码并将其放在 USB 驱动器上。

  • 及时加载USB模块。

  • 等待 USB 驱动器被 Linux 识别,然后再尝试读取它。

  • 识别正确的 USB 驱动器(不是碰巧插入的其他驱动器)。

  • 编写“密钥脚本”以从 USB 驱动器中提取密码。

  • 确保在所有 USB 故障情况下都能恢复到键盘。

我将接受具有重大改进的答案,并对提供贡献的答案进行投票。


我的很多解决方案都来自于这篇文章,使用 USB 密钥作为 LUKS 密码 http://web.archive.org/web/20140212153345/https://binblog.info/2008/12/04/using-a-usb-key-for-the-luks-passphrase/.

  1. 创建一个随机密码:

     dd if=/dev/urandom bs=1 count=256 > passphrase
    
  2. 插入 USB 驱动器。dmesg输出将显示设备名称;认为/dev/sdd。算出它的大小:

     blockdev --getsize64 /dev/sdd
    
  3. 我决定在原始设备的末尾安装密码,认为它可以在 USB 驱动器的意外使用中幸存下来。

     dd if=passphrase of=/dev/sdd bs=1 seek=<size-256>
    
  4. 将密码添加到 LUKS 卷:

     cryptsetup luksAddKey /dev/sda5 passphrase
    

    这不会影响安装程序现有的手动输入的密码。可以删除密码文件:

     rm passphrase
    
  5. 为 USB 记忆棒找到一个唯一的名称,以便我们可以在存在时识别它:

     ls -l /dev/disk/by-id | grep -w sdd
    

    您应该看到一个符号链接。我会称之为/dev/disk/by-id/<ID>.

  6. Edit /etc/crypttab。您应该看到类似这样的行:

     sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 none luks
    

    将其修改为:

     sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 /dev/disk/by-id/<ID> luks,keyscript=/bin/passphrase-from-usb
    
  7. The keyscript上面提到的需要从USB设备读取密码。然而,它需要做的还不止这些。要了解如何使用它,请检查/usr/share/initramfs-tools/scripts/local-top/cryptroot,在启动时运行以解锁根设备的脚本。请注意,当keyscript设置后,只需运行它并将输出通过管道传输到luksOpen没有其他检查。无法发出错误信号(USB 驱动器不存在)或退回到键盘输入。如果密码失败,则密钥脚本将再次循环运行,最多运行一定次数;然而我们不知道我们正在进行哪一次迭代。此外,我们无法控制 keyscript 的运行时间,因此我们无法确定 Linux 是否已识别 USB 驱动器。

    我用一些技巧解决了这个问题:

    1. 轮询 USB 驱动器并等待 3 秒钟以使其出现。这对我有用,但我很想知道更好的方法。

    2. 创建一个虚拟文件/passphrase-from-usb-tried第一次运行时表明我们至少运行过一次。

    3. 如果我们至少运行过一次,或者找不到 USB 驱动器,请运行askpass程序使用者cryptroot用于键盘输入。

    最终脚本:

    #!/bin/sh
    
    set -e
    
    if ! [ -e /passphrase-from-usb-tried ]; then
        touch /passphrase-from-usb-tried
        if ! [ -e "$CRYPTTAB_KEY" ]; then
            echo "Waiting for USB stick to be recognized..." >&2
            sleep 3
        fi
        if [ -e "$CRYPTTAB_KEY" ]; then
            echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2
            dd if="$CRYPTTAB_KEY" bs=1 skip=129498880 count=256 2>/dev/null
            exit
        else
            echo "Can't find $CRYPTTAB_KEY; USB stick not present?" >&2
        fi
    fi
    
    /lib/cryptsetup/askpass "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: "
    

    最后,我们需要确保该脚本在 initramfs 中可用。创造/etc/initramfs-tools/hooks/passphrase-from-usb包含:

    #!/bin/sh
    
    PREREQ=""
    
    prereqs() {
            echo "$PREREQ"
    }
    
    case "$1" in
            prereqs)
                    prereqs
                    exit 0
            ;;
    esac
    
    . "${CONFDIR}/initramfs.conf"
    . /usr/share/initramfs-tools/hook-functions
    
    copy_exec /bin/passphrase-from-usb /bin
    
  8. 我的 initramfs 中不存在 USB 驱动程序。 (看起来它们在 Debian 的更高版本中是默认的。)我必须通过添加来添加它们/etc/initramfs-tools/modules:

     uhci_hcd
     ehci_hcd
     usb_storage
    
  9. 一切完成后,更新 initramfs:

     update-initramfs -u
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 USB 加载 LUKS 密码,然后返回键盘? 的相关文章

  • Linux下对多个文件进行排序

    我有多个 很多 文件 每个都非常大 file0 txt file1 txt file2 txt 我不想将它们合并到一个文件中 因为生成的文件将超过 10 场演出 每个文件中的每一行都包含一个 40 字节的字符串 现在字符串的排序相当好 大约
  • 如何让SSH命令执行超时

    我有一个这样的程序 ssh q email protected cdn cgi l email protection exit echo output value gt 在上面的代码中 我尝试通过 SSH 连接到远程服务器 并尝试检查是否可
  • 使用 .NET 类进行 OpenSSL 加密

    我希望创建一个使用与 OpenSSL 兼容的 NET 库的类 我知道有一个 OpenSSL Net 包装器 但我希望避免引用第 3 方 非托管代码 我并不是要讨论这是否是正确的选择 但这是有原因的 目前我有以下内容 我认为它应该与 Open
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • Azure Nvidia 中的 apt-update 出现公钥错误

    我在 AZURE 上启动了 NVIDIA VM 并尝试使用进行更新sudo apt update但给出错误 Hit 2 http azure archive ubuntu com ubuntu focal InRelease Hit 3 h
  • 启动jetty服务器时出现NoClassDefFoundError

    我正在尝试在码头服务器中托管我的网络应用程序 spring 我将 war 文件复制到 jetty 服务器中的 webapp 文件夹中 我并不是想嵌入jetty服务器 而是试图在jetty内托管应用程序 如tomcat 我没有安装jetty
  • Linux 中不使用 C++ 的 C 异常处理

    Linux 是否提供了 C 语言的异常处理而不求助于 C 或者 实现此类异常处理的最佳方法是什么 目标是避免检查每个调用的函数的返回码 而是执行类似于 C 的线程安全且易于移植的操作 您可以通过为其编写信号处理程序来处理信号 GNU 记录的
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 初始化 FingerpringManager.Crypto 对象,获取 AndroidKeyStore 提供程序不支持的加密原语?

    我使用的是安卓FingerPrintManagerAPI 并使用 KeyPairGenerator 创建密钥对 我想用公钥加密密码 然后在用户通过输入指纹进行身份验证时解密 但是一旦我运行我的项目 它就会崩溃并给出 引起原因 java la
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 配置错误:无法链接到 boost_system

    我正在尝试在 Debian 上安装一个软件包 足球模拟器 2d 当我进入目录并运行时 configure 我得到以下信息 reza debian soccer rcssserver 15 0 1 configure checking for
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import

随机推荐

  • Http PUT 请求到 jpeg

    我收到了如下 HTTP PUT PUT photo HTTP 1 1 X Apple AssetKey F92F9B91 954E 4D63 BB9A EEC771ADE6E8 X Apple Transition Dissolve Con
  • 如何使用 Spring Security 和 Spring Session 从多个服务器获取相同的会话

    很抱歉我的英语还是不太好 请耐心等待 希望您能理解我的问题 我有两个网络服务器 每个网络应用程序都是相同的 Web 服务器共享一台 Redis 服务器 我使用 Spring Security 和 Spring Session 当我登录第一台
  • jQuery ajax 基于父类别的无限动态选择框

    我有一个类别表 category id category name parent id 1 Electronics 0 2 Mobile Phones 1 3 Computers 1 4 Iphone 2 5 Samsung Galaxy
  • R 中 read.table() 函数中的多个 na.strings

    我有一个方桌 它有两个 na strings 例如 A 和 B 我需要将其转换为 NA 到目前为止 我可以将其中之一转为 NA 但不能同时转为 NA 我该怎么做 我可以在该参数中使用函数吗 如果是 我应该使用什么功能 我尝试过像 na st
  • Android 开发应用程序生命周期结束

    我目前正在编写一个应用程序 最终将推向市场 但目前它仍处于 Alpha 阶段 我正在尝试想出 定时炸弹 应用程序的最佳方法 因此如果它在特定日期之后运行 它将提示用户说 alpha 应用程序已过期并关闭 我不会对市场上的应用程序执行此操作
  • 如何在 Visual Studio Community 2015 中更新 Xamarin for Android

    我最近安装了 Visual Studio Community 2015 并且一直在关注 MSDN 教程 当设计应用程序的外观时 我选择了 Resources layout 文件夹中的 Main axml 文件 Android 设计器失败并显
  • 将 XML 绑定到 ItemsSource 时应用动态 XPath 表达式

    我有一个 XML 文档 描述如何为用户输入构建 UI 元素 并且有包含一些数据和 XPath 表达式的数据对象 我有一个数据对象类型的 DataTemplate 它使用 HierarchicalDataTemplate 来构建基于 XML
  • 基于复选框构建 SQL 查询

    假设我有一个表单 其中有 30 个与音乐流派相对应的复选框 它提交给 PHP 表单处理程序 我有一个艺术家表 其中有一个流派字段 构建具有以下行为的查询的最佳实践是什么 从艺术家中选择名称 其中genreid 1 ORgenreId 2 O
  • if else 在存储过程sql server中

    我创建了一个存储过程 如下所示 Create Procedure sp ADD USER EXTRANET CLIENT INDEX PHY ParLngId int output as Begin SET ParLngId Select
  • Python 脚本未在 cron 中运行

    我正在尝试从 cron 运行 Python 脚本 我使用 crontab 以用户身份而不是 root 身份运行命令 我的 Python 脚本的 shebang 位于顶部 usr bin env python我做到了chmod x它使脚本可执
  • 发生未知错误:用户在 Xcode 13.3 上拒绝了 github.com (-17) 的证书

    我遇到了这个奇怪的错误 每次我尝试将本地 git 存储库推送到 Github 时 这个错误都会让我烦恼 希望有人能帮我解决这个奇怪的事情 我的工作环境 Xcode 13 3 就我而言 网络调试代理导致了这个问题 看来 Xcode 固定了 g
  • 为什么 IE 不解析从 WCF 数据服务返回的 XML?

    我目前正在运行 IE8 并正在使用 WCF 数据服务进行一些测试 当我在浏览器中调用我的一个集合时 我得到 您正在查看的提要包含经常更新的内容 消息 并且不会显示任何 XML 因为它不能理解 Atom 内容元素 不过 我可以轻松地在 Chr
  • 将多个工作表导入到 R 中的多个数据框中

    我有一个包含很多工作表的 Excel 文件 我需要一个代码来将每个工作表导入到单独的数据框中 该数据框架的命名方式与 Excel 中的工作表名称相同 例如 选项卡 A B C 将分别作为数据框 A B 和 C 导入 从其他线程中 我看到了这
  • 无法从“int *”转换为“int []”?

    我知道这可能是一个常见问题 但我尝试搜索但仍然找不到明确的答案 我有以下代码 int f int a 1 2 3 return a int main int a f Error here getch return 0 此代码产生错误消息 C
  • 无法在后台任务中调用 Task.Run()

    我想在后台任务的线程中做一些事情 所以我尝试使用 Task Run 但它不起作用 任何人都可以向我展示另一种在后台任务中创建线程的方法 这是我的代码 public sealed class KatzBackgroundTask IBackg
  • 无法将属性与数字进行比较。错误:“‘AnsibleUnsafeText’和‘int’实例之间不支持”

    getent database passwd debug var getent passwd dict2items selectattr value 1 gt 1000 map attribute key list 输出是 TASK deb
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • 如何在 Django 中创建 unique_for_field slug?

    姜戈有一个日期唯一 http docs djangoproject com en dev ref models fields unique for date您可以在将 SlugField 添加到模型时设置的属性 这会导致 slug 仅对于您
  • 像在eclipse中一样关闭intellij idea中未使用的模块

    据我所知 目前 intellij idea 中没有任何功能可以做到这一点 我不知道为什么 但他们不支持这样做 至少这是我通过所有研究发现的结果 也许我们中的一些人用不同的方式来解决这个问题 如何在 intellij 中使用多个模块 在处理多
  • 如何从 USB 加载 LUKS 密码,然后返回键盘?

    我想设置一台具有全磁盘加密功能的无头 Linux Debian Wheezy PC 能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘 我的起点是使用 Debian 安装程序中基本的整个磁盘加密选项进行全新安装 该安装程序将 boot 之