Я хотел бы знать, есть ли в Ubuntu что-то вроде событий. Мне нужно запустить задание Дженкинса, но у Дженкинса нет привилегий sudo, и я не хочу давать его ему. Но задание должно выполнить некоторые действия, требующие привилегий sudo. Решением может быть запуск события, которое будет прослушиваться от имени пользователя root, и это событие запустит код с привилегиями sudo. Может быть, меня все еще смущают привилегии, но, думаю, это может быть очень кстати. Или что-то вроде общедоступного пользовательского интерфейса root, который будет доступен для других пользователей, но будет работать как пользователь root. Как
root->doSomethingAsRoot()
Надеюсь, вы понимаете, чего я хочу достичь. Спасибо за помощь.
PS Этот вопрос связан с этой проблемой
Окончательное решение этой проблемы, когда Laravel генерирует файлы с помощью chmod 644, - это установить права ACL для родительского каталога через setfacl.
setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage
, где все сгенерированные файлы наследуют настройки acl из родительского каталога. В данном случае rw для группы www-data.
Если действия, которые необходимо запускать от имени root, можно разделить на отдельные процессы / сценарии, то вы можете запустить эти процессы от имени пользователя setuid root. Это очень удобный инструмент, который, на мой взгляд, используется слишком редко.
Что такое setuid-процессы? Взгляните, например, на команду passwd
. Его может запускать любой пользователь, но он должен запускаться от имени пользователя root, поскольку ему необходимо изменить пароль, хранящийся в файле, доступ к которому имеет только root ( / etc / shadow
).
Как это делается? Посмотрите разрешения на двоичный файл / usr / bin / passwd
:
-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd
«s» вместо «x» в поле владельца указывает, что этот двоичный файл будет запускаться с правами его владельца - это корень.
Таким образом, каждый двоичный файл может быть запущен от имени пользователя root (или любого другого пользователя), независимо от того, кто его вызывает.
Однако в сценариях бит setuid игнорируется по соображениям безопасности. Итак, чтобы запустить сценарий от имени пользователя root, вам необходимо использовать двоичную оболочку , которая будет вызывать сценарий изнутри. Вы можете использовать следующую простую программу на C для создания такой оболочки:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int rc;
setuid( 0 );
rc=WEXITSTATUS(system( "/path/to/your/script" ));
exit(rc);
}
Скомпилируйте программу и сделайте исполняемый файл setuid root (предполагая, что исполняемый файл называется wrapper
, выполните sudo chown root: root wrapper
, за которым следует sudo chmod o + s wrapper
).
Кстати. Сценарий, запускаемый изнутри оболочки, не требует setuid; только обертка должна.
Отредактируйте : из вашего объяснения в комментариях похоже, что вы хотите запустить определенную команду rm -rf / some / path
от имени пользователя root и заботитесь о том, чтобы случайно не удалить что-либо еще. В этом случае я предлагаю просто заменить часть / path / to / your / script
в программе-оболочке выше этой самой командой rm -rf / some / path
и просто запустить двоичный файл оболочки
из вашего сценария в том месте, где вы должны выполнить команду rm -rf / some / path
. Это кажется самым безопасным подходом.
Мое прямое решение - запускать бесконечный фоновый сценарий от имени пользователя root, который находит и удаляет необходимые каталоги каждые 10 секунд. Он работает как nohup, поэтому он все еще работает, хотя я закрываю терминал.
while true
do
find /var/www -maxdepth 1 -type d -name 'deploy-old-*' -exec rm -rf {} \;
sleep 10
done