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

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

Жанры

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

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

Шрифт:

Однако, для

root
эта функция устанавливает в данное значение все три значения для действительного, эффективного и сохраненного set-user ID. Более того, изменение постоянно; прежнее ID нельзя восстановить. (Это имеет смысл: раз изменился сохраненный set-user ID, нет другого ID для восстановления.)

int setgid(gid_t gid)

Эта функция делает для эффективного ID группы то же, что

setuid
делает для эффективного ID пользователя. Используется то же разграничение между обычными пользователями и
root
.

ЗАМЕЧАНИЕ. Возможность изменения ID группы зависит от эффективного ID пользователя.

Эффективный GID, равный 0, не имеет особых привилегий.

Наконец, POSIX представляет для исторической совместимости две функции из BSD 4.2. В новом коде их лучше не использовать. Однако, поскольку вы, вероятно, увидите использующий эти функции старый код, мы их здесь опишем.

int setreuid(uid_t ruid, uid_t euid)

Устанавливает данные значения в качестве действительного и эффективного UID. Значение -1 для

ruid
или
euid
оставляет соответствующие ID без изменения. (Это похоже на
chown
; см. раздел 5.5.1 «Смена владельца файла:
chown
,
fchown
и
lchown
».)

root
может устанавливать в качестве действительного и эффективного ID любое значение. В соответствии с POSIX пользователи, не являющиеся
root
, могут изменять лишь эффективный ID; то, что случится, если обычный пользователь попытается изменить действительный UID, «не определено». Однако, справочная страница GNU/Linux setreuid(2) разъясняет поведение Linux, в качестве действительного UID может быть установлено значение действительного или эффективного UID, а в качестве эффективного UID может быть значение действительного, эффективного или сохраненного set-user ID. (Для других систем см. справочную страницу setreuid(2).)

int setregid(gid_t rgid, gid_t egid)

Делает для действительных и эффективных ID групп то же, что

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

Сохраненный set-user ID в модели BSD не существует, поэтому лежащей в основе

setreuid
и
setregid
идеей было упростить переключение между действительным и эффективным ID:

setreuid(geteuid, getuid); /* обмен действительным и эффективным */

Однако, с принятием POSIX модели сохранения set-user ID и функций

seteuid
и
setegid
функции BSD не следует использовать в новом коде. Даже документация BSD 4.4 помечает эти функции как устаревшие, рекомендуя вместо них
seteuid
/
setuid
и
setegid
/
setgid
.

11.6.3. Использование битов setuid и setgid

Есть важные случаи, в которых действующая как

root
программа должна безвозвратно изменить все три значения действительного, эффективного и сохраненного set-user ID на ID обычного пользователя. Наиболее очевидным случаем является программа
login
, которую вы используете (либо непосредственно, либо удаленно) каждый раз при регистрации в системе GNU/Linux или Unix. Имеется иерархия программ, как очерчено на рис. 11.1.

Рис. 11.1. От

init
через
getty
через
login
к shell

Код

для
login
слишком сложен, чтобы показать здесь, поскольку он имеет дело с рядом задач, не имеющих отношения к текущему обсуждению. Но мы можем очертить шаги, которые происходят во время регистрации, следующим образом:

1. 

init
является самым первым процессом. Его PID равен 1. Все другие процессы являются его потомками. Ядро вручную создает процесс 1 во время загрузки и запускает в нем
init
. Он действует с действительным и эффективным UID, равными нулю, т.е. как
root
.

2. 

init
читает
/etc/inittab
, который, помимо прочих вещей, сообщает
init
о том, на каких устройствах он должен запустить процесс
getty
. Для каждого такого устройства (такого, как консоль, последовательные терминалы или виртуальные консоли в системе GNU/Linux)
init
порождает новый процесс. Этот новый процесс использует затем
exec
для запуска
getty
(от «get tty» («получить tty», т.е. терминал)). На многих системах GNU/Linux эта команда называется
mingetty
. Программа открывает устройство, сбрасывает его состояние и выводит приглашение '
login:
'.

3. По получении регистрационного имени

getty
выполняет
login
. Программа
login
ищет имя пользователя в файле паролей, запрашивает пароль и проверяет его. Если пароль подходит, процесс
login
продолжается.

4. 

login
изменяет домашний каталог пользователя, устанавливает начальное окружение, а затем устанавливает начальный набор открытых файлов. Он закрывает дескрипторы файлов, открывает терминал и использует
dup
для копирования дескрипторов файла терминала в 0, 1 и 2. Вот откуда происходят дескрипторы уже открытых файлов стандартного ввода, стандартного вывода и стандартной ошибки.

5. Затем

login
использует
setgroups
для установки дополнительного набора групп,
setgid
для установки значений действительного, эффективного и сохраненного set-group ID в соответствующее значение группы пользователя, и наконец,
setuid
для установки всех трех значений действительного, эффективного и сохраненного set-user ID в соответствующие значения для регистрирующегося пользователя. Обратите внимание, что вызов
setuid
должен быть последним для того, чтобы другие два вызова завершились успешно.

6. Наконец,

login
вызывает зарегистрированную оболочку пользователя. Оболочки в стиле Борна после этого читают файлы
/etc/profile
и
$HOME/.profile
, если они существуют. Затем оболочка выводит приглашение.

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

init
начинается как копия
init
. Используя
exec
, тот же самый процесс выполняет различные задания. Вызвав
setuid
для перехода от
root
к обычному пользователю, процесс в конечном счете поступает непосредственно для работы пользователя. Когда вы выходите из оболочки (посредством CTRL-D или
exit
), процесс попросту завершается. Затем
init
возобновляет цикл, порождая новый
getty
, который выводит новое приглашение '
login:
'.

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

Измена. За что ты так со мной

Дали Мила
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. За что ты так со мной

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Большие дела

Ромов Дмитрий
7. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Большие дела

Эксклюзив

Юнина Наталья
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Эксклюзив

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Черкес. Дебют двойного агента в Стамбуле

Greko
1. Черкес
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черкес. Дебют двойного агента в Стамбуле

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Третье правило дворянина

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

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2