Linux программирование в примерах
Шрифт:
ЗАМЕЧАНИЕ. Открытые файлы остаются открытыми и доступными для использования, даже после изменения процессом своих UID или GID. Таким образом, программы с setuid должны заранее открыть все нужные файлы, изменить их ID на ID действительного пользователя и продолжить оставшуюся часть работы без дополнительных привилегий
В табл. 11.1 приведена сводка шести стандартных функций для манипулирования значениями UID и GID.
Таблица 11.1. Сводка API для установки действительных и эффективных ID [120]
120
E (Effective)
Функция | Устанавливает | Постоянно | Обычный пользователь | Root |
---|---|---|---|---|
seteuid | E | Нет | Из R, E, S | Любое |
setegid | E | Нет | Из R, E, S | Любое |
setuid | Root: R,E,S Другие: E | Root: да Другие: нет | Из R, E | Любое |
setgid | Root: R,E,S Другие: E | Root: да Другие: нет | Из R, E | Любое |
setreuid | E, может установить R | Нет | Из R, E | Любое |
setregid | E, может установить R | Нет | Из R, E | Любое |
11.7. Работа со всеми тремя ID:
Linux предоставляет дополнительные системные вызовы, посредством которых вы можете непосредственно работать с действительными, эффективными и сохраненными ID пользователя и группы:
Функции следующие:
Получает значения действительного, эффективного и сохраненного set-user ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке,
Получает значения действительного, эффективного и сохраненного set-group ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке,
Устанавливает значения действительного, эффективного и сохраненного set-user ID соответственно. Когда значение параметра равно -1, соответствующий UID
Когда процесс действует как
Устанавливает значения действительного, эффективного и сохраненного set-group ID соответственно. Когда значение параметра равно -1, соответствующий GID остается без изменений.
Эта функция аналогична
Функции
Более того, вызовы являются операциями типа «все или ничего»: они либо полностью успешны в осуществлении нужного изменения, либо терпят полную неудачу, оставляя текущее состояние как есть. Это повышает надежность, поскольку, опять-таки можно быть точно уверенным в том, что случилось.
11.8. Пересечение минного поля безопасности: setuid
Настоящие минные поля трудно, но не невозможно перейти. Однако, это не является чем-то, что можно сделать легко, без тренировки или опыта
Точно также написание программ, которые используют setuid
В частности, стоит специально изучить проблемы безопасности Linux/Unix и потратить время на обучение написанию программ setuid root. Если вы сразу нырнете в эту проблему, прочитав лишь эту книгу и ничего более, можно быть уверенным, что ваша система будет взломана, легко и сразу. Маловероятно, что вы или ваши клиенты будут довольны.
Вот несколько руководящих принципов:
• Как можно меньше действуйте в качестве
• Соответствующим образом проектируйте свою программу. Разделите программу на составные части таким образом, чтобы все операции
• При изменении или сбрасывании привилегий используйте
• Переходите от
• Рассмотрите использование прав доступа setgid и особой группы для вашего приложения. Если это будет работать, это убережет вас от большой головной боли.
• Рассмотрите отказ от наследуемого окружения. Если вам нужно сохранить некоторые переменные окружения, сохраните как можно меньше. Убедитесь в предоставлении подходящих значений для переменных окружения