Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 在磁盘上存储密码的安全策略_Security_Unix_Passwords_Cryptography - Fatal编程技术网

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

Security 在磁盘上存储密码的安全策略,security,unix,passwords,cryptography,Security,Unix,Passwords,Cryptography,我正在构建一套批处理作业,这些作业需要定期访问数据库,运行在Solaris 10机器上。由于(不可更改的)设计约束,我们需要使用特定的程序连接到它。该接口要求我们通过命令行传递纯文本密码来连接数据库。这是一种可怕的安全做法,但我们仍在坚持 我正在努力确保我们这边的东西都得到了妥善的保护。由于处理是自动化的(即,我们不能提示输入密码),而且我不能在磁盘外存储任何东西,因此我需要一种安全存储密码的策略 这里有一些基本规则 系统有多个用户 我们可以假设我们的权限得到了正确的执行(即,如果一个文件的ch

我正在构建一套批处理作业,这些作业需要定期访问数据库,运行在Solaris 10机器上。由于(不可更改的)设计约束,我们需要使用特定的程序连接到它。该接口要求我们通过命令行传递纯文本密码来连接数据库。这是一种可怕的安全做法,但我们仍在坚持

我正在努力确保我们这边的东西都得到了妥善的保护。由于处理是自动化的(即,我们不能提示输入密码),而且我不能在磁盘外存储任何东西,因此我需要一种安全存储密码的策略

这里有一些基本规则

  • 系统有多个用户
  • 我们可以假设我们的权限得到了正确的执行(即,如果一个文件的chmod'd为600,那么它就不会公开可读)
  • 我不介意任何拥有超级用户访问权限的人查看我们存储的密码
  • 这是我到目前为止得到的

    • 将密码存储在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体系结构中的问题,这只是一种糟糕的安全实践。您是否希望其他用户能够拦截您的系统调用?我