Подтвердить что ты не робот

Как мне получить реальный uid пользователей, если программа запущена с помощью sudo?

Программа, которую я запускаю, требует root-привилегий и поэтому запускается с sudo, но также нужно знать, какой пользователь ее запускает. getuid и geteuid возвращаются root. Как получить фактическое имя пользователя пользователя (или uid)?

Спасибо!

4b9b3361

Ответ 1

sudo предоставляет некоторые переменные среды, которые помогут вам в этом случае:

   SUDO_UID        Set to the user ID of the user who invoked
                   sudo

   SUDO_USER       Set to the login of the user who invoked sudo

steveayre указал в комментариях, что пользователь может установить эти переменные среды в некоторых случаях; справочная страница sudo(8) включает в себя:

The sudoers policy subjects variables
passed on the command line to the same restrictions as normal
environment variables with one important exception.  If the
setenv option is set in sudoers, the command to be run has the
SETENV tag set or the command matched is ALL, the user may set
variables that would otherwise be forbidden.  See sudoers(5)
for more information.

Поэтому убедитесь, что вы не предоставляете пользователям ALL команды, когда вам нужно полагаться на эту функцию.

Ответ 2

Функция, поддерживаемая Linux audit_getloginuid(), предоставляемая системой аудита, может помочь; поскольку pam_loginuid(8) будет установлен только для "основных" демонов (sshd, login, gdm и т.д.), аудита uid останется неизменным при выполнении sudo(8).

Для этого потребуется небольшая конфигурация; добавить:

session    required     pam_loginuid.so

в файл /etc/pam.d/sshd - и любые другие сервисы, которые вы разрешаете своим пользователям.

Убедитесь, что pam_loginuid.so не загружен в конфигурационный файл /etc/pam.d/sudo.

Ответ 3

У вас есть два хороших варианта...

  • Доверяйте sudo и просто используйте его среду
  • Сделайте свою программу setuid-on-execution, а затем geteuid и т.д., будут работать просто отлично.

Update:

бит setuid - это флаг прав доступа в файловом режиме, который заставляет программу запускаться с возможностями владельца исполняемого файла. Так как sudo (1) способен запускать вещи как root... сама программа sudo имеет этот режим.

$ ls -l /usr/bin/sudo
-r-s--x--x  1 root  wheel  272384 Jun 22  2009 /usr/bin/sudo*

Чтобы сделать root setuid программы, можно:

$ chown root a.out
$ chmod +s a.out

Излишне говорить, что корневые программы setuid должны быть написаны тщательно. Вы можете установить для менее привилегированного пользователя, если все, что вам нужно, - это доступ к защищенному каталогу или файлу.