Rob*_*Rob 5 permissions sudo ruby
我有一个关于系统管理脚本的一般问题,这些脚本需要以 root 访问权限执行“某些”命令,而其他命令则需要作为普通的非 root 用户(即 myusername 等)执行。我应该提到我在 Linux Red Hat 4 系统上使用 Ruby 1.8.6。到目前为止,我看到的建议是:
我为没有更好地掌握这个主题而感到羞耻,但我有点惊讶我提到的多少 Ruby“脚本书籍”没有解决这个问题!我想这更像是一件“不务正业”的事情,但似乎要做任何有实质性用途的事情,您很可能会遇到这种情况。
编辑:像 mysql 这样的一些东西我可以在命令中使用选项,比如 --password 所以我用它来做到这一点:
puts "Remote Password: "
system('stty -echo')
password = STDIN.gets.chomp
puts "Mysql Password (local): "
mysql_local_password = STDIN.gets.chomp
system('stty echo')
Run Code Online (Sandbox Code Playgroud)
然后我可以在脚本中使用这些密码,但它们永远不会被视为明文。但这当然不适用于所有事情。
我要提到的另一件事是,需要以不同用户身份运行的命令(除了 root 和一个普通用户之外,可能还有“构建”用户等)
问题:请帮助我理解这些(以及任何其他提议的或更好的解决方案)的优缺点。此外,如果有一本权威书籍、链接、手册页等,说明脚本如何与底层系统的权限交互,您可以向我推荐,那也很棒。
谢谢大家!
是的,您可以 su 以 root 身份在脚本中使用任何用户,而无需密码。这有点黑客,但它会起作用。在此过程中您可能会遇到一些小问题(例如,当您执行 su 时您的环境会发生变化),但您将能够使其正常工作。我不认为这是“正确的”。此外,root 可以做任何事情,所以您总能找到一种方法以 root 身份做所有事情。
我建议对所有事情都使用 sudo。
对于交互式内容,带有密码提示的 sudo 是可以的。我更喜欢它提示你输入你自己的密码,而不是 root 的。通过这种方式,您可以授予有限的管理权限,而不会泄露 root 的密码(以及完全权限)。必须输入您的密码对于“嘿!我正在输入我的密码,这意味着我正在做一些有潜在危险的事情,让我们在输入之前检查一下”是有好处的。您还可以将 sudo 设置为不重复提示输入密码(即,一旦您输入密码,n 分钟内的 sudo 调用就不会提示)。
此外,您可以让 sudo 让用户以 root 身份执行任何操作,而不仅仅是一组有限的命令。我在我管理的盒子上使用它;它比“su -”更好,为您提供一些开箱即用的审计内容,您可以随时“sudo -i”(或“-s”,有时)来获取root shell等。
对于非交互式的东西,有更多的选择。
我不是很喜欢 suid 二进制文件。这应该仅用于需要 root 权限的非常常用的二进制文件,这些文件非常简单并且已经过彻底审核。例如,ping 需要 root 权限才能完成其工作。但是,suid 二进制文件中的任何安全漏洞都可能非常危险。
使用 ssh 是一种非常复杂的实现方式。
使用 sudo,将其设置为不需要脚本所需的特定命令的密码。“man sudoers”读起来很长,但绝对有趣——你可以用 sudo 做很多事情......
您是否曾经研究过诸如capistrano、puppet、ansible或Chef之类的东西来完成您的任务?
你没有提到你的工作范围是什么,所以我不知道它们对你有没有用。
我会不惜一切代价避免“suid”。安装 sudo 后使用它是没有意义的,这似乎是满足您运行具有不同权限/用户 ID 的命令的要求的最佳选择('sudo -u user2 command2'等)。
此外,您可能希望在基于密钥的 ssh 会话中运行一些无密码 sudo 命令作为允许的命令(ssh sshkeyaccessonlyuser@yourhost 'sudo command')。如果您不想在 sudo 中缓存更长的密码,并且您的脚本无法及时完成运行 sudo 命令,这可以解决缓存问题。