【问题标题】:Storing sudo password as variable in script - is it safe?将 sudo 密码存储为脚本中的变量 - 安全吗?
【发布时间】:2010-09-08 11:55:59
【问题描述】:

这样存储我的密码安全吗?

echo 'Write sudo password (will not be displayed) and hit enter'
read -s password

我需要它来发出这样的命令:

echo $password | sudo -S apt-get install -y foo bar

【问题讨论】:

    标签: bash sudo


    【解决方案1】:

    不,因为你可以通过/proc/$PID/cmdline看到它。

    我建议不要尝试重新发明安全工具。 sudo 程序可以缓存您的密码。

    【讨论】:

    • 当 echo 命令的 /proc 条目存在时,可能会有一个非常短的窗口,但在我看来,“短”是有效术语(以毫秒为单位,或更短)。跨度>
    • 执行strace -o bash.strace -f bash -c 'echo password | cat' 并检查文件bash.strace。您将看到带有execve("/bin/cat", ["cat"], [/* 53 vars */]) = 0 的行,但在那里看不到echo(除了传递给bash 的第一行):它是内置的bash。因此,在 bash 中启动脚本就足以保证它的安全。
    • @ZyX - 感谢您对风险的解释。我以前不会考虑这种类型的解决方案,但我的情况迫使我使用它。很高兴它不像我担心的那样不安全。
    【解决方案2】:

    更好的方法是编辑您的 sudoers 文件并添加不需要密码的程序...

    执行sudo visudo 并添加以下内容以使您的管理员组能够运行 apt-get w/o 密码: %admin ALL = NOPASSWD: /usr/bin/apt-get

    有关详细信息,请参阅 sudoers 手册页。

    【讨论】:

      【解决方案3】:
      echo $password | sudo -S apt-get install -y foo bar 
      

      这有点危险。如果用户已经通过 sudo 的身份验证,sudo 不会再次请求密码,而是将其转发到 apt-get,这可能会导致奇怪的结果(例如,如果 postinstall 脚本提出问题)。我建议使用

      sudo -k                         # remove previous sudo timestamp
      echo $password | sudo -v -S     # create a new one for 15 minutes
      sudo apt-get ...                # execute the command
      

      改为。

      编辑:Dirk 在执行echo 时密码在很短的时间内可见是正确的。请将我的回答视为扩展评论,而不是对您问题的回答。

      【讨论】:

      • 为什么要使用变量 - 为什么不让 sudo 处理提示?我认为第二行应该变成sudo -v -S。保留它的唯一原因是'read -s' 不会回显密码 - 但是sudo 也不会,不是吗?
      • @Jonathan:是的。但是,此类脚本通常用于在多台计算机上执行 sudo(请参见此处的示例:heinzi.at/projects/upgradebest.sh)。然后,不必多次输入密码是有意义的。
      • 很公平 - 我忘了考虑最小化问题,以便在 SO 上提问。
      【解决方案4】:

      sudoopen source,所以你可以编译你自己的版本,将密码作为命令行参数。

      【讨论】:

      • 我强烈建议不要在没有非常充分理由的情况下使用操作系统如此重要部分的自制版本。 (您必须手动应用和重新编译每个补丁等)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多