Выполнение одной команды от имени другого пользователя; ограничения на sudo

Выполнение одной команды от имени другого пользователя; ограничения на sudo

Я работаю на машине, где у меня нет root, но есть список разрешенных sudoкоманд. Одна из этих команд — /bin/su - foouser. Так что я могу набрать sudo su - foouser, и я получаю интерактивную оболочку как foouser. Затем я могу запустить что-то как foouser.

Проблема в том, что foouserэто общий пользователь/оболочка, которая используется для запуска некоторых важных производственных процессов. Я не могу легко настроить его или настроить так, как хочу. И я не должен работать в нем постоянно, что разделяет мои терминалы и историю команд между теми, где я вошел как я, и теми, где я foouser.

Что мне действительно хотелось бы сделать, так это иметь способ запустить одну команду как foouser, заблокировать ее, вывести stdout и stderr в мою оболочку, как это обычно делает команда, а затем вернуться, когда я все еще вошел в систему как я (а не foouser). Это можно, например, инкапсулировать в скрипт, чтобы он as_foo barзапускал команду barкак foouser, вывел stdout и stderr, вернул код возврата bar, а затем вернул меня обратно в мою оболочку.

Я могу попросить системных администраторов изменить разрешения. Например, они могли бы добавить barв список sudo, и тогда я мог бы использовать (я думаю) su -cдля запуска bar в том виде, как я описал. Но затем, если на следующий день я захочу запустить bar2, мне придется снова с ними поговорить.

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

решение1

sudo su - foouser <command>Для запуска от имени root вам необходимо иметь хотя бы ограниченный доступ root su - foouser <command>.

sudo -u foouser <command>можно сделать то, что вы хотите, за один шаг. Но это требует, чтобы системный администратор предоставил вам sudoдоступ к foouserучетной записи следующим образом:

ignacio ALL=(foouser) ALL

вместо этого:

ignacio ALL=(root) su - foouser

sudoТакая настройка позволит вам определить, например, псевдоним, как вы задумали:

as_foo='sudo -u foouser'

И избегая su -, вы можете иметь возможность продолжать использовать свои собственные настройки: использование sudoтаким образом изменяет только идентификатор пользователя, но сохраняет HOMEего предыдущее значение, считывая любые сценарии запуска оболочки и другие настройки изтвойдомашний каталог вместо foouser's.

(Разумеется, эти скрипты должны быть доступны для чтения и этому другому пользователю, и любые общие скрипты, которые вы можете запустить, должны foouserявно ссылаться на домашний каталог пользователя как , /home/foouserа не просто $HOME.)

Однако есть некоторые sudoнастройки, которые могут помешать этому решению работать: если always_set_homeопция sudo установлена ​​в файле sudoers или если env_resetопция установлена ​​без добавления HOMEв env_keepсписок, HOMEона будет сброшена в любом случае. В такой ситуации попробуйте добавить опцию -Eв sudoкоманду, чтобы явно запросить сохранение вашей среды.

И когда вы действительно хотите запустить что-то foouserс точно такой же настройкой среды, как при входе в систему foouser(т. е. эквивалент sudo su - foouser), добавьте -iопцию, чтобы специально запросить это. Так же как sudo -i -u foouserи 100% точная замена sudo su - foouser.

Если вы найдете какую-то систему с такой древней версией, sudoчто в ней нет этой -iопции, используйте -Hопцию с sudo: это не идеальная замена, но ее может быть достаточно. Такая старая версия, sudoскорее всего, также будет иметь некоторые известные ошибки, связанные с безопасностью, поэтому ее стоит обновить в любом случае.

Вы можете использовать sudo -las yourself, чтобы точно узнать, как определен ваш доступ к sudo и какие параметры sudo (т. е. записи по умолчанию) действуют для вас.

решение2

Передайте дополнительные аргументы в su.

sudo su - foouser sh -c 'echo $USER'

Связанный контент