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

问题描述

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

我有两个脚本,一个调用一个。 “外部”是指由 Web 服务调用并立即返回。而“内部”是从“外部”调用的,它是异步完成的,需要一些 sudo 权限才能执行一些命令。

当进行网络服务调用时,FCGI Wrap 和 Nginx 被配置为使用“www-data用户我需要 www-data 才能使用 sudo 权限无密码调用几个脚本。

我正在运行 Ubuntu 16.04

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

www-data ALL= nopASSWD: ALL

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

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 服务时,“外部”脚本运行并记录此错误

 sudo: no tty present and no askpass program specified

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

 sudo -u www-data ./upgrade.sh

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

 sudo ./upgrade.sh

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

我尝试过的其他一些 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/*