Как мне получить реальный uid пользователей, если программа запущена с помощью sudo?
Программа, которую я запускаю, требует root-привилегий и поэтому запускается с sudo
, но также нужно знать, какой пользователь ее запускает. getuid
и geteuid
возвращаются root
. Как получить фактическое имя пользователя пользователя (или uid)?
Спасибо!
Ответы
Ответ 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 должны быть написаны тщательно. Вы можете установить для менее привилегированного пользователя, если все, что вам нужно, - это доступ к защищенному каталогу или файлу.