Бит Setuid на python script: Linux против Solaris
Я запускаю этот небольшой python script как для Linux, так и для Solaris как для не привилегированного пользователя:
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
Перед запуском бит setuid устанавливается в script (не на интерпретаторе python):
chown root:myusergrp getuid.py
chmod 4750 getuid.py
В Solaris эффективный uid устанавливается из-за бит setuid:
uid,euid = 10002 0
Но не в Linux:
uid,euid = 10002 10002
Обратите внимание: версия python равна 2.6 для Solaris и Linux
Возможно ли, что Python Linux работает как Python Solaris?
Ответы
Ответ 1
Большинство дистрибутивов Unix обычно не позволяют вам использовать setuid в файле, который использует #! переводчик. Solaris оказывается той, которая позволяет это благодаря использованию более безопасной реализации, чем большинство других дистрибутивов.
См. эту часто задаваемую запись для получения дополнительной информации о том, почему механизм настолько опасен: Как я могу заставить скрипты оболочки setuid работать?
См. эту ссылку для более подробного обсуждения и как скомпилировать исполняемый файл setuid, который будет запускать ваш script: setuid в сценариях оболочки
Соответствующая часть:
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}
Ответ 2
Я просто поставил два и два вместе сегодня и придумал альтернативное решение: cython --embed
.
Следуйте приведенным выше ссылкам по ссылке, и вы получите бинарные исполняемые файлы с вашего Python, чтобы вы могли chown
и chmod u+s
, заполнив круг без программы-обертки.
Конечно, будьте осторожны с рисками (из этого или любого другого использования setuid
) -bugs в вашем script может привести к повышенным привилегиям в системе.
Ответ 3
Вы можете использовать sudo для достижения того, чего хотите. Он работает как разные пользователи:
sudo -u otheruser command
Разрешения устанавливаются корнем с помощью visudo. Материал setuid/setguid не применяется к скриптам или оболочке в linux, только скомпилированный код.