设置笔记本电脑
![]() 在此通知移除之前,请勿遵循此处的说明。 |
本指南是关于创建一个安全笔记本电脑的项目。对于本项目,我们考虑了延长电池寿命的方法。它涵盖了笔记本电脑设置必备的工具和守护程序。
指南特性
- 可否认的全盘加密
- 双因素身份验证(物理对象(USB 密钥),思维)
- 加密的交换分区和休眠
- 在加密驱动器之上的加密 Home 目录
- 内存清理
- 动态电源模式
- 功能键支持
橡皮管攻击
只是提醒一下,所有攻击都受到橡皮管攻击困境的影响,你要么放弃你的加密密钥,要么被橡皮管折磨,甚至可能死亡。请参阅维基百科文章。我们尝试提出可否认加密(维基百科),以避免橡皮管攻击情景。在本文中,我们交替使用“似是而非的否认”和“可否认加密”这两个词。为了实现这一点,我们使用了一个门面,并且不需要元数据指纹来暴露或暗示加密或隐藏的容器,或者暗示检测加密磁盘的存在。密钥应该使用隐写术存储,我们将随机性稀释到门面中。它也要求你不要吹嘘加密或提及它,因为那是在邀请攻击者折磨受害者。可否认加密要求你不要将“encrypted”作为引导加载程序的条目标题。你的门面引导加载程序不应该有加密驱动器的条目。
为什么全盘加密?
全盘加密提供某种程度的似是而非的否认,或者说你没有加密它的有效借口。驱动器只是随机噪声,损坏了,还是真的加密了?另一个原因是它暗示一切都受到保护。
但是,如果做得不对,可能会出现问题。例如,如果未使用选项 --header <path>
分离的标头,则 cryptsetup 默认会留下明文标记或一些提示,表明在使用 luks/luks2 模式时已加密。[1][2] 为了获得我们实际上没有进行加密的可信度,你必须擦除基于使用的密钥槽数量的 +3 MiB 区域;或者将标头存储在外部设备上。
如果你不正确地进行了可否认加密,则可以擦除和恢复标头。这为改进混淆提供了机会。当你拔出 USB 密钥时,它应该擦除标头,但将其原子地(即完全地)存储在 USB 密钥上。如果你插入 USB 密钥,它将恢复标头。cryptsetup 具有 luks 操作 luksHeaderBackup 和 luksHeaderRestore 来执行此操作。
从头开始
拿一个带有 Alpine 的 USB 拇指驱动器。像往常一样设置它,但不要让它接触你的驱动器。然后,将所有工具安装到内存 ramdisk 中,但暂时不要安装到硬盘驱动器中。硬盘驱动器将被清除。
然后,你将使用以下步骤安装 Alpine
首先你需要 WiFi,要获取它,运行下面的命令,但对硬盘驱动器设置内容说“否”或跳过
setup-alpine
然后,你需要临时将一些工具安装到 RAM 中
apk add e2fsprogs grub grub-bios grub-efi mkinitfs nano
使用伪随机 urandom 熵随机化驱动器
第一部分是用随机噪声擦除驱动器,但在实际时间内完成。有很多技术可以做到这一点,但至少应该在一两天内完成。
你可以使用 shred 或 dd 来完成此操作,具体取决于你的需求和熵的可用性。有些技术需要更长的时间。密码学家 Bruce Schneier 建议使用指定的模式进行 7 次擦除。请参阅维基百科文章。为了实际目的,我们只进行一次随机擦除。它应该是随机的,以便随机噪声的门面隐藏类似于噪声的加密数据。
要列出系统上的驱动器,请执行 fdisk -l
。
重要提示:确保你擦除了正确的特定驱动器。
要使用随机熵擦除磁盘,请执行
dd if=/dev/urandom of=/dev/sda
创建 GPG 密钥
截至目前,Alpine 的 mkinitfs 仅使用密码进行单因素身份验证。 你需要手动编辑 mkinitfs 中的 initramfs-init.in,以支持使用 cryptsetup 的双因素身份验证。
在扰乱驱动器后,你需要创建你的 GPG 密钥。你将使用这些密钥为你的 cryptsetup-luks 分区设置密码。这些密钥应存储在 USB 拇指驱动器或其他存储设备上,但不应在 USB 启动拇指驱动器或加密驱动器上。密钥应是包装在 GPG 中并用密码保护的 128 位随机密钥。
如果你正在使用 x,你需要执行 sudo apk add pinentry-gtk
,以便为下一步正确显示密码提示。
要安装 openssl 和 gpg,请执行
apk add openssl gnupg
然后,生成密钥
export GPG_TTY=$(tty) && openssl rand -base64 512 | gpg --symmetric --cipher-algo aes --armor > /mnt/usb/$(openssl rand -hex 12)
(首先确保你的 usb 已挂载在 /mnt/usb 上。)
长文件名来自 openssl rand -hex 12
,以便我们增强似是而非的否认。攻击者无法确定密钥的用途。它是用于 GitHub 吗?还是用于电子邮件?
第一部分将生成 512 个随机字节,并将其包装在 base64 中。随机数据将通过管道传输到 gpg,gpg 会将其包装在 AES 中作为密文,然后再次包装在 base64 ascii 盔甲中。对于每个分区,包括某些情况下的交换分区,你应该创建更多 gpg 密钥并将它们存储在你的 USB 拇指驱动器中。生成 gpg 密钥后,你将使用它们作为 cryptsetup/luks 的密码。
你可以将上面的 aes 替换为 gpg --version
中列出的那些。
应该为交换分区生成一个密码。这是为了从休眠状态恢复。如果你不想休眠,则不需要密码,你只需在每次启动时创建/格式化分区,而无需密码或使用一次性随机密码。
使用隐写术隐藏密钥
警告: 本节被认为是实验性的。它要求工具和依赖项放置在另一个 USB 上,与密钥文件、引导加载程序和加密磁盘分开。工具和依赖项需要打包在一起。我们分散这些组件,以便攻击者不容易将这些点连接起来,或者立即跳到解密的要求的结论。Steghide 自动使用 128 位 AES 在 CBC 模式下加密数据。如果你不喜欢或不信任 AES,可以使用 -e 选项更改此设置。使用 steghide encinfo
获取其他密码和模式。
幸运的是,Alpine 有一个用于隐写术的软件包,名为 steghide。要安装 steghide,请执行
apk add steghide
你将把密钥文件放在图像文件中。门面图像文件应该足够大,以便原始图像和修改后的图像之间没有明显的、可辨别的差异。不要使用小文件大小的小图像。
如前所述,luks 标头可能为 3MB 或更大,jpeg 图像文件不适合。使用另一种格式,如 .au/.wav 或另一个处理 mp3 的隐写术实用程序。mp3/wav 应该足够大,以稀释标头。因此,内容较长的内容是合适的。
有两个基本命令可与 steghide embed 和 extract 一起使用,
要嵌入,请执行
steghide embed -ef key.gpg -cf image.jpg
要提取,请执行
steghide extract -xf key.gpg -sf image.jpg
要获取要发送的文件列表,请使用
apk info -L libgcc libmcrypt libmhash libstdc++ libjpeg-turbo steghide
使用 cryptsetup-luks 卷进行全盘加密
分区方案
本节介绍一个概念性布局。它不应是对自动使用分区工具的下意识认可,因为这会损害你的似是而非的否认。
对于门面,我们使用 Ubuntu Live CD(或技能较低的发行版)来给人一种印象,即我们不够老练或技术娴熟,无法实施加密。Windows 也是可以接受的,甚至更好。不可变的 Live CD 和不可变分区确保你不会受到植入证据的第三方攻击者的攻击。
可能有两个引导加载程序,一个用于门面,另一个用于存储在外部设备上的加密驱动器。
Luks
只有当你能够证明不存在分区 2、3、4 以及 cfdisk 和 cryptsetup-luks 引入的指纹/明文时,似是而非的否认才有效。使用 TestDisk、fdisk -l 或 gparted 以及磁盘编辑器(磁盘的十六进制编辑器)之类的工具。
# | 名称 | 挂载点 | 备注 |
---|---|---|---|
1 | 门面 | / | (可选)门面分区包含一个原始的正常操作系统或 Ubuntu Live CD 镜像,以引诱攻击者,试图增强攻击者的信心,让他们相信设备上没有加密。 |
2 | swap | 对于 x86_64,它应该与你的 ram 大小相同。理由:它应该包含整个 ram 镜像。 | |
3 | root | / | |
4 | rescue | / | 这应该包含 Alpine 镜像。 |
Plain dm-crypt
只有当你能够将 #2 展示为未使用的空间或未被篡改时,似是而非的否认才有效。要检查,请使用 TestDisk、gparted 和磁盘编辑器(磁盘的十六进制编辑器)之类的工具。
# | 名称 | 挂载点 | 备注 |
---|---|---|---|
1 | 门面 | / | (可选)门面分区包含一个原始的正常操作系统或 Ubuntu Live CD 镜像,以引诱攻击者,试图增强攻击者的信心,让他们相信设备上没有加密。 |
2 | vgroot | ||
2_1 | vgroot-root | / | |
2_2 | vgroot-swap | 对于 x86_64,它应该与你的 ram 大小相同。理由:它应该包含整个 ram 镜像。 | |
2_3 | vgroot-rescue | / | 这应该包含 Alpine 镜像。 |
安装 cryptsetup
要安装 cryptsetup,你需要下面的软件包
apk add cryptsetup
选择密码
当你创建 luks 驱动器时,你需要决定要使用的密码类型和哈希技术。你想使用的密码由你决定,但它应该是一种尚未被破解或没有遭受大量密码分析攻击的密码。你可能想使用的密码是 AES,它在某些具有 AES-NI cpuflag 的 Intel CPU 中是硬件加速的,你可以通过 cat /proc/cpuinfo
来检查。还要考虑在 Linux 内核中可用的 SIMD 优化的密码,如 serpent 和 twofish。还要考虑那些不受欢迎但已知安全的密码,如 Blowfish(维基百科声称它已被攻击,作者推荐使用 Twofish)。[3] 如果它是硬件加速的,它将节省电池寿命并最大限度地减少 CPU 使用率。
有关某些密码的弱点,另请参阅密码安全摘要(维基百科)。
有关某些哈希函数的弱点,另请参阅哈希函数安全摘要(维基百科)。
一般来说,交换分区应该使用快速密码。你希望降低内存子系统的延迟或延迟,这是加密的后果。
重要提示: 请阅读重要提示部分,了解有关 AES 加密问题的详细信息。
如果你不信任 AES 推销员和 NSA 认可,你可以尝试另一种不同的密码。使用公开审查的密码的另一个优点是,它提供了对密码有效性的信心。
像 KHAZAD 这样的密码在 cryptsetup benchmark
上不起作用。KHAZAD 本身是不安全的。维基百科报道 8 轮中有 5 轮已被破解。[4]
根据维基百科,对于 AES-128,10 轮中有 7 轮,AES-192,12 轮中有 8 轮,AES-256-bit,14 轮中有 9 轮已被破解。[5]
重要提示:不要使用 sha1 作为哈希算法。 它已经被破解了。
获取可用的密码
要检查密码或哈希函数的可用性,请使用
find $(find /lib/modules -name "crypto" -type d) -type f -name "*.ko" | sort
要检查密码是否已加载并通过其自身的测试,请使用
cat /proc/crypto
要测试一些流行的密码和哈希,请执行
cryptsetup benchmark
顶部的集合与哈希算法相关联。底部的集合是密码。使用以下命令,但将密码和/或哈希算法替换为你偏好的。
cryptsetup benchmark
实际上并没有显示所有密码,如 Anubis。密码还应该具有 CBC 和/或 XTS 块密码操作模式,以加密更大的块大小。例如,AES 的块大小为 128。
要测试不受欢迎但未破解的密码是否有效,请使用类似
cryptsetup benchmark --cipher anubis
cryptsetup 的通用步骤
使用 fdisk 的原始方法,不具备可否认性
在这种方法中,--type luks
是隐含的,它会生成元数据。
如果你想要 luks 的似是而非的否认,你需要将 --header <path>
传递给所有 luks 命令,其中 <path>
是 unix 路径,如 /mnt/usb/d6ae10eda66704c8。随机名称来自 openssl rand -hex 8
。标头被传输到外部设备(但在手册页中没有提及密钥槽区域,而是传输了密文)。为了以防万一,如果该文件中存在明文或指纹,则应使用加密来混淆该文件中的信息。然后,应在重用时解密它。
如果你喜欢交互式 ncurses 控制台方法,则需要安装 cfdisk
apk add cfdisk
# | 步骤 | 命令 |
---|---|---|
1 | 使用 cfdisk 创建分区。创建两个分区——一个系统分区和一个交换分区 | cfdisk
|
2 | 创建并格式化 luks 设备 | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1 /mnt/usb/$(ls)
|
3 | 打开 luks 设备 | cryptsetup --key-file /mnt/usb/$(ls) luksOpen /dev/sda1 root
|
4 | 使用文件系统格式化解密的驱动器 | mkfs.ext4 /dev/mapper/root
|
5 | 创建挂载点 | mkdir -p /mnt/root
|
6 | 挂载根分区 | mount /dev/mapper/root /mnt/root
|
7 | 创建交换分区 | cryptsetup -c blowfish -h sha256 -d /dev/urandom --key-file /mnt/usb/59022506d9f4a714 create swap /dev/sda2 |
8 | 使用交换分区 | mkswap /dev/mapper/swap && swapon /dev/mapper/swap |
改进的方法,具备可否认性
此方法需要 lvm2。要安装
apk add lvm2
# | 步骤 | 命令 |
---|---|---|
1 | 打开plain dm-crypt 设备,不生成元数据 | cryptsetup open --type plain --cipher aes-cbc-essiv:sha256 --key-size 256 --key-file /mnt/usb/$(ls) /dev/sda pvroot
|
2 | 使用 LVM 创建物理卷 | pvcreate /dev/mapper/pvroot
|
3 | 使用 LVM 创建卷组 | vgcreate vgroot /dev/mapper/pvroot
|
4 | 使用 LVM 创建交换分区的逻辑卷 | lvcreate -L 4G vgroot -n swap
|
5 | 创建根分区的逻辑卷 | lvcreate -L 2T vgroot -n root
|
6 | 创建救援分区的逻辑卷 | lvcreate -L 110M vgroot -n rescue
|
7 | 使用文件系统格式化根卷 | mkfs.ext4 /dev/mapper/vgroot-root
|
8 | 格式化交换卷并激活它 | mkswap /dev/mapper/vgroot-swap && swapon /dev/mapper/vgroot-swap
|
9 | 使用文件系统格式化救援卷 | mkfs.ext4 /dev/mapper/vgroot-rescue
|
10 | 为根卷创建挂载点 | mkdir -p /mnt/root
|
11 | 挂载根卷 | mount /dev/mapper/vgroot-root /mnt/root
|
配置 OpenRC dmcrypt 和设置 fstab
你需要告诉 OpenRC 初始化脚本解密卷。请参阅 /etc/conf.d/dmcrypt
。
你需要添加服务以良好地启动,因为它需要在 OpenRC 从根卷开始运行命令之前解密根卷。因此你需要执行
rc-update add dmcrypt boot
dmcrypt
dmcrypt OpenRC 服务将尝试使用 /etc/conf.d/dmcrypt 中提供的信息解密驱动器。
对于 luks
内容 /etc/conf.d/dmcrypt
对于 plain dm-crypt
内容 /etc/conf.d/dmcrypt
dm-crypt 将只挂载加密的 plain dm-crypt 驱动器或 luks 分区。接下来你需要做的是设置位于 /etc/fstab 的 fstab。示例如下所示。
/etc/fstab
要使用 fstab 挂载 plain dm-crypt 设备
内容 /etc/fstab
要使用 fstab 挂载 lvm 卷
内容 /etc/fstab
如何从错误的设置中恢复
很多时候,你第一次尝试不会完全正确。要从这种情况中恢复,你需要重新打开 plain dm-crypt 驱动器或 luks 驱动器,然后重新挂载所有内容。
要从 luks 恢复
cryptsetup --key-file /mnt/usb/2a667ec72774b0d5 luksOpen /dev/sda1 root mkdir -p /mnt/root mount /dev/mapper/root /mnt/root
要从 plain dm-crypt 恢复
cryptsetup open --type plain --cipher aes-cbc-essiv:sha256 --key-size 256 --key-file /mnt/usb/$(ls) /dev/sda root vgchange -ay vgroot lvchange -ay vgroot/root mkdir -p /mnt/root mount /dev/mapper/vgroot-swap /mnt/root
下一步:完整的 Alpine 安装
我们将设置 /mnt/root 加密分区
apk add --root=/mnt/root --initdb $(cat /etc/apk/world) --keys-dir /etc/apk/keys --repositories-file /etc/apk/repositories
然后,在包括 community 和 testing 在内的两个文件中启用 edge 存储库
nano /etc/apk/repositories /mnt/root/etc/apk/repositories
然后,复制必要的文件
cp /etc/resolv.conf /mnt/root/etc
然后,安装基本实用程序
apk add --root=/mnt/root dhcpcd chrony networkmanager wireless-tools wpa_supplicant apk add --root=/mnt/root grub mkinitfs e2fsprogs grub-bios grub-efi apk add --root=/mnt/root sudo nano apk add --root=/mnt/root linux-lts
然后,你需要将你的 usb 挂载到 /boot
mount /dev/sdb /boot
编辑 grub
nano /boot/grub/grub.cfg
然后,在 usb 上安装 grub
grub-install --force /dev/sdb
然后,准备 chroot
mount --bind /dev /mnt/root/dev mount --bind /sys /mnt/root/sys cp /etc/reslov.conf /mnt/root/etc
然后,chroot
chroot /mnt/root /bin/sh
设置 root 管理员密码
passwd
root 密码应该非常复杂,以阻止你使用它,并迫使你使用 sudo
编辑 sudo,以便 wheel 组具有管理权限
EDITOR=nano visudo
设置
## Uncomment to allow members of group wheel to execute any command %wheel ALL=(ALL) ALL
然后,添加 wheel(管理员)用户
useradd -m myname usermod -a -G video,audio,wheel myname
登录该用户
su myname
然后,更新和升级它
sudo apk update sudo apk upgrade
然后,设置 xorg
sudo setup-xorg-base sudo apk search xf86-video | sort # pick your xf86 video driver sudo apk add xf86-video-amdgpu # install the mesa driver sudo apk add mesa-dri-gallium
然后,继续添加
sudo apk add firefox dwm xfce4-terminal alsa-utils keepassx xfce4 xchat sudo apk add font-noto-emoji font-terminus leafpad xsetroot # See Emojis to complete installation sudo apk add xf86-input-libinput # or -evdev if libinput doesn't work
然后,设置桌面
nano .xinitrc
将两者都放入,但如果你不想要其中一个,请用 # 注释掉一个,
#while true; do xsetroot -name "$( date +"%a %b %d %I:%M:%S %Y" )" ; sleep 1; done & #exec dwm exec xfce4-session
对于上面用于在 dwm 的状态栏中提供信息的 xsetroot 语句,请考虑添加有关电池电量的信息。此信息可以在 sysfs 中的 /sys/class/power_supply/BAT0/ 中找到。
sync sudo reboot
破解 mkinitfs 以支持带有 GPG 密钥的 cryptsetup
本节介绍如何组装多部分自定义 initscript 链。它可以扩展为三因素身份验证,除了思维和物理对象之外,还增加了生物识别技术。
大多数安全系统的入口并非完全自动化,也不允许事物快速自由地通过,并且通常受到保护。此过程可能看起来很麻烦,但它应该阻止橡皮管使用者直接得出存在加密驱动器的结论。
以下是使门面 initscript 和依赖项免于加密所需的步骤。
- 你将分离并归档 cryptsetup、密码内核模块、哈希函数内核模块以及任何其他混淆依赖项,以及下面讨论的另一个延续 initscript。你需要确保将 /etc/mkinitfs/mkinitfs.conf 复制到你的主目录,并删除那些没有这些模块的功能。
- 你将使用另一个你将打包的工具将此存档隐藏在 mp3 文件中,或者你可以使用 steghide 的 .au/.wav 支持,但根据当前趋势,.au 似乎太显眼或奇怪。
在这里,我们尝试清理门面,使其呈现为没有密码学。你需要对你的 initramfs 进行以下更改,以避免敏感的橡皮管使用者
- 你将删除自定义 initramfs-init 中所有引用加密的内容。这包括 cryptroot、cryptdm、crypt-anything 等 init 选项。
- 你需要删除 nlplug-findfs 中对 cryptsetup 的引用,并重新编译 mkinitfs 软件包。
- 你可以编程 init 脚本以启动到门面分区,但如果满足隐藏的特殊按键序列,则会进入 sh。
你需要创建一个自定义的 init 延续脚本
- 你的 initscript 应该进入单用户模式,你将在其中手动挂载加密路径。
- 你将手动 steg-unhide 隐藏在 mp3 文件中的加密存档,并将其提取到 ramdisk 中。
- 你将手动运行自定义的 init 延续脚本。
- 此自定义的 init 延续脚本将自动化从另一个设备和图像文件将 gpg 密钥提取到 ramdisk 的过程。然后,这将自动化加密驱动器的挂载。此恢复延续脚本应处理冷启动和休眠。
- 你将完成恢复运行 mkinitfs-init 的另一半,或者具体而言,在它通常会挂载 cryptsetup 和休眠设备之后的位置。
如果你使用 USB 键盘,你将在早期用户空间中解锁加密设备。你需要要么在内核中编译 USB 键盘驱动程序,要么在生成 mkinitfs 时添加额外的模块。你需要 hid、hid-generic、ehci-hcd、uhci-hcd、usbcore 驱动程序,并将这些路径添加到自定义的 /etc/mkinitfs/features.d/usb-keyboard.modules
中。它应该与 usb.modules 分开,因为 apk 更新可能会覆盖它。使用 kmod 软件包中的 lsmod
实用程序查找你的 USB 键盘使用的驱动程序。
你需要生成最终的 mkinitfs。首先,你需要 kernelversion 传递到 mkinitfs 中。要获取该信息,请执行 ls /lib/modules
,它将显示一些文件夹。找到它后,将其传递给 mkinitrafs,方法是执行并替换下面的 kernelversion
sudo mkinitramfs -i $HOMEDIR/initramfs-init -c "$HOMEDIR"/mkinitfs.conf kernelversion
如果不是 root 用户,$HOMEDIR 应该替换为完整路径。
在 USB 拇指驱动器中安装引导加载程序
要安装 grub,你需要首先在主机上的 ramdisk 上安装 grub。
apk add grub
要获取分区列表
fdisk -l
在 /boot 中挂载启动分区
mount /dev/sdb /boot
更改 grub 的配置
nano /boot/grub/grub.cfg
你需要自定义 initramfs 才能使用 GPG 密钥,因为它不支持。
以下步骤假设已实施这些自定义的 initramfs 功能。
以下引导加载程序设置对于可否认加密不足够,因为它暴露了加密驱动器存在的事实,因为攻击者可以通过 grub 菜单的编辑选项发现使用了加密。为了保护自己免受橡皮管攻击,你真的需要自定义 initramfs,以便不明确提及任何提及加密、密码、哈希的内容。这些配置应被视为用于调试目的的中间形式。此外,攻击者可以直接检查 grub.cfg 文件。
以下只是一些使其工作的示例,但应进行修改,使其不会暗示橡皮管使用者存在隐藏分区或加密分区。
条目应如下所示
对于“luks”
内容 /boot/grub/grub.cfg
对于“plain dm-crypt”
标准的 mkinitfs 可能不支持 plain dm-crypt。它看起来只支持 luks。需要自定义 initramfs。
内容 /boot/grub/grub.cfg
grub 的源代码可能可以被修改和重新编译以使用其他非标准密钥。请参阅 [6]。理想情况下,对于攻击者来说,它应该不是那么明显或容易访问。
上面的 grub.cfg 应用于 USB 引导加载程序。对于门面引导加载程序,您只需要 Windows 10 或 Ubuntu 条目,仅此而已。
对于模块参数,您需要添加您的加密模块。使用 find /lib/modules/ -name "*aes*"
,其中 aes 是您的密码或哈希算法的基本名称。使用 blkid
获取您的设备的 UUID
将其安装到您的 USB 拇指驱动器
grub-install /dev/sdb
使用 eCryptfs 挂载 Home 目录
我们使用 eCryptfs 加密 home 目录。拥有另一个加密文件系统的理由是,如果您在休息时无人看管您的笔记本电脑,或者意外地将 USB 密钥留在里面,您的数据将无法访问。另一个理由是,如果另一个人想使用您的计算机,您只需注销,数据将被隐藏和加密。当您因不活动而注销时,您的 home 目录将被卸载和加密。eCryptfs 将加密/解密文件名和内容,并将位于 ext4 之上,而 ext4 又位于 luks 之上。
要安装 ecryptfs-utils
sudo apk add ecryptfs-utils
这主要只使用密码进行单因素身份验证,但应该修改为也使用 USB 密钥。您需要使用 pam_usb.so 重新配置 pam,但这在 Alpine aports 中没有。
您需要使用 pam_ecryptfs PAM 模块。
锁定系统
很多时候,您会将笔记本电脑留在您信任的人身边。以下工具将帮助锁定系统。
physlock
这将自动锁定 tty,当您返回时,将提示输入密码。
要安装 physlock
sudo apk add physlock
它目前有 bug。请参阅 [7]。physlock 可能不支持双因素身份验证,但应该支持。
您需要创建自定义脚本来监视 TTY 中的空闲时间,然后调用 physlock。您在登录时加载此脚本。
xscreensaver
这将使您退出 xserver
要安装 xscreensaver
sudo apk add xscreensaver
USB 密钥 udev 规则
您需要添加一个新的 udev 规则,当您拔出 USB 密钥时,该规则将暂停到 RAM 或休眠并注销。当您返回时,您应该进行双因素身份验证以恢复一切。休眠和暂停到 RAM 可能会缓解冷启动攻击(但不太可能,请参阅页面底部的注释),以提取内存中的明文私有数据和加密密钥。
要找出您的 USB 的详细信息,请执行
udevadm monitor --udev -p
输出应如下所示
UDEV [181762.722853] add /devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/host6/target6:0:0/6:0:0:0/block/sdc (block) ACTION=add DEVLINKS=/dev/disk/by-id/usb-Kingston_MSFT_NORB_MSFTLAKDA300EB3021790009-0:0 /dev/disk/by-path/pci-0000:00:13.2-usb-0:5:1.0-scsi-0:0:0:0 /dev/disk/by-uuid/5A96-03E4 DEVNAME=/dev/sdc DEVPATH=/devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/host6/target6:0:0/6:0:0:0/block/sdc DEVTYPE=disk ID_BUS=usb ID_FS_TYPE=vfat ID_FS_USAGE=filesystem ID_FS_UUID=5A96-03E4 ID_FS_UUID_ENC=5A96-03E4 ID_FS_VERSION=FAT32 ID_INSTANCE=0:0 ID_MODEL=MSFT_NORB ID_MODEL_ENC=MSFT\x20NORB\x20\x20\x20\x20\x20\x20\x20 ID_MODEL_ID=1645 ID_PATH=pci-0000:00:13.2-usb-0:5:1.0-scsi-0:0:0:0 ID_PATH_TAG=pci-0000_00_13_2-usb-0_5_1_0-scsi-0_0_0_0 ID_REVISION=PMAP ID_SERIAL=Kingston_MSFT_NORB_MSFTLAKDA300EB3021790009-0:0 ID_SERIAL_SHORT=MSFTLAKDA300EB3021790009 ID_TYPE=disk ID_USB_DRIVER=usb-storage ID_USB_INTERFACES=:080650: ID_USB_INTERFACE_NUM=00 ID_VENDOR=Kingston ID_VENDOR_ENC=Kingston ID_VENDOR_ID=0951 MAJOR=8 MINOR=32 SEQNUM=2027 SUBSYSTEM=block USEC_INITIALIZED=1762722168
您想要提取 ID_SERIAL_SHORT=MSFTLAKDA300EB3021790009
或与您的 USB 拇指驱动器关联的任何内容。
您需要 pm-utils 用于 ps-suspend。因此,要安装它,请执行
sudo apk add pm-utils
您将创建一个 udev 规则,以便当您拔出 USB 时,它将暂停到 RAM,或者您可以使用自己的脚本。为此,创建一个包含以下内容的文件
内容 /etc/udev/rules.d/50-usb-thumb-drive.rules
延长电池寿命
警告:如果您不使用适当的缓解措施来应对冷启动攻击,那么最好自动关闭笔记本电脑,而不是使用暂停或休眠。
ACPI
ACPI 是一个很好的守护程序,用于在触发笔记本电脑事件时执行某些脚本。
要安装 ACPI,请执行
apk add acpi
需要注意的事件是
事件 | ACPI 事件 | 您的脚本应该做什么 |
---|---|---|
盖子关闭 | 注销 ttys 并暂停到 RAM。ALSA 应该将声卡音量设置为 0,或者卸载声卡驱动程序。如果声音在盖子打开后大声循环,则最好杀死或静音任何音乐或电影播放器。 | |
盖子打开 | 锁定所有 ttys,并且应该锁定所有 xserver,可能需要重新初始化 ALSA 和声音系统。 | |
点击电源按钮 | 锁定所有 ttys 并暂停到 RAM | |
按住电源按钮 | 休眠 | |
拔下电源 | 应该在电量高于 25% 时切换到“保守”cpufreq 调速器;在 25% 时切换到“省电”调速器。降低 hdparam 停止转速。 | |
插入电源 | 应该切换到“性能”调速器。禁用 hdparam 停止转速。 |
电源调速器的目的是调节处理器的运行频率 (GHz)。
某些事件处理程序通过 laptop-mode-tools 管理。如果您不想要依赖项,那么您可以编写 ACPI 处理程序脚本。
acpi_listen
可用于检索事件名称。
TODO:将脚本放在下面
动态调整背光
可以使用 sysfs 控制背光。该设置是 /sys/class/backlight/
的后代。该功能可能允许您将值回显到其中。使用试错法来发现这些值。
背光调整应该是电池寿命的函数。因此,如果电池寿命为 33%,您希望将其运行在接近最低但可读的设置。对于 50% 的电池能量,可能 40% 的亮度。对于 90% 的电池,可能 75% 的亮度。
hdparm
要安装 hdparam,请执行
sudo apk add hdparm
laptop-mode-tools 搞乱的设置是 -S
或停止转速超时。也有人暗示,声学设置 -M
与速度相关,这意味着声音越大速度越快,声音越小速度越慢,这可能会影响使用的或减少的能量量。
同样,您需要像 laptop-mode-tools 或 ACPI 这样的东西来根据 ACPI 事件动态调整设置。
laptop-mode-tools
目前这不在 aports 中,但值得一提。它真的应该被打包。这是一组用于定义电源策略的脚本。您可以在一个地方管理所有设置,例如硬盘驱动器空闲停止转速时间、CPU 调速器控制、基于电池或交流电源的动态 LCD 背光行为。
cpufreqd
这是一个用于调节电源的有用守护程序。
要安装 cpufreqd,请执行
sudo apk add cpufreqd
确保您添加了服务
sudo rc-update add cpufreqd
LCD 屏幕刷新率
刷新率设置了最大帧率。推送的帧数越多,电池消耗的能量就越多。您希望根据某些事件动态调整此值。对于游戏,您希望它尽可能高,并且关闭垂直同步。对于电池使用和旅行,您希望将其上限设置为 60 FPS/60 Hz 或更低,但在您插入交流电源时动态调整。您可以使用 xrandr 调整帧率。对于电影和 YouTube,您希望 60FPS 并开启垂直同步。
破解内核
您应该参考 自定义内核 页面以获取详细信息。
休眠
请参阅 休眠以防止数据丢失。
WiFi 管理
由于您正在使用 WiFi,因此您需要更好的 WiFi 管理来快速找到开放访问的 WiFi 接入点。我们没有一整天的时间来调试远离家乡时的 WiFi 设置的复杂性。
要安装 NetworkManager,请执行
sudo apk add networkmanager
要查找 WiFi 接入点,请使用 nmtui
ncurses 界面。
您还需要其他程序,因此也安装它们
apk add wpa-supplicant dhcpcd chrony macchanger wireless-tools iputils
这些程序的作用
- wpa-supplicant -- 用于 WPA 加密
- dhcpcd -- 用于获取动态 IP 地址
- chrony -- 用于使用原子钟校正时间
- wireless-tools -- 用于附加信息
- macchanger -- 用于防止 WiFi 访问歧视或增加匿名性。(可选)
- iputils -- 用于 ping 命令(可选)
您还需要添加这些服务
rc-update add chronyd rc-update add wpa_supplicant rc-update add dhcpcd rc-update add networkmanager
要手动启动服务(或只需重启)
rc-service chronyd start rc-service wpa_supplicant start rc-service dhcpcd start rc-service networkmanager start
其他工具
actkbd
要使用 fn 功能键控制声音,您需要此守护程序。它目前不在 aports 中。您可以使用自己的脚本和实用程序覆盖这些键的设计和含义。此守护程序为您提供这种自由。
如果您的笔记本电脑包含亮度键,您希望使用此程序进行设置。另请参阅 动态调整背光。
secure-delete
想要防止冷启动攻击或内存中解密的密钥落入坏人之手?这也许可以奏效,谁知道呢?根据冷启动攻击的研究,数据实际上可以在内存中停留几分钟,这足以让黑客将内存内容复制到 USB 拇指驱动器。
要安装 secure-delete,请执行
sudo apk add secure-delete
smem 仅适用于未使用的 ram。[8] 如果您使用 vanilla 内核,这可能会奏效。如果您使用 grsecurity,它会在内存页被释放时自动清理内存(但在 Alpine hardened 内核中默认情况下未启用)。[9]
关闭所有重要程序,然后调用 smem。
您可以在关闭脚本或自动注销脚本中调用 smem。
您可以调用创建一个 OpenRC 关闭脚本,以便在大多数程序和服务关闭时运行 smem。这将擦除您所有的敏感明文私有数据,以防万一。
您可能想要创建一个包装器脚本,以便在您的程序关闭后调用 smem。
您需要编写一个自定义脚本,该脚本执行以下操作
* kill all running processes associated with your user account * auto logoff terminals * for the last terminal closed including all idle xservers, unmount your user home * (optional) use smem to wipe all your plaintext private data in memory after all closed programs in case of cold boot attack
通过 HDMI 共享演示文稿
如果您想使用笔记本电脑通过 HDMI 连接共享演示文稿,则需要 libxinerama 和 xrandr。
要安装 libxinerama 和 xrandr,请执行
sudo apk add libxinerama xrandr
重要提示
如果您丢失或损坏了 USB 密钥,那就完了,您将无法解密您的驱动器。明智的做法是备份它。
默认情况下,暂停到 RAM 或休眠将无法充分清除这些阶段中 ram 中的 AES 加密密钥,这将引发冷启动攻击。TRESOR 内核补丁已经涵盖了这一点。[10][11] 自 4.x 内核系列以来,此补丁尚未更新。[12]。此补丁目前仅适用于具有 SSE 和 MMX 的 32 位 x86 Linux,以及具有 x86_64 Linux 的 AES-NI 指令集的处理器。TRESOR 不适用于 DMA 攻击,但可以通过禁用 DMA 来缓解。[13] 32 位版本的 TRESOR 只有 128 的密钥大小。AES-NI 版本的 TRESOR 的最大密钥大小为 256 位。请参阅 选择密码 以了解破解的轮数。
Loop-Amnesia 与 LoopAES 一起使用,仅适用于 64 位 Linux,并且仅支持 128 位密钥,但如果未遵循他们的建议,可能会导致数据丢失。[14]
请阅读有关冷启动攻击的 Wikipedia 文章,尤其是缓解措施部分。[15] 如果您没有适当的缓解措施(意味着并非完全防范)先决条件,例如打过补丁的内核、内存加扰、永久内存模块安装等,则全盘加密将无法保护您的数据,尤其对于较旧的硬件而言。
如果您有不同的但完全加密的设备(如 iPad),您仍然可以被橡皮管敲打或审问,拥有一台完全可否认的加密笔记本电脑。本指南不能保护您免受这种可能性。如果您不想被橡皮管敲打,请不要拥有这些设备。
缓解 DMA 攻击以泄露加密密钥的其他技巧
在 BIOS 中禁用 DMA,并根据 Wikipedia 设置 BIOS 密码。[16]
将使用 DMA 的内核模块和任何未使用的扩展模块(FireWire、CardBus、ExpressCard、Thunderbolt、USB 3.0、PCI Express 和使用 DMA 的热插拔模块)列入黑名单。
您可能需要自定义(或自定义)BIOS 或使用 Intel TXT 或 TPM,这将验证启动设备或从特定序列号而不是任何序列号启动。对于冷启动攻击,不需要移除 RAM,而是使用液态空气减缓 RAM 模块的衰减速度,此外还需要一个包含加密密钥检索器的 USB 拇指驱动器,绕过操作系统。[17]