绝对防御之全盘加密与自毁

Author:lxj616

0x00 概述


本文基于Ubuntu 16.04,配置全盘加密的操作系统,设置自毁机制,并简单介绍其原理

说到自毁,有很多人会质疑“自毁”是否属于过度防御,因为全盘加密已经阻止了未授权的访问,还有必要设置自毁机制吗?

加密会提示入侵者数据经过了加密,而自毁可以清除加密数据曾经存在过的痕迹

加密只能拦截入侵者错误的尝试,而自毁可以让你察觉入侵者错误的尝试

加密机制可能被窃听技术攻破,而自毁一旦触发无人能破

0x01 全盘加密


首先从Ubuntu 16.04 安装镜像启动,此处用的是xubuntu系统

选择语言和键盘布局

下面就是见证bug的时间了,这里大家只能选择English,因为全盘加密输入密钥时受键盘布局影响,而安装过程中设置密钥时却钉死为English(US),所以如果你选择了其他语言,比如中文,你将遇到密钥永远不正确的bug (目前在Ubuntu 16.04中仍然存在这个bug,这是个由来已久的bug)

1

选择是否安装额外驱动

下面又到了见证bug的时间了,如果大家在安装过程中遇到了黑屏,花屏,文字闪烁残缺,启动不起来,请一定要勾选“install third party software”,尤其是装了最新型号独显的笔记本,不装显卡驱动根本就启动不起来(或者安装完进入系统后在设置中的额外驱动选项里面手动安装也可)

2

选择分区方案

如果你正好要把整个硬盘都加密一遍,那么选择erase disk,然后勾选encrpt,这样就会全自动帮助你进行加密分区,点选下一步之后就会向你询问加密密码

3

如果你只想对单独的硬盘分区进行加密,再把Ubuntu装进这个单独分区的话,请点选“something else”,然后分区时先选择“physical encrypt volume”配置大小,之后再在向导里面找到重新挂载的加密分区,对加密分区进行配置,这一步时要注意,swap必须设置在加密分区里面,不可以随便设置一个不加密的swap,因为全盘加密解密时可能会把部分密钥写入swap,也就是说有可能会直接把密钥写到未加密的硬盘上,当然干脆不设置swap也可以,自己进入系统后用mkswap,swapon命令自己再分配一个swap文件也可,另外,如果是全盘加密(即直接把“/”根目录挂进加密分区),你需要手动指定一个ext2的/boot分区,建议大家分给500M比较好,管理起来都是整数,方便

4

正常安装然后重启,开机时输入硬盘密钥

0x02 配置加密后的系统


手动配置之前安装时没有指定的swap(如果你已经设置完swap了,可以省略这一步)

sudo dd if=/dev/zero of=swap.img bs=1M count=8000

sudo mkswap swap.img

sudo swapon swap.img

你可以把它加到rc.local里面,这样开机就会自动挂载swap

备份你的LUKS Header

sudo fdisk -l

一般来说,加密分区是/dev/sda5 (如果你只有一个硬盘,那么大概是sda,如果是别的,请自行修改,下同),先检查一下,避免弄错

sudo cryptsetup luksDump /dev/sda5

5

可以看到,/dev/sda5是一个luks加密分区,并且有一个密钥槽,如果它不是加密分区,cryptsetup会告诉你

于是,我们备份/dev/sda5的前1028kb,这是LUKS header默认配置且只带一个密钥槽的大小,如果您自定义了参数,请自行重新计算大小

sudo dd if=/dev/sda5 of=backup.img bs=1K count=1028

然后把备份的LUKS header加密一下

openssl des3 < backup.img > backup.bin

6

这个备份至关重要,否则一旦LUKS header丢失,即使你记得密码也无法恢复数据,因为密钥槽中的salt和密码需要同时存在才能解密硬盘

把这个备份文件藏在一个没人知道的地方,以后自毁或者意外丢失LUKS header时还会用到

其他设置

安装附加驱动中的网卡驱动和显卡驱动,避免遇到驱动问题

建议设置较短的锁屏时间,因为在系统运行时硬盘已经处于解密状态,一定不要让系统运行中被其他人控制

0x03 自毁与数据恢复


很多人会有疑问:我们已经设置全盘加密了,数据已经很安全了,为什么还要设计自毁?

其实理由很简单:加密只能让未授权的人无法访问数据,但他们看到密码输入框后知道加密数据的存在,而自毁能够除掉加密数据本身存在的痕迹,也就是说,你的亲戚是能够在毫无察觉的情况下正常进入备用系统购买火车票的,你的亲戚完全看不到密码输入框,他如果看看分区表能够看到这台电脑里莫名其妙有个无法挂载的硬盘分区,而且里面看起来完全是随机数据

对于传统的普通硬盘来说,完全自毁是一个极其漫长的过程,需要把整个硬盘都擦写一遍,而对于LUKS加密而言,只需要把LUKS header擦写掉,由于不再有密钥槽salt来配合密码解密,实际就达到了全盘自毁的效果

当然,如果你做过LUKS header备份的话,数据并不是永久的自毁,你还可以把备份的LUKS header写回去,重新恢复密钥槽,但是在没有LUKS header的情况下,你无法证明这个硬盘分区含有加密数据

sudo dd if=/dev/urandom of=/dev/sda5 bs=1K count=1028

而恢复LUKS header则是把备份LUKS header的步骤反过来

openssl des3 -d < backup.bin > backup.img

sudo dd if=backup.img of=/dev/sda5 bs=1K count=1028

请注意,由于你进不去自己被自毁的系统,因此以上命令是在备用系统或者U盘系统里面执行的,当然如果你不嫌麻烦,把硬盘摘下来挂在别的计算机里也行

现在问题还有两个:该何时触发自毁机制?如何保障自毁后能够最快最安全地恢复LUKS header?

我们再重新装一个备用的Ubuntu系统,首先用它来触发自毁,二来可以用来恢复LUKS header,三来自毁后迷惑触发自毁的这个家伙,让他能够自动进入这个备用系统而不会感到怀疑

然后在备用系统的rc.local里面写入dd if=/dev/urandom of=/dev/sda5 bs=1K count=1028,这样开机就会自毁,然后在grub里面调整为默认从备用系统启动,选择时间可以适当加长一点,自己用时一定要在grub中选择真实的那个系统

或者你不想要开机自毁的话,把自毁命令写成个启动器放在桌面上,需要使用时自己打开也可

0x04 其他的自毁方式


很多人会觉得“开机自毁”有点儿太暴力,如果设置出一个“自毁密码”可能会更友好一点

其实已经有了这样一个cryptsetup的patch,可以实现这个“自毁密码”功能

http://lxer.com/module/newswire/view/103692/index.html

这个功能也被集成进了kali linux中

但是不得不说,这种自毁方式非常的糟糕,基于以下三点原因:

1. 明确地提示了加密数据的存在,即密码输入框
2. 自毁过程繁琐,需要输入自毁密码,在紧急情况下(计算机可能并未开机),自己无法快速触发自毁
3. 自毁后计算机无法启动,有明显的自毁嫌疑

而且你真的以为入侵者会在你自己的电脑上输入你提供的自毁密码吗?也许入侵者会不小心开机检查是否需要密码,但是任何有头脑的入侵者都会先对整个硬盘进行取证,然后只对备份进行操作,提供自毁密码只会加重入侵者对你的怀疑。

0x05 对本文中加密与自毁的攻击手段


首先,为了得到加密密码,又不能触发自毁机制,你既不能去碰这台电脑,也不能打草惊蛇,你需要在这台电脑附近装一个隐蔽摄像头,视频记录输入的密码,至于怎么不被发现,这是你自己的事情。

其次,为了避开自毁机制,必须尽最快速度将电脑旁边的人员控制住,并立即对硬盘做取证,这一步一定要小心,因为一旦在3秒内没有控制住人员(3秒是强行关机的按键延迟),电脑被人强制关机并重启,就会触发自动的自毁流程

最后,由安全专家使用录制视频内的密码和取证的硬盘备份进行解密

0x06 对入侵的防御策略


经验证,最快最有效的自毁方案是之前提到的开机默认自毁,只要强行断电再开机即可触发自毁,其他任何自毁方案都没有这种方案易于操作,这个流程稳定只需要3秒(强制关机按键延迟),如果台式机拔电源就更快了

一旦发现硬盘无法识别(被自毁),说明有人试图入侵这台电脑,不用担心你发现不了入侵者,你一定会发现的,因为根本都开不了机

在输入解密密码时一定要注意周边环境,不要被隐蔽摄像头记录下密码,因为这几乎是能攻破这台计算机的唯一途径了

不要让任何人接触这台计算机,如果一定要长时间远离这台计算机,可以自己先触发一遍自毁,回来再恢复LUKS header

把加密后的LUKS header藏在一个安全的地方

0x07 结语


综上所述,以上在系统层面的防御可以有效抵抗绝大多数常规的物理入侵,然而,聪明的各位一定会想到,这么优秀的系统防御一定要配合相应等级的上层防御才能体现出效果,不然即使设置了全盘加密,突然设置了一个弱密码,而各种云端账号各种信息泄露仍然严重威胁着我们的安全,那么,如何在互联网中防御自己,请关注后续文章

《绝对防御之全盘加密与自毁》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注