Рейтинг:2

Есть ли что-то в качестве событий в Ubuntu?

флаг in

Я хотел бы знать, есть ли в Ubuntu что-то вроде событий. Мне нужно запустить задание Дженкинса, но у Дженкинса нет привилегий sudo, и я не хочу ему его давать. Но для работы необходимо выполнить некоторые действия, для которых требуются привилегии sudo. Решение может состоять в том, чтобы инициировать событие, которое будет прослушиваться как пользователь root, и это событие запустит код с привилегиями sudo. Может быть, меня все еще смущают привилегии, но я думаю, что это может быть очень удобно. Или что-то вроде общедоступного пользовательского интерфейса root, который будет доступен для других пользователей, но будет работать как пользователь root. Нравиться

корень-> сделать что-то как корень ()

Надеюсь, вы понимаете, чего я хочу добиться. Спасибо за помощь.

PS Этот вопрос связан с Эта проблема

muru avatar
флаг us
Конечно, во многих вещах для этого используется D-Bus, например, графический интерфейс сетевого менеджера и инструменты командной строки взаимодействуют через D-Bus с демоном сетевого менеджера, который работает от имени пользователя root.
флаг in
Спасибо посмотрю.
флаг in
Хм, я ищу информацию о D-bus, но я не уверен, может ли он запускать скрипт под пользователем root, который будет запускаться другим пользователем.
raj avatar
флаг cn
raj
Разве вы не можете просто предоставить привилегии sudo Дженкинсу **для того конкретного скрипта, который вы хотите запустить**? Sudo не является решением "все или ничего" - как раз наоборот, вы можете очень подробно указать, какой пользователь что может запускать.
флаг in
Поток выглядит так, как будто Дженкинс запускает git clone. Репозиторий Git содержит сценарий bash, который запускает Дженкинс. И скрипт запускает `rm -rf` в конце. И это проблема, потому что мне нужно удалить файлы с 644 разрешениями разных пользователей (www-data). Решение может быть, если я смогу заставить www-data (Laravel) создавать файлы с привилегиями 664.
флаг in
Как я могу добавить привилегии sudo в сценарий для Jenkins? Дженкинс мог переписать сценарий, а потом сделать что угодно. Я знаю, что sudo можно делегировать команде, а не сценарию. Но в данном случае это команда rm, что мало опасно.
raj avatar
флаг cn
raj
@Äamo Вы также можете ограничить право sudo командой **с определенными параметрами**. Поэтому, если сценарий должен, например, запускать `sudo rm -rf /some/path`, вы можете дать Jenkins разрешения только на запуск `rm -rf /some/path`. Конечно, это не полностью предрасположено к попыткам обойти это и удалить другой каталог, но это не просто так. Однако в этом случае я думаю, что самый безопасный подход — запустить двоичный файл setuid, который запускает жестко запрограммированную команду `rm -rf /some/path`.
флаг in
Можно ли использовать скрипт python или php как «двоичный файл setuid»? (конечно нет) Это сводит меня с ума...
флаг in
У меня есть это. Я сделал бесконечный скрипт bash, работающий от имени пользователя root в фоновом режиме, который удаляет каталоги каждые 10 секунд. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-разрешения
raj avatar
флаг cn
raj
Вы уже решили свою проблему другим способом (и, возможно, лучшим, если бы нужно было только изменение разрешений), но я все еще не понимаю, в чем проблема с бинарной оберткой вокруг скрипта, чтобы запустить его от имени пользователя root. Вы просто запускаете оболочку вместо скрипта. Вы по-прежнему можете изменять скрипт по своему усмотрению и делать с ним все, что хотите. И если вы хотите запустить только одну команду (`rm`) от имени root, вы создаете оболочку только для этой команды и запускаете эту оболочку вместо `rm` напрямую. Это очень просто. В чем проблема?
Рейтинг:1
флаг cn
raj

Если действия, которые необходимо выполнять от имени root, можно разделить на отдельные процессы/скрипты, то вы можете запускать эти процессы как root с setuid. Это очень удобный инструмент, который, на мой взгляд, используется слишком редко.

Что такое setuid-процессы? Посмотрите, например, на пароль команда. Его может запустить любой пользователь, но его нужно запускать от имени пользователя root, так как ему необходимо изменить пароль, хранящийся в файле, к которому может получить доступ только root (/и т.д./тень).

Как это делается? Посмотрите разрешения на /USR/бен/пароль бинарный:

-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd

«s» вместо «x» в поле владельца означает, что этот двоичный файл будет запускаться с правами его владельца — root.

Таким образом каждый бинарный можно запустить от имени пользователя root (или любого другого пользователя), независимо от того, кто его вызывает.

Однако на сценарии бит setuid игнорируется из соображений безопасности. Итак, чтобы запустить сценарий в качестве root вам нужно использовать бинарная оболочка который вызовет скрипт изнутри. Вы можете использовать следующую простую программу C для создания такой оболочки:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

основной ()
{
   инт рс;
   сетуид(0);
   rc=WEXITSTATUS(system("/path/to/your/script" ));
   выход(рс);
}

Скомпилируйте программу и сделайте исполняемый файл setuid корневым (при условии, что исполняемый файл называется обертка, делать sudo chown root: корневая оболочка с последующим обертка sudo chmod o+s).

КСТАТИ. Сценарий, который запускается изнутри оболочки, не обязательно должен иметь setuid; только обертка должна.

Редактировать: из вашего объяснения в комментариях видно, что вы хотите запустить определенный rm -rf /некоторые/путь команду от имени пользователя root и заботятся о том, чтобы случайно не удалить что-либо еще. В этом случае я предлагаю просто заменить /путь/к/вашему/сценарию часть в программе-оболочке выше этой самой командой rm -rf /некоторые/путь, и просто запустите обертка двоичный файл из вашего скрипта в том месте, где вы бы запускали rm -rf /некоторые/путь команда. Это кажется самым безопасным способом.

флаг in
Не понимаю. Должно существовать что-то менее сложное. Почему файлы S не исполняются напрямую, а из оболочки? Это не имеет смысла.
raj avatar
флаг cn
raj
@ Äamo Только в **двоичных файлах** бит **s** эффективен. Для **скриптов** это неэффективно, потому что за этим стоят серьезные проблемы с безопасностью. Поэтому сценарии необходимо запускать из **бинарного** файла setuid. У бинарника уже есть права root (потому что он setuid), поэтому при выполнении скрипта он наследует эти права. КСТАТИ. Сценарий, запускаемый из внутренней оболочки, не должен иметь установленный бит **s**. Только обертка нужна.
флаг in
Вот почему люди не используют его. Есть ли что-то вроде событий в Linux? Что-то, что будет слушать как root и выполнять какие-то действия как root?
raj avatar
флаг cn
raj
@Äamo Используя сокеты, вы всегда можете написать клиент-серверное приложение, которое будет прослушивать сокет для входящих данных и выполнять любые действия с этими данными. Обе стороны сокета могут работать под разными пользователями, и это стандартный механизм, используемый многими приложениями для разделения привилегий. Если вы используете, например, (непривилегированный) клиент MySQL, чтобы запросить (привилегированный) сервер MySQL для доступа к базе данных, вы используете именно это. Однако программировать сокеты определенно сложнее, чем вызывать двоичный файл setuid :) Вероятно, вы также можете использовать именованные каналы аналогичным образом.
флаг in
Что такое именованные каналы? Кажется, это невозможно для меня.
raj avatar
флаг cn
raj
@ Äamo, если вы запустите команду типа `mknod /tmp/mypipe p` и предоставите соответствующие разрешения обоим пользователям для `/tmp/mypipe`, процессы, запущенные на разных пользователях, могут взаимодействовать, например. один пишет в `/tmp/mypipe`, а другой читает из `/tmp/mypipe`. Это похоже на обычный канал `|`, но позволяет запускать оба процесса независимо друг от друга. Но я не думаю, что это будет особенно полезно в вашем случае.
marko avatar
флаг tw
Если вы находитесь в графической среде, такой как X11, вы можете вызвать `pkexec` из сценария, указав в качестве первой строки в сценарии следующее: `#!/usr/bin/pkexec /bin/bash`, затем остальные из него работает как root/admin.При запуске скрипта пользователю будет предложено ввести пароль root.
флаг in
У меня есть это. Я сделал бесконечный скрипт, который запускается от имени пользователя root в фоновом режиме и удаляет каталог каждые 10 секунд. Может быть не так круто, но работает как шарм. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-разрешения
флаг in
Окончательное решение — использовать setfacl для родительского каталога.
Рейтинг:0
флаг in

Мое прямое решение — запустить бесконечный фоновый скрипт от имени пользователя root, который находит и удаляет необходимые каталоги каждые 10 секунд. Он работает как nohup, поэтому он все еще работает, хотя я закрываю терминал.

пока правда
делать
  find /var/www -maxdepth 1 -type d -name 'deploy-old-*' -exec rm -rf {} \;
  спать 10
сделано
Рейтинг:0
флаг in

Окончательное решение этой проблемы, когда Laravel генерирует файлы с помощью chmod 644, — это настроить привилегии ACL для родительского каталога через setfacl.

setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage 

где все сгенерированные файлы будут наследовать настройки acl из родительского каталога. В данном случае rw для группы www-data.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.