我正在构建一套批处理作业,需要定期访问在Solaris 10计算机上运行的数据库。由于(不可变)的设计约束,我们需要使用某个程序来连接它。所述接口要求我们通过命令行传递明文密码以连接到数据库。这是一种可怕的安全措施,但我们坚持使用它。
我正在努力确保事情得到妥善保护。由于处理是自动化的(即,我们无法提示输入密码),并且我无法在磁盘外存储任何内容,因此我需要一种安全存储密码的策略。
以下是一些基本规则
这是我迄今为止所得到的
虽然我确信有更好的方法。
答案 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脚本中对密码进行硬编码或从文件中以纯文本格式读取密码之外,您几乎没有办法。从您在单独文件中存储密码的描述中,我希望您可能正在编写一种编译语言的程序。如果是这样,你可以做得更好。
如果使用编译语言,您可以加密文件中的密码并在程序中解密。解密的关键在于程序本身,因此无法轻松读取。除此之外,我会
完成这些工作后,接下来的步骤将是改进密钥管理。但是,在'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架构存在问题,这只是一种糟糕的安全措施。您是否希望其他用户能够拦截您的系统调用?我不会责怪陷入这个陷阱的开发人员。