使用 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/*
我正在尝试在使用 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/*