我需要知道在没有密码的情况下允许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
如果没有,是否有更好的方法可以做到这一点?
答案 0 :(得分:3)
这实际上使您的Web服务器成为攻击站点的主要载体。如果有人可以找到上传任何类型代码的方法,或者将来shell_exec
使用用户变量字符串,那么人们可以在您的网站上执行特权任意代码。
这不适用于可公开访问的服务器。
更好的方法是在系统上编写一个程序,该程序在crontab
中运行,并将这些值打印到一个平面文件,然后用PHP打开该文件。
e.g
#!/bin/bash
service apache2 status
service mysql status
service mongod status
使用sudo crontab -e
* * * * * /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;
答案 1 :(得分:1)
创建Cron作业可以解决您的情况下的问题。 但是,如果您不希望将其作为cron作业,又或者在执行脚本时必须传递动态位置参数怎么办?
因此,一种有效的解决方案是像以前一样将代码放入.sh文件中。
但不要这样做
www-data ALL=(ALL) NOPASSWD:ALL
执行此操作
www-data ALL=(ALL) NOPASSWD: /path/to/your/script.sh
这将确保www-data仅具有特定脚本的特权,而没有其他特权。可以在您的生产服务器上安全地使用它,因为未经root许可,www-data不能运行任何其他脚本。
有帮助