我有一台刚刚安装了 apache 的服务器。服务器上有一个 php 脚本,我想从中运行 sudo 命令。我一直在网上搜索为什么在 sudoers 文件中授予 www-data sudo nopasswd 访问权限是错误的,但我实际上不明白为什么?如果这是服务器上唯一的 php 脚本,并且服务器的唯一目的是处理这个 php 脚本,那么它是否仍然很危险?如果是这样,我还应该怎么做。我想不通。我正在运行一个 python 脚本,它将使用 os.system() 执行 sudo 命令,这就是我想授予它访问权限的原因。我注意到的另一件事是,当我将它指向仅包含我的 python 脚本的文件夹时,它不起作用。当我将它指向 ALL 时,它起作用了。我不知道该怎么做。谢谢。
答案1
在任何情况下都不允许你的 Web 服务器运行带有 的命令sudo
。即使是非常特定的命令也不行。
这是一个巨大的安全风险。不应授予 Web 服务器访问sudo
命令的权限,从而允许 root 访问命令。尤其是当给定nopasswd
形式时sudo
,如果您的 Web 服务器被攻破,恶意威胁行为者运行的任何命令都可以以上帝权限运行root
,因此您的整个系统都可能遭受数据盗窃、数据删除、损坏和操作系统损坏。
许多 Web 应用程序都不是采用安全方法编写的,如果您的 Apache 安装遭到破坏,您将无法保护自己免受脚本和恶意威胁行为者的攻击,无法运行任何任意命令。
如果你必须授予 Web 服务器以 root 身份运行某些程序的权限,那么你肯定做错了,应该重新评估你正在尝试做的事情。鉴于你的问题没有说明你到底想要实现什么,也没有说明你的脚本到底在做什么,作为系统管理员和安全人员,我唯一能给出的建议是不要尝试授予 Web 服务器sudo
访问权限。
答案2
用户背后的原则www-data
是,它是一个无特权用户。
当您运行守护进程(类似于 Web 服务器的后台程序)时,出于安全目的,最好在启动后放弃权限,以便它在剩余时间内以尽可能低的权限运行。
过去,该nobody
账户经常用于此目的。这样做的好处是,“nobody”这个名字清楚地表明,这应该是一个无特权帐户,没有任何权限。
但是,偶尔会出现例外情况,即有人需要守护进程在此处或此处具有写入权限。修改帐户nobody
将影响所有守护进程。
因此,www-data
诞生了一种只为 Web 服务器设置大多数无特权用户的方法,但与其他守护进程或目的隔离,因此如果你确实需要为该用户帐户授予一些额外的权限,它只会影响 Web 服务器,而不会降低其他系统守护进程。
应为非特权用户这一想法www-data
仍然很重要。您赋予它的权限越多,您就越需要担心如果守护进程(或其运行的任何脚本或命令)受到损害或暴露任何类型的安全漏洞会发生什么。
授予www-data
某些sudo
访问权限是与此原则背道而驰的。虽然可以选择性地使用 sudo 访问权限,但由于可能出现人为错误,或者 Web 服务器或其运行的任何脚本可能存在安全漏洞,因此仍然会带来相当大的安全风险。
如何避免这种情况?
- 有什么方法可以设计任务使其不需要超级用户权限?
- 如果不是,那么任务是否真的需要由 Web 服务器上提供的脚本来运行?如果它由不面向公众的程序(如 Cron)运行,或者通过 SSH 手动运行,则会更安全。