使用 sudoers 限制 www-data 的脚本文件? (没有)

Using sudoers to restrict script files for www-data? (nohup)

我正在尝试在使用 FCGI Wrap 和 NGINX 接收到 Web 服务调用时调用需要 sudo 的 bash 脚本。

我有两个脚本,一个调用另一个。 'outer' 意味着由 Web 服务调用,return 立即调用。虽然 'inner' 是从 'outer' 调用的,但异步完成并需要一些 sudo 权限才能执行某些命令。

进行网络服务调用时,FCGI Wrap 和 NGINX 配置为使用 'www-data' 用户。 我需要 www-data 才能无密码地调用具有 sudo 权限的几个脚本。

我是运行宁Ubuntu16.04

我在 /etc/sudoers.d/ 目录中有一个具有 0440 权限的文件。允许 www-data 运行 脚本。我已经尝试了几种配置,但我唯一可以开始工作的配置是:

www-data ALL= NOPASSWD: ALL

然而,这暴露的太多了,我只需要它在一个目录中使用脚本:/opt/myapp/bin/(...或者两个?/var/www/scripts/ AND /opt/myapp/bin/) 这就是我想开始工作的方式:

www-data ALL= NOPASSWD: /opt/myapp/bin/

在 NGINX 中,我有这个位置可以路由到脚本:

location /scripts/ {
    root /var/www;
    fastcgi_intercept_errors on;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
}

外文:/var/www/scripts/upgrade.sh

#!/bin/bash
echo "Content-type: text/html"
echo ""    
echo "Beginning Upgrade"
sudo nohup /opt/myapp/bin/upgrade_myapp.sh >> /var/log/myapp/upgrade.log 2>&1 &
exit 0

内文:/opt/myapp/bin/upgrade_myapp.sh

#!/bin/bash
echo "[$(date)] : Beginning Upgrade"
echo "[$(date)] : stuff requiring sudo..."
echo "[$(date)] : Completed Upgrade Successfully"
exit 0

当我浏览到 Web 服务时,'outer' 脚本 运行s 和我记录了这个错误:

 sudo: no tty present and no askpass program specified

当我尝试使用 www-data 直接 运行 文件时,系统提示我输入密码:

 sudo -u www-data ./upgrade.sh

如果我直接用具有完整 sudo 功能的普通用户执行它,一切都会 运行 成功。

 sudo ./upgrade.sh

我需要做哪些更改以允许 www-data 用户使用 sudo 调用 'inner' 脚本,以便它可以 运行 中的命令,但不能公开更多访问权限?

我尝试过的其他一些 sudoer:

www-data ALL=NOPASSWD: /opt/myapp/bin/upgrade_myapp.sh 

www-data ALL= NOPASSWD: /var/www/scripts/upgrade.sh, /opt/myapp/bin/upgrade_myapp.sh 

www-data ALL=(ALL) NOPASSWD: /var/www/scripts/
www-data ALL=(ALL) NOPASSWD: /opt/myapp/bin/

www-data ALL=(ALL) NOPASSWD: /var/www/scripts/upgrade.sh
www-data ALL=(ALL) NOPASSWD: /opt/myapp/bin/upgrade_myapp.sh 

www-data ALL=NOPASSWD: /opt/myapp/bin/*, /var/www/scripts/*

更新 看来我的问题是 nohup。删除 nohup 使这项工作。 sudo 试图对 nohup 而不是文件进行操作,但我的 sudoers 文件不包含 nohup。我目前正在寻找确定是否需要 nohup,或者我可以使用 sudoers 来表示我想允许 nohup 但仅限于这些文件。

你可以试试:

www-data myhostname = (root) NOPASSWD: /var/www/scripts/upgrade.sh
www-data myhostname = (root) NOPASSWD: /opt/myapp/bin/upgrade_myapp.sh

sudoers 中的这一行表示 www-data 可以 sudo nohup 命令,仅以该文件夹中的文件作为参数,无密码:

www-data ALL = (root) NOPASSWD: /usr/bin/nohup /opt/myapp/bin/*