如何不在机器上存储硬盘加密密钥,但仍然在启动时挂载?

kid*_*ose 4 arch-linux encryption crypttab

设置:我使用的是一个USB硬盘树莓PI,运行拱Linux和syncthing为自己的“云”同步。

问题:如果发生物理入侵,其中 HDD pi 和 HDD 被盗,我想确保 HDD 上的文件保密。

当前的高级想法:加密硬盘,将密钥存储在网络服务器上。在启动时,下载密钥、解密和挂载。不要将密钥存储在 HDD/SD 卡上。如果被盗,请停止从网络服务器提供密钥。

问题:如何去实现这个?

(crypttab 可以解决这个问题吗?编写我自己的 systemd 单元是要走的路吗?任何其他想法,甚至可能的解决方案都是受欢迎的)

Gil*_*il' 8

设置它的最简单方法是拥有一个明文系统分区(我认为在 SD 卡上)和一个加密数据分区。使用 dmcrypt 加密数据分区,密钥存储在从服务器下载的密钥文件中。

首先设置服务器基础设施,然后下载密钥文件并cryptsetup luksFormat /dev/sdb1 /run/data.keyfile使用cryptsetup luksAddKey /dev/mapper/encrypted /run/data.keyfile. 请注意,您可以安排使用密码或密钥文件解锁卷,这可能便于管理(即使服务器不可用,您也可以键入密码)。

密钥文件不必采用任何特定格式。只需在服务器上生成一些随机字节;16 个字节就足够了(更多的不会给你更好的安全性,但更少的不会给你更好的性能):</dev/urandom head -c 16 >pi.keyfile.

使用 HTTPS 提供密钥以避免被窥探。如果您没有经过 CA 验证的证书,请创建您自己的证书并将其添加到/etc/ssl/certs,或将其传递给下载命令(wget --ca-certificate /etc/local/my.certcurl --cacert /etc/local/my.cert)。

您需要在激活加密卷之前下载密钥。您可以通过其中之一一步完成此操作

wget -nv -O - https://myserver.example.com/pi.keyfile | cryptsetup luksOpen /dev/sdb1 --key-file /dev/stdin
curl https://myserver.example.com/pi.keyfile | cryptsetup luksOpen /dev/sdb1 --key-file /dev/stdin
Run Code Online (Sandbox Code Playgroud)

或者您可以将密钥下载到临时文件,然后激活该卷,最后(不是必需的,但可能会稍微提高安全性)删除临时文件。这个临时文件的自然位置是 in /run,它在 RAM 中并且只能由 root 写入(不要将密钥下载到持久存储)。您应该使文件只能由 root 读取(您可以umask 700在下载前进行设置以进行安排),尽管这仅在您不控制启动时运行的所有代码时才重要。

如果将密钥下载到临时文件中,可以将密钥文件放入/etc/crypttab,并添加一个systemd单元下载在激活加密卷之前运行的密钥文件(但在网络可用之后)和另一个单元删除密钥文件然后。把wget … | cryptsetup …/etc/rc.local外观更容易建立。

您可能希望在客户端下载密钥时对其进行身份验证。身份验证令牌必须以明文形式存储在 Pi 上。您可以使用 SSL 客户端证书:

curl --cert /etc/keyfile.cert https://myserver.example.com/pi.keyfile
wget --certificate /etc/keyfile.cert https://myserver.example.com/pi.keyfile
Run Code Online (Sandbox Code Playgroud)

或具有 HTTP 基本身份验证的密码,存储在/root/.netrc

curl -n --user=pi https://myserver.example.com/pi.keyfile
wget --user=pi /etc/keyfile.cert https://myserver.example.com/pi.keyfile
Run Code Online (Sandbox Code Playgroud)

在服务器端设置基本身份验证可能更容易。使用随机生成的没有特殊字符的密码(例如</dev/urandom | head -c 16 | base64)。

请注意,无论您做什么,窃取 Pi 的人都会获得密码,并且如果您不先在发送方阻止它,就可以下载密钥。此外,可以物理访问 Pi 的人可以快速拔出 SD 卡,进行复制,然后将其插回;如果您不监控正常运行时间以外的任何内容,这看起来像是电源故障。没有办法完全防止这种情况发生。您可以将密钥放在智能卡中,这样可以防止攻击者复制它,但不能窃取智能卡或当场使用它来下载密钥文件。

再一次,您无法防止具有物理访问权限的人快速下载密钥文件,然后窃取磁盘并在闲暇时对其进行解密。如果你想防止这种情况发生,你需要研究防篡改硬件,它的价格范围不同。

  • @kidmose:不要感谢吉尔斯!**;-)** 如果你喜欢这个答案,只需点击极低数字下的小灰色 **☑** 现在将其变成美丽的绿色。如果您不喜欢答案,请单击 0 下方的灰色小向下箭头,如果您*真的*喜欢答案,请单击灰色小复选标记 *和*小向上箭头...如果您有任何进一步的问题,只需[再问一个](http://unix.stackexchange.com/questions/ask)! (3认同)