需要(某些)根访问权限的脚本

Rob*_*Rob 5 permissions sudo ruby

我有一个关于系统管理脚本的一般问题,这些脚本需要以 root 访问权限执行“某些”命令,而其他命令则需要作为普通的非 root 用户(即 myusername 等)执行。我应该提到我在 Linux Red Hat 4 系统上使用 Ruby 1.8.6。到目前为止,我看到的建议是:

  1. 允许来自 sudoers 的访问:
    USERNAME = NOPASSWD: /path/to/script, /etc/init.d/httpd, /path/to/somethingelse
    这个语法正确吗?如果是这样,我是否想在脚本中列出我不想提示输入密码的所有特定命令,这是否正确?

  2. 设置 suid
    http://www.wellho.net/mouth/733_Perl-for-Systems-Admin-suid-scripts.html
    以 root 权限运行 Perl 脚本:
    a) 将脚本的所有者设置为 root
    b) 设置(chmod u+s filename) 文件上的 suid 位
    c) 关闭对文件的读取权限,并对除 root 之外的所有人打开执行权限 (chmod go=x)
    但其他研究表明您只能在二进制文件上设置 suid更高版本的 Linux 系统(我的脚本实际上将在较旧版本的 RH4 上运行,但我们最终可能会升级,因此我希望向前兼容)。我不认为我想为此创建一个二进制文件!

  3. '将 ssh 与生成的公钥/私钥一起使用。可以将密钥配置为仅允许使用它执行某些命令。

  4. 对于任何需要 root 的脚本命令,保留 sudo:
    system 'sudo rake ts:rebuild'(当然,这有所有这些密码提示的缺点!)

  5. 以 root 身份执行脚本
    但是我想以普通用户身份运行的命令呢?

  6. 以root身份执行su username(对于需要以普通用户
    身份运行的任务)'以root身份运行脚本,以root身份执行一堆任务,su newUser以newUser身份执行一堆任务,退出(退出回到root用户) 以 root 身份执行更多任务。(由詹姆斯在下面提出)

我为没有更好地掌握这个主题而感到羞耻,但我有点惊讶我提到的多少 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 和一个普通用户之外,可能还有“构建”用户等)

问题:请帮助我理解这些(以及任何其他提议的或更好的解决方案)的优缺点。此外,如果有一本权威书籍、链接、手册页等,说明脚本如何与底层系统的权限交互,您可以向我推荐,那也很棒。

谢谢大家!

ale*_*lex 5

是的,您可以 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 做很多事情......


mon*_*yth 2

您是否曾经研究过诸如capistranopuppetansibleChef之类的东西来完成您的任务?

你没有提到你的工作范围是什么,所以我不知道它们对你有没有用。

我会不惜一切代价避免“suid”。安装 sudo 后使用它是没有意义的,这似乎是满足您运行具有不同权限/用户 ID 的命令的要求的最佳选择('sudo -u user2 command2'等)。

此外,您可能希望在基于密钥的 ssh 会话中运行一些无密码 sudo 命令作为允许的命令(ssh sshkeyaccessonlyuser@yourhost 'sudo command')。如果您不想在 sudo 中缓存更长的密码,并且您的脚本无法及时完成运行 sudo 命令,这可以解决缓存问题。