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

时间:2010-05-19 18:47:46

标签: security unix passwords cryptography

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

我正在努力确保事情得到妥善保护。由于处理是自动化的(即,我们无法提示输入密码),并且我无法在磁盘外存储任何内容,因此我需要一种安全存储密码的策略。

以下是一些基本规则

  1. 系统有多个用户。
  2. 我们可以假设我们的权限得到了正确执行(例如,如果一个文件的chmod为600,那么它将不会公开阅读)
  3. 我不介意任何有超级用户访问权限的人查看我们存储的密码
  4. 这是我迄今为止所得到的

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

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

3 个答案:

答案 0 :(得分:5)

这不是加密的解决方案。无论使用何种密码,攻击者都可以同样访问密钥。 Cyrpto没有解决所有问题。

chmod 400是最好的,这使它只读。 chmod 600是读写,可能是也可能不是。还要确保它需要它的过程。这是你能做的最好的事情。即使您与其他用户共享计算机,他们也应该无法访问它。希望这是一台专用机器,在这种情况下,没有太大的威胁。 SELinux或AppArmor将帮助加强系统免受跨进程/跨用户攻击。

修改 shred是安全删除文件所需的工具。

编辑:根据Moron / Mike的评论,unix命令ps aux将显示所有正在运行的进程以及用于调用它们的命令。例如,以下命令将向系统上的所有用户公开:wget ftp://user:password@someserver/somefile.ext。一种安全的替代方法是使用CURL库。您还应该禁用shell历史记录。在bash中,您可以通过设置环境变量export HISTFILE=

来完成此操作

答案 1 :(得分:2)

鉴于您的约束,您距离最佳方法不远。你有两个问题要处理。首先是密码存储。第二个是安全地使用密码。

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

继续安全地存储密码,您不会提到您的批处理文件使用的语言。如果您使用的是shell脚本,那么除了在shell脚本中对密码进行硬编码或从文件中以纯文本格式读取密码之外,您几乎没有办法。从您在单独文件中存储密码的描述中,我希望您可能正在编写一种编译语言的程序。如果是这样,你可以做得更好。

如果使用编译语言,您可以加密文件中的密码并在程序中解密。解密的关键在于程序本身,因此无法轻松读取。除此之外,我会

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

完成这些工作后,接下来的步骤将是改进密钥管理。但是,在'ps'问题得到解决之前,我不会走得这么远。当你打算打开窗户时,把第三个锁舌放在前门上是没有意义的。

答案 2 :(得分:0)

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

您可以使用PR_SET_NAME prctl(2)来动态更改进程名称。不幸的是,我现在无法想到除了通过ptrace(2)将一些代码注入正在运行的进程之外的任何其他方式,这意味着在您有机会更改新进程名称之前,敌方进程将竞争读取进程列表:/ < / p>

或者,您可以获取grsecurity内核补丁,并启用CONFIG_GRKERNSEC_PROC_USER:

  

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

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

  

所述界面要求我们传递一个   命令上的纯文本密码   用于连接数据库的行。这个   是一种可怕的安全措施,但是   我们坚持下去。

由于O / S架构存在问题,这只是一种糟糕的安全措施。您是否希望其他用户能够拦截您的系统调用?我不会责怪陷入这个陷阱的开发人员。