非对称加密文件系统

非对称加密文件系统

我正在处理一些受特定法规管辖且必须以特定方式处理的数据。

我发现由于系统按预期运行,这些数据最终会出现在我的某些日志文件中。我想找到一种方法来在接收该数据的服务器上记录消息,但这样做的方式是,数据在写入磁盘时是加密的,并且可能无法由同一服务器解密。

我的想法是应该有一个文件系统(以 FUSE 系统或其他东西的形式编写 - 我使用的是 Linux),它将目录结构公开为明文,但根据非对称密钥集的一半写入文件内容。这将允许我记录消息并将它们排队以发送到解密密钥所在的日志服务器。

非对称加密的低效(CPU 方面)特性可能使此方法不可行,但我怀疑可能存在解决方案。我搜索后尚未找到任何结果;是否有可以按照所述方式运行的解决方案?感谢您提供任何提示!

答案1

我建议您在应用程序层执行此操作。

在这种情况下,将线程移至 StackOverflow,但我的答案大致如下:

  • 对大量数据(即任何地方)使用非对称加密的正常方式是使用它来加密随机选择的密钥,然后使用对称密码加密其余数据
  • 这是因为对称密码速度更快,通常可以完成更多你想要的事情

我将其设计为将日志文件分成几块,每块包含一个标头,该标头包含使用非对称密码加密的密钥,然后使用该密钥使用对称密码加密一定量的数据。

例如,您可以将 AES / CBC 用于日志数据本身,这将非常快(而且有大量的实现)。

然后每隔一段时间,您的应用程序就会丢弃密钥并启动一个新的“块” - 一旦密钥离开内存,它就无法再解密之前的块。

因此,您可以使用(例如)RSA 加密(使用公钥)某个块的对称密钥,该密钥将为该块安全地随机选择。然后,对称密钥会在内存中保留一段时间,直到该块结束,然后被清除。

支持此功能的文件系统用处有限,因为您只能以只写或只读方式挂载它;操作系统通常不理解只写文件系统的概念:)

答案2

我做了一些研究、编码和文档;这里是使用场景的链接......

https://github.com/S0AndS0/Perinoid_Pipes/blob/master/Documentation/Paranoid_Pipes_Scenario_One.md

...我专门为您和面临类似规定的服务器管理员撰写。在投入生产之前进行测试并阅读警告。

我知道仅靠链接不足以回答这个问题,所以我将深入探讨所提出的解决方案背后的思考过程。

因为日志每次只写入几行,所以单向加密文件系统有点过度杀戮并且超出了我的技能范围,该脚本会自动设置一个特定的文件类型(mkfifo)作为命名管道,以及一组脚本规则,用于监听对命名管道文件进行写操作。然后,这对文件会生成第三个文件,也就是您一直要求的文件,这是一个主机无法读取的加密附加日志文件。该脚本的操作类似于为每个日志操作运行,但是使用命名管道而不是,并且脚本的逻辑处理 gpg 和附加到文件。使用命名管道而不是匿名管道意味着只有日志生成服务的输出路径需要更新以使用命名管道的路径,而不是它的标准文件来利用加密任务。echo 'log message' | gpg -a -r [email protected] >> server.log|

请注意,还有其他功能可能已经有用当日志文件达到用户指定的大小时,可以对其进行加密并通过电子邮件发送,这些功能是分开的,以允许 IDS/IPS 软件有机会解析日志,或者在与每次写入加密结合使用时使发送的日志更难被窥探。

编辑/更新:您可能想要检查缩写的快速启动以查找另一个问题,该问题的范围更为普遍,但足够相似以保证将其纳入该答案中。

https://security.stackexchange.com/a/138877/82480

编辑/更新:看起来 GitHub 上的 markdown 中的链接非常特定于浏览器,因此这里是上述链接文档中场景一的副本。

Web 服务器的自定义使用场景

  • 下载并将脚本复制到${PATH}目录

```

git clone https://github.com/S0AndS0/Perinoid_Pipes
cd Perinoid_Pipes
cp Paranoid_Pipes.sh /usr/local/sbin/
chown ${USER}:${USER} /usr/local/sbin/Paranoid_Pipes.sh
chmod 700 /usr/local/sbin/Paranoid_Pipes.sh

```

  • 显示可用的命令行选项及其当前值。

```

Paranoid_Pipes.sh --help

```

  • 设置命令行选项以在与 Web 服务器应用程序和托管文件系统上的自定义脚本解析器相同的文件系统内写入命名管道。

```

Paranoid_Pipes.sh --copy-save-yn='yes'\
 --copy-save-name="/jailer_scripts/website_host/Web_log_encrypter.sh"\
 --copy-save-ownership="notwwwuser:notwwwgroup"\
 --copy-save-permissions='100'\
 --debug-level='6'\
 --listener-quit-string='sOmErAnDoM_sTrInG_wItHoUt_SpAcEs_tHaT_iS_nOt_NoRmAlY_rEaD'\
 --log-level='0'\
 --named-pipe-name="/jailed_servers/website_host/var/log/www/access.log.pipe"\
 --named-pipe-ownership='notwwwuser:wwwgroup'\
 --named-pipe-permissions='420'\
 --output-parse-name="/jailed_logs/website_host/www_access.gpg"\
 --output-parse-recipient="[email protected]"\
 --output-rotate-actions='compress-encrypt,remove-old'\
 --output-rotate-check-requency='25000'\
 --output-rotate-max-bites='8388608'\
 --output-rotate-recipient="[email protected]"\
 --output-rotate-yn='yes'\
 --output-save-yn='yes'\
 --disown-yn='yes' --help

```

请注意,如果服务器应用程序不在 chroot jail 内,您将需要修改命名管道和脚本副本的文件路径,因为上面假设已经实现了某种形式的文件系统隔离。--help从上面删除以使脚本运行操作,而不是打印命令行选项的当前值。

命名管道文件路径(--named-pipe-name文件路径)应手动添加到您的 Web 服务器的日志路径中,这对于每个守护进程/服务器都是不同的,以便您的正常客户端日志数据被写入命名管道文件。

脚本副本(保存到--copy-save-name文件路径)是魔法通过监听对其相关命名管道文件的写入操作,它通过 GnuPG 推送记录的行并将结果(使用公钥进行--output-parse-recipient初始加密)附加到命令行选项指定的文件中--output-parse-name

监视生成的加密日志文件的文件大小,当文件大小和写入计数器足够大时,使用公钥重新加密日志文件--output-rotate-recipient并移动/重命名。

如果您的服务器能够发送电子邮件,则修改--output-rotate-actions选项以将其email作为有效操作,并且双重加密的日志最终将被传输。

请注意,如果您使用两个不同的公钥进行加密,那么您将需要按照正确的顺序应用相关的私钥进行解密。

相关内容