设置:我使用带有 USB HDD 的树莓派,运行 arch linux 并同步事物用于我自己的“云”同步。
问题:如果发生物理侵入导致 HDD pi 和 HDD 被盗,我想确保 HDD 上的文件保持机密。
当前的高级想法:加密硬盘,将密钥存储在网络服务器上。启动时,下载密钥、解密并安装。不要将密钥存储在 HDD/SD 卡上。如果发生盗窃,请停止从网络服务器提供密钥。
问:如何着手实施?
( crypttab 可以解决这个问题吗?编写我自己的 systemd 单元是可行的方法吗?欢迎任何其他想法,甚至解决方案)
答案1
最简单的设置方法是拥有一个明文系统分区(我猜是在 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.cert
或curl --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
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
或具有 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
在服务器端配置基本身份验证可能更容易设置。使用随机生成的密码,不含特殊字符(例如</dev/urandom | head -c 16 | base64
)。
请注意,无论您做什么,窃取 Pi 的人都会获得密码,并且如果您不首先在发送方阻止它,就能够下载密钥。此外,能够物理访问 Pi 的人可以快速拔出 SD 卡,制作副本,然后将其插回;如果您除了正常运行时间之外不监控任何其他内容,这看起来就像是电源故障。没有办法完全防止这种情况。您可以将密钥放入智能卡中,这可以防止攻击者复制密钥,但不能窃取智能卡或当场使用它下载密钥文件。
再次强调,您无法防止具有物理访问权限的人快速下载密钥文件,然后窃取磁盘并在闲暇时对其进行解密。如果您想防止这种情况发生,您需要研究防篡改硬件,其价格范围不同。
答案2
我使用稍微不同的解决方案解决了同样的问题:因为我使用的是 ZoL,所以我更喜欢使用 EcryptFS。另外,因为我希望密钥可以访问,所以我将其加密存储在文件交换服务(例如 Dropobox)中。那么,程序是:
a) A systemd unit connects to the file exchange service, downloads the key and
decrypts it.
b) The dependent systemd units wait until the previous has finished and then use
the decrypted key to mount the file systems.
c) I have a service that monitors a box switch, so if the server box is opened I
receive an alert via pushbullet and the key is deleted from dropbox.
这个想法是,当服务器的物理完整性受到损害、服务器被盗等时,密钥将从保管箱中删除,并且数据变得不可读。