Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

ЗАМЕЧАНИЕ. Открытые файлы остаются открытыми и доступными для использования, даже после изменения процессом своих UID или GID. Таким образом, программы с setuid должны заранее открыть все нужные файлы, изменить их ID на ID действительного пользователя и продолжить оставшуюся часть работы без дополнительных привилегий

В табл. 11.1 приведена сводка шести стандартных функций для манипулирования значениями UID и GID.

Таблица 11.1. Сводка API для установки действительных и эффективных ID [120]

120

E (Effective)

эффективный ID, R (Real) действительный ID и S (Saved) сохраненный ID — Примеч. науч. ред.

Функция Устанавливает Постоянно Обычный пользователь 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:

getresuid
и
setresuid
(Linux)

Linux предоставляет дополнительные системные вызовы, посредством которых вы можете непосредственно работать с действительными, эффективными и сохраненными ID пользователя и группы:

#include <sys/types.h> /* Linux */

#include <unistd.h>

int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);

int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);

int setresuid(uid_t ruid, uid_t euid, uid_t suid);

int setresgid(gid_t rgid, gid_t egid, gid_t sgid);

Функции следующие:

int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid)

Получает значения действительного, эффективного и сохраненного set-user ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке,

errno
указывает проблему.

int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid)

Получает значения действительного, эффективного и сохраненного set-group ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке,

errno
обозначает проблему.

int setresuid(uid_t ruid, uid_t euid, uid_t suid)

Устанавливает значения действительного, эффективного и сохраненного set-user ID соответственно. Когда значение параметра равно -1, соответствующий UID

остается без изменения.

Когда процесс действует как

root
, параметрами могут быть любые произвольные значения. Однако, использование ненулевого значения для
euid
вызывает постоянную, безвозвратную утерю привилегии
root
). В противном случае параметры должны быть одним из значений действительного, эффективного или сохраненного set-user ID.

int setresgid(gid_t rgid, gid_t egid, gid_t sgid)

Устанавливает значения действительного, эффективного и сохраненного set-group ID соответственно. Когда значение параметра равно -1, соответствующий GID остается без изменений.

Эта функция аналогична

setresuid
.

Функции

setresuid
и
setresgid
особенно ценны, поскольку их семантика ясно определена. Программист точно знает, каким может быть результат их вызова.

Более того, вызовы являются операциями типа «все или ничего»: они либо полностью успешны в осуществлении нужного изменения, либо терпят полную неудачу, оставляя текущее состояние как есть. Это повышает надежность, поскольку, опять-таки можно быть точно уверенным в том, что случилось.

11.8. Пересечение минного поля безопасности: setuid

root

Настоящие минные поля трудно, но не невозможно перейти. Однако, это не является чем-то, что можно сделать легко, без тренировки или опыта

Точно также написание программ, которые используют setuid

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

В частности, стоит специально изучить проблемы безопасности Linux/Unix и потратить время на обучение написанию программ setuid root. Если вы сразу нырнете в эту проблему, прочитав лишь эту книгу и ничего более, можно быть уверенным, что ваша система будет взломана, легко и сразу. Маловероятно, что вы или ваши клиенты будут довольны.

Вот несколько руководящих принципов:

• Как можно меньше действуйте в качестве

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

• Соответствующим образом проектируйте свою программу. Разделите программу на составные части таким образом, чтобы все операции

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

• При изменении или сбрасывании привилегий используйте

setresuid
, если она у вас есть. В противном случае используйте
setreuid,
поскольку у этих функций самая чистая семантика. Используйте
setuid
, лишь когда вы хотите сделать постоянное изменение.

• Переходите от

root
к обычному пользователю в соответствующем порядке: сначала установите набор групп и значения GID, затем значения UID. Будьте особенно осторожны с
fork
и
exec
; действительные и эффективные UID при их вызове не изменяются, если вы не измените их явным образом.

• Рассмотрите использование прав доступа setgid и особой группы для вашего приложения. Если это будет работать, это убережет вас от большой головной боли.

• Рассмотрите отказ от наследуемого окружения. Если вам нужно сохранить некоторые переменные окружения, сохраните как можно меньше. Убедитесь в предоставлении подходящих значений для переменных окружения

PATH
и
IFS
.

Поделиться:
Популярные книги

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Воронцов. Перезагрузка. Книга 4

Тарасов Ник
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Трое с площади Карронад

Крапивин Владислав Петрович
Детские:
детские приключения
9.10
рейтинг книги
Трое с площади Карронад

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Гром Раскатного. Том 2

Володин Григорий Григорьевич
2. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 2

Старый, но крепкий 5

Крынов Макс
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 5

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6