Security 在磁盘上存储密码的安全策略
我正在构建一套批处理作业,这些作业需要定期访问数据库,运行在Solaris 10机器上。由于(不可更改的)设计约束,我们需要使用特定的程序连接到它。该接口要求我们通过命令行传递纯文本密码来连接数据库。这是一种可怕的安全做法,但我们仍在坚持 我正在努力确保我们这边的东西都得到了妥善的保护。由于处理是自动化的(即,我们不能提示输入密码),而且我不能在磁盘外存储任何东西,因此我需要一种安全存储密码的策略 这里有一些基本规则Security 在磁盘上存储密码的安全策略,security,unix,passwords,cryptography,Security,Unix,Passwords,Cryptography,我正在构建一套批处理作业,这些作业需要定期访问数据库,运行在Solaris 10机器上。由于(不可更改的)设计约束,我们需要使用特定的程序连接到它。该接口要求我们通过命令行传递纯文本密码来连接数据库。这是一种可怕的安全做法,但我们仍在坚持 我正在努力确保我们这边的东西都得到了妥善的保护。由于处理是自动化的(即,我们不能提示输入密码),而且我不能在磁盘外存储任何东西,因此我需要一种安全存储密码的策略 这里有一些基本规则 系统有多个用户 我们可以假设我们的权限得到了正确的执行(即,如果一个文件的ch
- 将密码存储在password.txt中
- $chmod 600 password.txt
- 进程在需要时读取password.txt
- 不再需要时用零覆盖缓冲区
虽然我相信有更好的方法 这不是加密的解决方案。无论使用何种密码,攻击者都可以平等地访问密钥。Cyrpto并不能解决所有问题 chmod400是最好的,这使它成为只读的。chmod 600为读写,这可能是一项要求,也可能不是。也要确保它能被需要它的过程所改变。这是你能做的最好的了。即使您与其他用户共享计算机,他们也不应该能够访问它。希望这是一个专用的机器,在这种情况下没有太大的威胁。SELinux或AppArmor将有助于增强系统的抗跨进程/跨用户攻击能力 编辑: 是安全删除文件所需的工具
编辑:根据莫伦/Mike的评论,unix命令
ps aux
将显示所有正在运行的进程以及用于调用它们的命令。例如,以下命令将向系统上的所有用户公开:wgetftp://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//cmdline
所述接口要求我们通过
命令上的纯文本密码
行以连接到数据库。这
这是一种可怕的安全措施,但是
我们被困住了
由于O/s体系结构中的问题,这只是一种糟糕的安全实践。您是否希望其他用户能够拦截您的系统调用?我