这个问题是关于我想要设置的服务的设计。
描述
我的目的是提供一个连接到服务器并提供一些功能的客户端框。
客户端盒子是一台小型计算机,例如 OLinuXino 或 Raspberry-Pi,其中包含一个嵌入式系统,其中包含一些我希望防止被复制的文件(例如安全密钥或可执行文件等信息)。
服务器是服务的集中部分。
受保护文件的大小:从 1kB 到 500kB。
客户端盒子将包含一个 Debian (wheezy) 系统,该系统将是只读的并使用 tmpfs 设置(如图所示)这里)。
我想如何保护它
该系统将包含一些我想隐藏起来的配置和可执行文件,以免被好奇的人看到。因此它们将被高度加密。
由于客户端盒子将连接到服务器并打开反向 ssh 隧道(从服务器到客户端),因此服务器在经过一些验证后将能够解密文件(使用服务器端的密钥)。这些文件一旦解密,将保留在客户端的 RAM 中,直到客户端关闭。
这个客户端盒子将是无头的(没有屏幕,没有键盘)并且完全自动化,但我不确定用户不会尝试连接屏幕或键盘来观看正在发生的事情。
所以我想让服务器检查没有键盘或屏幕连接到客户端。所以它会调用(通过从服务器到客户端的 ssh 远程调用)一些命令
- 检查序列号、MAC 地址、某些文件校验和以及其他系统特定信息,以验证客户端盒子没有受到损害(也没有将整个文件系统复制到另一台机器)
- 检测键盘是否已插入并最终阻止它。
- 关闭所有打开的用户会话。
- 阻止任何新连接(键盘、新会话、设备)
- 检测屏幕是否被插入并阻止任何输出显示。
之后,服务器将远程解密RAM中的文件。
我的第一个问题:您认为这是隐藏我的文件的安全方法吗?我错过了什么 ?
我的第二个问题:对于上面列表中的第 1、2 和 3 项,我很确定我会找到一种方法来做到这一点。但对于第 4 项和第 5 项,我不确定。您有什么建议吗?或者你认为这根本不可能?
欢迎任何建议(例如“不要这样做,这很愚蠢”或“去吧,它会起作用”)!
答案1
我认为,有些事情是你无法阻止的。
在你的地方,我在客户端的闪存驱动器上使用了 2 个分区。第一个用于引导,并加载最小的 C 程序。这个最小的 C 程序联系服务器,并获取第二个分区的解码密钥。这整个过程都是从 initrd 运行的。
成功解码后,系统的第二个真实分区就可以使用了。
最重要的是从内核和用户空间软件中删除所有可能危害您安全的内容。
(从类似但以安全为中心的角度来看,您也可以在 security.stackexchange.com 上询问类似的问题)
答案2
如果你说,你会得到更好的答案什么正是你想要做的而不是如何你想要这样做 - 换句话说:放下巧克力香蕉,远离欧洲货币体系。
TL;DR 总结
问:会起作用吗?
答:可以。
问:这有意义吗?
答:恐怕只是在一些非常具体的假设下。
安全性很难保证 - 您可能想在安全SE对于一般方法。
长版
如果您不希望任何人通过屏幕或键盘干扰盒子,只需禁用适当的内核模块,或者更好地拆焊连接器(我是认真的)。另一方面,我不太确定如果机器上没有运行可以显示某些内容的程序,那么连接屏幕会有什么影响。
然而,这里的关键问题是信任。据我了解,您希望将敏感数据(加密的 E 和临时明文 P)保留在客户端上,将密钥 K 保留在服务器上。为了能够将 E 解密为 P,您将在某个时刻将 K 和 E 放在同一台机器上 - 而此时正是它崩溃的第一个时刻:服务器不够信任客户端,因此它运行一些检查 - 您如何保证检查结果不会被伪造?如果您如此担心有人将键盘连接到客户端设备,您是否不担心JTAG观察它并观察那里发生了什么?如果有人复制客户端,对其进行分析,然后将其与他/她自己的系统交换,同时欺骗测试结果怎么办?
第二个(从我的角度来看更重要)问题是:您将如何处理未加密的数据以及为什么不能在“服务器”上执行此操作?这里的关键点是:如果您不够信任服务器暂时持有RAM中的数据(这里讨论的是客户端向服务器请求解密),为什么你如此信任它永久保存加密数据的密钥在那里?如果您对它不够信任,无法将明文放入其 RAM 中,那么将密钥数据加载到同一内存中并通过网络接口发送是否合理?
如果您决定要通过 ssh 通道使用编辑器中的数据怎么办?你怎么知道有人不会窥探 ssh 连接数据,其中肯定包含明文?
我的建议是寻找一种涉及非常严格的协议的解决方案(最好是已经制定的解决方案,因为推出自己的加密技术通常是一场灾难),该协议将:
验证双方身份,然后
授权客户端向服务器请求解密密钥
授权服务器向客户端提供解密密钥
禁止在通道一侧发出的任何命令直接在另一侧运行 - 即没有以下内容:
user@server$ ssh client -c "decrypt -k key < encrypted > plaintext"
为什么?
一般来说,您不想允许某人远程运行任意命令。通过设置一个特殊的二进制文件,让远程用户选择其中之一,效果会好得多预定义的命令(有点像受限 shell,只是更受限)。如果您的访问令牌遭到破坏,攻击者将只能执行多项操作。虽然在你的情况下这可能意味着最终窃取数据,但这将阻止他将系统变成特洛伊木马。例如
sshd
(至少在 OpenSSH 套件中)在身份验证阶段的工作原理与此完全相同:侦听守护进程创建一个子进程,该子进程会立即删除所有(读取“root”)权限,并将身份验证作为非特权进程处理,该进程请求其特权操作。通过非常受限的 API 进行父级操作。这样,您提供的任何输入都将导致身份验证稍微进展,或者导致系统崩溃无特权的应用程序从而消除了远程 root 攻击的可能性。
最有问题的是第一个。像全员生产管理和TXT可能会有所帮助,但最终你仍然必须相信某人。芯片和固件制造商是否可信不太清楚正如人们所期望的那样。