我有一个Web项目,我需要在请求特定URL时运行命令,但该命令需要root权限。
该项目使用Python进程(Django)提供,当然不能以root权限运行它。
命令的参数是硬编码的,因此无法注入任何内容,而且它是一个受到保护的应用程序,所以我可以稍微更自由一点安全,因为有权访问它的用户将是值得信赖的(希望如此)。但理想情况下,我想安全地做到这一点。
答案 0 :(得分:5)
使用sudo
选项通过NOPASSWD:
调用命令,该选项允许您进行细粒度的访问控制,并允许您在syslog中免费审核。避免使用shell并使用exec
变量将参数直接作为数组。
答案 1 :(得分:4)
使用setuid:http://en.wikipedia.org/wiki/Setuid
“setuid和setgid(执行时设置用户ID的缩写,分别在执行时设置组ID)是Unix访问权限标志,允许用户使用可执行文件所有者或组的权限运行可执行文件。”
......非常,非常小心!
答案 2 :(得分:1)
通过各种方法避免使用setuid和setgid,您希望保持HTTP服务器的权限尽可能低。对于需要root权限的进程,使用http服务器创建一个全新的单独进程并调用sudo。但是,您不应该在sudoers中包含HTTP服务器uid或gid,而是其他一些可以访问该程序的用户,并且该程序是唯一可以以root身份运行的程序。 HTTP SERVER然后启动一个新进程,它将UID更改为哑用户,然后以root用户身份执行该进程。