Есть ли что-то между обычной учетной записью пользователя и root? - PullRequest
3 голосов
/ 30 октября 2008

Я разрабатываю приложение, которое управляет сетевыми интерфейсами от имени пользователя и вызывает несколько внешних программ (таких как ifconfig), которым для внесения изменений требуется root. (В частности, изменение IP-адреса локального интерфейса и т. Д.) Во время разработки я использовал IDE как root (тьфу) и отладчик как root (double-ugh). Есть ли хороший способ для конечного пользователя запустить их под учетной записью без полномочий root? Мне сильно не нравится размер поверхности атаки, представленной GTK, wxPython, Python и моим приложением, когда оно запускается от имени пользователя root.

Я изучил возможности, но они выглядят недоделанными, и я не уверен, смогу ли я использовать их в Python, особенно если они основаны на потоке. Единственный вариант, который я не исследовал, - это демон, у которого установлен бит setuid и который выполняет всю работу с корневым типом от имени пользовательского интерфейса. Я не решаюсь представить эту сложность на столь ранней стадии проекта, поскольку запуск от имени пользователя root не является нарушителем правил для пользователей.

Ответы [ 7 ]

7 голосов
/ 30 октября 2008

Ваша идея о демоне имеет много достоинств, несмотря на сложность, которую он представляет. Пока действия не требуют взаимодействия с пользовательским интерфейсом как root , демон позволяет вам контролировать, какие операции разрешены и запрещены.

Однако вы можете использовать SUDO для создания контролируемого компромисса между ROOT и обычными пользователями ... просто предоставьте SUDO доступ к нужным пользователям для определенных инструментов, которые им нужны. Это уменьшает поверхность атаки, позволяя только «разрешенные» запуски рута.

3 голосов
/ 30 октября 2008

То, что вы хотите, это «Группа»

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

Иногда групповое управление может вызывать раздражение, но оно должно позволять вам делать все, что вы захотите, и авторизован пользователь, а не ваша программа.

(Если вы хотите, чтобы ваша программа была авторизована, вы можете создать конкретного пользователя, который будет запускать ее от имени, и дать этому пользователю надлежащее членство в группе, а затем выполнить su для этой группы в вашей программе, чтобы выполнить операцию, не предоставляя работающему пользователю возможность. )

1 голос
/ 30 октября 2008

Традиционным способом будет создание и использование помощника setuid для выполнения всего, что вам нужно. Однако обратите внимание, что правильно написать помощника setuid сложно (есть несколько векторов атаки, от которых вы должны защищаться).

Современным способом было бы использовать демон (работающий от имени root, запущенный при загрузке), который слушает запросы от остальной части приложения. Таким образом, ваша поверхность атаки в основном ограничивается тем, какой IPC вы выбрали (я бы предложил d-bus, что кажется современным способом).

Наконец, если вы управляете сетевыми интерфейсами, то, что вы делаете, очень похоже на то, что делает сетевой менеджер в современном дистрибутиве. Было бы неплохо либо попытаться каким-либо образом интегрировать то, что вы делаете, с менеджером сети (чтобы это не противоречило вашим манипуляциям), либо хотя бы посмотреть, как это работает.

1 голос
/ 30 октября 2008

Я бы не запускал приложение полный рабочий день от имени пользователя root, но вы можете захотеть узнать, как сделать setuid вашего приложения root или setuid для некоторого идентификатора, который может стать root, используя что-то вроде sudo для определенных приложений. Возможно, вы сможете настроить учетную запись, которая не может войти в систему, использовать setuid для изменения идентификатора вашей программы (временно, когда это необходимо) и настроить sudo так, чтобы не запрашивать пароль, но всегда разрешать доступ к этой учетной записи для конкретных задач.

Таким образом, ваша программа не имеет специальных привилегий при нормальной работе, только повышает свои привилегии, когда это необходимо, и sudo ограничивает запуск только определенных программ.

Прошло некоторое время с тех пор, как я много занимался разработкой для Unix, поэтому я не совсем уверен, возможно ли настроить sudo, чтобы не запрашивать пароль (или даже если есть API для него), но как Откат вы можете включить setuid для root только при необходимости.

[EDIT] Похоже, что sudo имеет режим NOPASSWD, поэтому я думаю, что он должен работать, поскольку вы запускаете программы как внешние команды.

1 голос
/ 30 октября 2008

Вы можете создавать и распространять политику selinux для своего приложения. Selinux позволяет вам получить именно тот мелкозернистый доступ. Если вы не можете или не хотите использовать selinux, то демон - это путь.

0 голосов
/ 30 октября 2008

Я недостаточно знаком с Python, чтобы сказать вам, какие необходимые команды должны быть на этом языке, но вы должны быть в состоянии сделать это, разветвив и используя канал для связи между родительским и дочерним процессами. Что-то вроде:

  • Запустите программу от имени пользователя root с помощью sudo или suid
  • При запуске программа немедленно разветвляется и устанавливает канал для связи между родительским и дочерним процессами
  • Дочерний процесс сохраняет полномочия root, но просто сидит и ждет ввода от канала
  • Родительский процесс сбрасывает root (изменяет свой uid обратно на uid пользователя, выполняющего его), затем отображает графический интерфейс пользователя, взаимодействует с пользователем и обрабатывает все операции, доступные для непривилегированного пользователя
  • Когда должна быть выполнена операция, требующая привилегий root, родительский процесс (не-root) отправляет команду по конвейеру дочернему процессу (root), который ее выполняет, и, при необходимости, сообщает родительскому процессу

Это, вероятно, будет немного легче написать, чем независимый демон, а также будет более удобным для запуска (так как вам не нужно беспокоиться о том, работает демон или нет), при этом также позволяя использовать графический интерфейс и другие вещи, которые не требуют полномочий root для запуска без полномочий root.

0 голосов
/ 30 октября 2008

Нет отдельного пользователя, который находится на полпути между «обычным» пользователем и пользователем root. У вас есть root, а затем у вас есть пользователи; пользователи могут иметь разные уровни возможностей. Если вы хотите что-то более мощное, чем «обычный» пользователь, но не такое мощное, как root, вы просто создаете нового пользователя с нужными вам возможностями, но не предоставляете ему привилегий, которых вы не хотите иметь.

...