允许 www-data 在没有密码的情况下执行命令安全吗?

Is allowing www-data to execute commands without a password safe?

我想知道允许 www-data 在没有密码的情况下执行 sudo 命令是否安全?

我正在使用它从 php 脚本执行终端命令,但这不适合我们的实时生产服务器?

这里是 sudoers 文件。

www-data ALL=(ALL) NOPASSWD:ALL

这是我尝试 运行 外部远程服务器的命令示例。 我正在使用 ssh2_exec 到 运行 这个。

sudo service apache2 status;sudo service mysql status;sudo service mongod status

如果没有,是否有更好的方法可以做到这一点?

这实质上使您的 Web 服务器成为网站攻击的主要媒介。如果有人能找到一种方法来上传任何类型的代码,或者在未来某个时刻您 shell_exec 使用用户变量字符串,人们就可以在您的站点上执行特权任意代码。

这不适用于可公开访问的服务器。

更好的方法是在您的系统上编写一个程序,该程序在 crontab 中运行并将这些值打印到一个平面文件中,然后在 PHP 中打开该文件。

例如

#!/bin/bash

service apache2 status
service mysql status
service mongod status

使用 sudo crontab -e

将此添加到根用户 cron
* * * * * /path/to/script > /home/my-user/file

您可能还需要使文件全局可读(在创建后);这只是一个可能安全的状态:

sudo chmod 777 /home/my-user/file

然后在PHP

<?php

$status = file_get_contents('/home/my-user/file');
echo $status;

创建一个 cron 作业可以解决您遇到的问题。 但是,如果您不想将其作为 cron 作业,或者如果您在执行脚本时必须传递动态位置参数怎么办?

因此,一个有效的解决方案是像您一样将代码放入 .sh 文件中。

但不是做

www-data ALL=(ALL) NOPASSWD:ALL

这样做

www-data ALL=(ALL) NOPASSWD: /path/to/your/script.sh

这将确保 www-data 仅对该特定脚本具有提升的权限,而不是其他任何内容。这可以在您的生产服务器上安全地使用,因为 www-data 不能 运行 没有 root 权限的任何其他脚本。

我发现这个答案对 https://anto.online/code/how-to-run-php-script-root/

很有帮助