Я пытаюсь вызвать сценарий 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, но только с этими файлами.