Использование sudoers для ограничения файлов сценариев для www-данных? (нет)

Я пытаюсь вызвать сценарий bash, требующий sudo, при получении вызова веб-службы с использованием FCGI Wrap и NGINX.

У меня есть два сценария, один вызывает другой. «Внешний» должен вызываться веб-службой и немедленно возвращаться. В то время как «внутренний» вызывается из «внешнего», он завершается асинхронно и требует некоторых привилегий sudo для выполнения некоторых команд.

При вызове веб-службы FCGI Wrap и NGINX настраиваются на использование пользователя www-data. Мне нужны www-данные, чтобы иметь возможность вызывать только несколько скриптов с привилегиями 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

Когда я перехожу к веб-службе, запускается «внешний» скрипт, и я регистрирую эту ошибку:

 sudo: no tty present and no askpass program specified

Когда я пытаюсь запустить файл напрямую с www-данными, мне предлагается ввести пароль:

 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, но только с этими файлами.


person fei0x    schedule 22.02.2021    source источник
comment
Возможно, вы захотите переместить это в Unix и Linux.   -  person SiKing    schedule 22.02.2021
comment
@SiKing, спасибо. У меня есть очки для запуска баунти, так что я, наверное, сначала попробую.   -  person fei0x    schedule 22.02.2021


Ответы (2)


Вы можете попробовать:

www-data myhostname = (root) NOPASSWD: /var/www/scripts/upgrade.sh
www-data myhostname = (root) NOPASSWD: /opt/myapp/bin/upgrade_myapp.sh
person Doyle B    schedule 22.02.2021
comment
Я предполагаю, что myhostname будет таким же, как server_name в моей конфигурации nginx. Если это так, это не сработало. - person fei0x; 23.02.2021
comment
Я считаю, что это правильно. Вы можете получить его из командной строки, запустив: hostname - person Doyle B; 23.02.2021

эта строка в sudoers означает, что www-data может выполнять команды sudo nohup только с файлами в этой папке в качестве параметров, без пароля:

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