在磁盘上存储密码的安全策略

我构build了一套批处理作业,需要定期访问在Solaris 10计算机上运行的数据库。 由于(不可更改)的devise限制,我们需要使用特定的程序来连接它。 所述接口要求我们通过命令行传递明文密码以连接到数据库。 这是一个可怕的安全措施,但我们坚持下去。

我正在努力确保我们的事情得到妥善保护。 由于处理是自动化的(即我们不能提示input密码),而且我不能在磁盘外存储任何东西,所以我需要一个安全地存储密码的策略。

这是一些基本规则

  1. 该系统有多个用户。
  2. 我们可以假设我们的权限是正确执行的(例如,如果一个文件被chmod'd设置为600,那么这个文件不会被公开地读取)
  3. 我不介意有超级用户访问我们存储的密码的人

这是我到目前为止

  • 将密码保存在password.txt中
  • $ chmod 600 password.txt
  • 进程在需要时从password.txt读取
  • 缓冲区不再需要时用零覆盖

虽然我确定有更好的方法。

这不是密码学的解决方案。 无论使用哪种密码,攻击者都可以平等地使用密钥。 Cyrpto不能解决所有问题。

chmod 400是最好的,这使得它只能读取。 chmod 600是读写的,这可能是也可能不是要求。 还要确保它的chown'ed需要它的过程。 这真的是你能做的最好的。 即使你与其他用户共享机器,他们也不应该能够访问它。 希望这是一个专用的机器,在这种情况下,没有太多的威胁。 SELinux或AppArmor将帮助加强跨系统/跨用户攻击的系统。

编辑: Shread是您需要安全删除文件的工具。

编辑:基于Moron / Mike的评论,UNIX命令ps aux将显示所有正在运行的进程和用于调用它们的命令。 例如,以下命令将暴露给系统中的所有用户: wget ftp://user:password@someserver/somefile.ext 。 一个安全的选择是使用CURL库。 你也应该禁用你的shell历史记录。 在bash中,你可以通过设置一个环境变量export HISTFILE=来做到这一点

考虑到你的限制,你离最好的办法还不远。 你有两个问题需要处理。 首先是密码存储。 第二个是安全地使用密码。

首先处理第二个问题 – 在使用命令行程序时遇到一个大问题。 使用“ps”命令的选项,用户可以看到运行命令行程序中使用的参数。 从你写的,这将包含纯文本的密码。 你提到这是一个不可改变的界面。 即便如此,作为一个道德程序员,你应该提出这个问题。 如果这是一个处理金融交易的银行申请,你可能会考虑找到另一份工作,而不是成为不道德的解决方案的一部分。

继续安全地存储密码,您不会提及您正在使用您的批处理文件的语言。 如果你使用的是shell脚本,那么你只能在shell脚本中对密码进行硬编码,或者从文件中以纯文本的形式读取密码。 从你将密码存储在一个单独的文件中的描述中,我希望你可能正在用编译语言编写一个程序。 如果是这样,你可以做得更好一点。

如果使用编译语言,则可以加密文件中的密码并在程序中解密。 解密的关键在于程序本身,所以不容易读取。 除此之外,我会的

  • chmod 400该文件以防止其他用户读取它
  • 在文件中添加一个点前缀('。')以将其从正常的目录列表中隐藏
  • 重命名文件,使其不太有趣的阅读。
  • 注意不要将密钥存储在一个简单的字符串中 – “strings”命令将从一个unix可执行映像打印所有可打印的字符串。

做完这些事情后,下一步就是改善关键管理。 但是,直到“PS”问题被解决,我不会走得太远。 当你打算离开窗户的时候,把第三个死锁放在前门上是毫无意义的。

不要用零填充密码缓冲区,这是毫无意义的。 内核可以决定将其交换到交换文件中的任意位置,或者在分配了一些内存之后,内核会移动页表,导致其他页表包含密码,而只能访问新的副本。

您可以使用PR_SET_NAME prctl(2)来即时更改进程名称。 不幸的是,我现在不能想办法通过ptrace(2)向正在运行的进程中注入一些代码,这意味着在你有机会改变新进程名称之前,敌方进程将竞相读取进程列表:/

或者,您可以获取grsecurity内核修补程序,然后打开CONFIG_GRKERNSEC_PROC_USER:

如果您在这里说Y,非root用户将只能查看自己的进程,并限制他们查看网络相关信息,查看内核符号和模块信息。

这将停止ps能够查看运行命令,因为ps/proc/<pid>/cmdline读取

所述接口要求我们通过命令行传递明文密码以连接到数据库。 这是一个可怕的安全措施,但我们坚持下去。

由于O / S体系结构的问题,这只是一个不好的安全实践。 你希望其他用户能够拦截你的系统调用吗? 我不会责怪一个陷入这个陷阱的开发者。