首页 > 解决方案 > 使用 sudoers 来限制 www-data 的脚本文件?(nohup)

问题描述

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

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

当进行 Web 服务调用时,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/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 服务时,“外部”脚本运行并记录此错误:

 sudo: no tty present and no askpass program specified

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

 sudo -u www-data ./upgrade.sh

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

 sudo ./upgrade.sh

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

我尝试过的其他一些 sudoers:

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,但只能使用这些文件。

标签: bashnginxubuntu-16.04fastcgisudoers

解决方案


你可以试试:

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

推荐阅读