Управлять учетными данными процесса в системах Unix сложно.Я высоко рекомендую получить полное понимание того, как реальные, эффективные и сохраненные пользовательские идентификаторы взаимосвязаны.Очень легко испортить «отбрасывание привилегий».
Что касается ваших конкретных наблюдений ... Мне интересно, есть ли простая причина, которую вы, возможно, упустили из виду.Ваш код выполняет противоречивые тесты, и вы не указали точные права доступа к файлам /etc/sudoers
и /etc/group-
.Вы могли бы ожидать, что вы будете вести себя точно так же, как вы описали, если /etc/sudoers
имеет режим полномочий = 440, uid = root, gid = root (которые являются разрешениями по умолчанию для моей системы) и если /etc/group-
имеет mode = 400.
Вы не изменяете GID процесса, поэтому, если /etc/sudoers
доступен для чтения в группе, это объясняет, почему он всегда читаемый.fork()
не изменяет учетные данные процесса.Однако в вашем примере кода это может выглядеть так, поскольку вы проверяете разные файлы в родительском и дочернем элементах.Если /etc/group-
не имеет разрешения на групповое чтение, а /etc/sudoers
- это объясняет очевидную проблему.
Если все, что вы пытаетесь сделать, это «удалить привилегии», используйте следующий код:
os.setgid( NEW_GID )
os.setuid( NEW_UID )
Вообще говоря, вы можете манипулировать эффективным идентификатором пользователя только в том случае, если вашему процессу необходимо включать и выключать свои корневые права в течение срока его службы.Если вам просто нужно выполнить некоторые операции установки с правами суперпользователя, но они вам больше не понадобятся после завершения этих операций установки, просто используйте приведенный выше код, чтобы безвозвратно удалить их.
О, и полезной утилитой отладки для манипулирования учетными данными процессов в Linux является вывод выходных данных /proc/self/status
, строки Uid и Gid этого файла отображают реальные, эффективные, сохраненные наборы и идентификаторы файлов.удерживается текущим процессом (в таком порядке).API-интерфейсы Python могут использоваться для извлечения той же информации, но вы можете рассматривать содержимое этого файла как «данные об истинности» и избегать любых возможных осложнений из-за кросс-платформенных API-интерфейсов Python.