文件执行脚本中的 Visudo 权限

文件执行脚本中的 Visudo 权限

我正在尝试通过 php 运行 shell 脚本,但遇到权限错误,但是我正在尝试向我的 www-data 用户添加权限,以便在没有密码的情况下使用 sudo 命令,但它不起作用,我不这样做不知道我是否举报有误。以下是我的“visudo”文件的编辑方式。

www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php

我的 PHP 代码是:

$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
// dump($command);
$response = shell_exec($command);

我的代码外壳:

#!/bin/bash

FILE_FROM=/etc/nginx/sites-available/sites-builders
FILE_TO=/etc/nginx/sites-enabled/"$1"

[ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM"

if test -f "$FILE_TO"; then
    echo "syntax is ok. $FILE_TO already exists"
else
        ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/

        #check stats
        if nginx -t > /dev/null 2>&1; then
                echo "syntax is ok"
                service nginx reload
        else
                echo "syntax is not ok"
                rm "$FILE_TO"
        fi
fi

但我的回答是“空”。我通过将以下摘录添加到我的“visudo”中进行了测试

www-data ALL=(ALL) NOPASSWD:ALL

使用我上面提到的方式是可行的,但我相信我的网站的安全性会受到威胁,对吗?为什么我的 apache 用户将拥有 sudo 权限,如果有人放入一些恶意文件,我就会遇到麻烦,所以我带着最初的问题回来,我在执行给定脚本时放置“visudo”路径的方式是正确的?

答案1

你没有运行sudo /var/www/mysite/classes/builder-sites-nginx.sh,你正在运行sudo sh /var/www/mysite/classes/builder-sites-nginx.sh- 并且sudo没有配置为允许 www-data 运行sudo sh(也不应该这样 - 这将是一个巨大的安全漏洞,相当于www-data ALL=(ALL) NOPASSWD:ALL)。

使用 使/var/www/mysite/classes/builder-sites-nginx.sh可执行文件成为可执行文件chmod +x,并确保它#!/bin/bash作为第一行(#!/bin/sh也可以工作,因为您的脚本不使用任何仅限 bash 的功能)。

然后将 PHP 代码修改为:

$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";

顺便说一句,根据$domain定义的位置和方式(即,如果它来自用户提供的数据),您可能需要使用 PHP 的escapeshellcmd()函数来清理它。

相关内容