我有一个 bash 脚本,需要在使用时执行一些操作sudo
,既需要 root 用户权限,也需要其他用户的权限,例如 postgres 数据库上的主用户。这些操作需要在不使用密码的情况下执行,主要操作是复制一些由列表文件指定的文件,这些文件只能由 root 访问,查询是否存在具有特定名称的 postgres 数据库以及从数据库中转储。
运行脚本的用户负责运行相当多不同的脚本。我知道我可以用如下一行来编辑/etc/sudoers
文件:visudo
user ALL=(pg_dump_user) NOPASSWD:/usr/bin/pg_dump
或者
user ALL=(pg_dump_user) NOPASSWD:/usr/bin/psql -lqt
我知道我可以使 sudoers 文件中的命令更具体一些,添加命令选项等。
调用一个脚本,该root
脚本只能由 sudoers 条目中的脚本编辑和使用,这样会更安全吗?显然,使用这种方法,我需要确保脚本位置的目录权限正确,否则它可能会被恶意内容替换。我还可以采取其他措施使其更安全吗?
答案1
最简单的解决方案就是在 sudoers 中启用脚本。这不会引发诸如脚本被替换之类的问题……只要所有父目录都不能被非 root 用户写入。但是,脚本中的任何安全漏洞都将以目标用户的身份运行,这可能会引发一些令人讨厌的事情。
最安全的解决方案是仅在必要时在脚本中使用 sudo 升级,或者非常小心地编写脚本并让熟悉您的安全问题的人员审核其代码。
在@muru 对这个问题的第二条评论,人们认为脚本语言(和代码)越简单,就越不容易出现安全漏洞。我同意这一点。将其限制为 dash(假设您有破折号为 /bin/sh) 确实会有所帮助。使用像 python 这样更全面的语言会增加你想要的东西和可能出错的东西的可能性,所以如果你比简单的 POSIX shell 脚本更熟悉它,我才会建议你使用它。
归根结底,这取决于您的代码的作用。弄清楚您的风险以及控制这些风险需要付出多少努力,然后权衡利弊。谁会滥用这个功能?Sudo 会留下审计线索,那么被解雇或开除的威胁是否足以让潜在的滥用者听话?