Как неинтерактивные программы получают разрешение на редактирование файлов в / etc

Я пишу программу на python, которая должна редактировать некоторые файлы в / etc. Некоторая система сама по себе. Как получить эти разрешения из самой программы без запуска sudo, поскольку программа будет неинтерактивной?

Не уверен, когда я собираюсь автозапуск моей программы, но я, скорее всего, использую monit или подобный для этой цели.

Решение состоит в том, чтобы запустить программу как root, тем самым имея разрешение на файлы в / etc.

Конечно, есть две возможности:

  1. уменьшите разрешения файлов до уровня, к которому пользователь может получить доступ.
  2. увеличить разрешения, которые модифицирующее приложение имеет

в отношении 1) Вы можете попытаться добавить дополнительные права через ACL (я бы сильно препятствовал изменению разрешений UNIX, у многих программ были ожидания, и они будут изменены со следующим обновлением и т. д.).

setfacl -m "u:auto_user:rw" /etc/passwd 

(Для этой файловой системы необходимо включить расширенные списки ACL)

С помощью этого метода вы рискуете, что эти права доступа используются другой программой. Например: если вы добавите пользователя apache, чтобы разрешить изменение / etc / passwd, любой, кто получает контроль над пользователем apache, теперь может изменять этот файл. Учетные записи пользователей обычно менее тяжелы, чем доступ к корневому уровню.

относительно 2) Вы повышаете права доступа к этому файлу. Вы можете сделать это либо с помощью sudo, и с переменной NOPASSWD, но вам нужно быть осторожным, чтобы установить правильные права доступа. Что-то вроде

  auto_user = NOPASSWD: /bin/sed ... /etc/passwd 

не безопасно (sed может порождать снаряды)! Лучшим решением было бы написать специализированную программу, которая: а) фильтрует ввод и б) делает именно то, что вы хотите.

Любая программа (будь то интерактивная, например, vi или не интерактивная, например sed ) имеет эффективный идентификатор пользователя (EUID), который система использует для определения того, к каким файлам он может обращаться, и о том, какие операции он может выполнять (читать, писать и / или выполнение). (Существует также набор идентификаторов групп, которые используются для тех же целей, если EUID отличается от владельца файла. И если ни EUID, ни какой-либо GID не совпадают, доступ контролируется битами разрешения «Другой».)

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

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

В вашем случае вы можете создать специального пользователя, изменить владельца файлов в /etc который должен быть доступен, а затем запустить вашу программу в качестве этого пользователя, используя su .

Другой подход – перемещать редактируемые файлы где-то в другом месте и помещать символические ссылки в это место в /etc

Однако вы это делаете, вы должны быть уверены, что пользователям / UID / GID, которые могут обращаться к файлам, доверяют любые функции. Например, вы не хотите, чтобы пользователи, не являющиеся root, могли редактировать файл паролей, поскольку они могут легко получить привилегии root.