«Операция не разрешена» при использовании os.setuid () [python] - PullRequest
5 голосов
/ 23 сентября 2011

Я пытаюсь создать платформу для запуска некоторых скриптов. Эти скрипты размещаются в домашней папке каждого пользователя. Каждый запуск должен выполняться с каждым идентификатором пользователя, поэтому я делаю для каждого пользователя следующее:

user_id = pwd.getpwnam( user )[ 3 ]
user_home = pwd.getpwnam( user )[ 5 ]

os.chdir( user_home )
os.setuid( user_id )

subprocess.Popen( shlex.split( "user_script.py" ) )

Но, когда Python пытается выполнить os.setuid( user_id ), возникает это исключение:

Traceback (most recent call last):
  File "launcher.py", line XX, in <module>

OSError: [Errno 1] Operation not permitted

Кстати, пользователь, который запускает этот скрипт, находится в корневой группе (в ОС GNU / linux) и у него есть все привилегии root.

Если я пытаюсь запустить тот же код с пользователем root, я получаю другую ошибку:

OSError: [Errno 13] Permission denied

Если кто-то может помочь мне понять, что происходит, пожалуйста ...

Ответы [ 5 ]

5 голосов
/ 23 сентября 2011

Только root может сделать setuid, но недостаточно быть в корневой группе.

2 голосов
/ 23 сентября 2011

Только суперпользователь может изменить uid, когда захочет, просто добавить пользователя в корневую группу недостаточно.

setuid(2) например, упоминает:

 The setuid() system call is permitted if the specified ID is equal to the
 real user ID or the effective user ID of the process, or if the effective
 user ID is that of the super user.

В Linux также есть:

   Under Linux, setuid() is implemented like the POSIX version with the 
   _POSIX_SAVED_IDS feature.  This allows a set-user-ID (other than  root)
   program to drop all of its user privileges, do some un-privileged work, and
   then reengage the original effective user ID in a secure manner.

Я даже не знаю, реализует ли это Python напрямую, но в любом случае это не совсем то, что вам нужно.

Итак, краткий ответ: Запустите начальный процесс от имени пользователя root.

Если вы беспокоитесь о безопасности, запустите два процесса, один с правами root, другой как непривилегированный пользователь, и пусть непривилегированный процесс связывается с корневым процессом с помощью сокета. Это более продвинутая настройка, хотя ...

0 голосов
/ 23 июля 2014

вы также используете разрешение setuid. То есть дают,

       chmod 4755 script.py

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

0 голосов
/ 23 сентября 2011

Строка

subprocess.Popen( shlex.split( "user_script.py" ) )

смущает меня различными способами.

  1. Кажется, что shlex.split() избыточен, поскольку разбивать нечего.
  2. Лучше поместить параметр Popen() в список.
  3. Если user_script.py не имеет разрешений на выполнение, даже root не может этого сделать.
0 голосов
/ 23 сентября 2011

OSError: [Errno 1] Operation not permitted указывает, что у пользователя, запускающего скрипт, недостаточно прав. Находиться в корневой группе недостаточно, ему действительно нужна возможность CAP_SETUID.

OSError: [Errno 13] Permission denied, вероятно, несвязанная ошибка. Вы должны взглянуть на его трассировку стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...