LinuxForum.Fans
Тема

Вопрос по залогиниванию

Автор: Aether 9 сообщений 1906 просмотров
23.11.2014 22:11 #402210

Доброго дня.

Итак, интересно разобраться немного подробнее с вот чем:
когда запускается linux, его первый процесс (PID 1) запускается ядром. Далее этот процесс разветвляется, запуская кучу чего, и вот, в некий момент, он вызывает, в очередной раз, fork (для примера, новый процесс PID 100, процесс предок PPID 1), и запускает getty, которая создаёт необходимый буфер для консоли, обеспечивает вывод информации на экран, а также файл устройства, например, tty3. Далее, getty, также делает fork, запуская программу login (PID 101 PPID 100), та, соответственно, запрашивает имя пользователя, пароль, и, полагаю, есть тоже какой-то системный вызов, который эти данные передаёт ядру для сверки, после чего, ядро как-бы регистрирует права конкретного пользователя на доступ к ресурсам ПК к конкретному процессу. Мало того, все последующие вызовы fork из этого залогиненного процесса будут наследоваться потомками. Затем запускается оболочка bash (PID 102 PPID 101), и мы пишем команды от лица зарегистрированного пользователя.

Вопрос, во-первых, какими правами обладают процессы, которые запускает init до залогинивания? root?

Во-вторых, когда в bash набираю exit он возвращается на уровень login, то есть как-бы разлогинивается. По идее должен иметься системный вызов, на отмену регистрации, тогда к каким правам вернулась программа login?

В-третьих, в tty1 я запускаю процесс aaa &.
Консоль пишет: ...PID 140...
То есть, запустился новый процесс. Если затем разлогиниться, получается этот процесс так и сохранится с правами того пользователя из под которого был запущен?

Буду рад, указаниям на мои ошибки в понимании.

23.11.2014 23:15 #402219

[далее всё написанное относится к классической схеме без оговорок про pam, systemd и cgroups]

"Aether" написал:
а, соответственно, запрашивает имя пользователя, пароль, и, полагаю, есть тоже какой-то системный вызов, который эти данные передаёт ядру для сверки

нет, пароли проверяются в userspace: login просто читает содержимое /etc/passwd и /etc/shadow и сама принимает решение о предоставление доступа, без участия ядра.

"Aether" написал:
Мало того, все последующие вызовы fork из этого залогиненного процесса будут наследоваться потомками. Затем запускается оболочка bash (PID 102 PPID 101), и мы пишем команды от лица зарегистрированного пользователя.

тут всё проще: login делает fork() -> setuid() -> exec(<shell>).

"Aether" написал:
Вопрос, во-первых, какими правами обладают процессы, которые запускает init до залогинивания? root?

про те которые говорим — да, root... остальные могут быть запущены с произвольными правами...

"Aether" написал:
Во-вторых, когда в bash набираю exit он возвращается на уровень login, то есть как-бы разлогинивается. По идее должен иметься системный вызов, на отмену регистрации, тогда к каким правам вернулась программа login?

login просто ждёт на wait(2). после завершения шела управление передаётся ему и он продолжает своё дело с теми же правами, которыеу него были...

"Aether" написал:
В-третьих, в tty1 я запускаю процесс aaa &.
Консоль пишет: ...PID 140...
То есть, запустился новый процесс. Если затем разлогиниться, получается этот процесс так и сохранится с правами того пользователя из под которого был запущен?

после разлогинивания процесс будет убит SIGHUP'ом и завершится... но если он перехватит сигнал, то продолжит работать со своими правами...

24.11.2014 14:04 #402287

Хорошо, как я понимаю функции ввода-вывода, например printf() - это всего лишь формообразователи входных данных с последующим сис. вызовом write(). Далее ядро или его модули получают в обработку буфер подготовленных данных... Так вот, предположим, мы обратились к файлу, с запрещённой для нас записью, стало быть именно ядро должно принять решение можно нам с ним работать или нет, сверяя, UID, GID... Write() вернёт программе результат: либо отказ в доступе, либо операция исполнена.
Соответственно, что делает setuid() - это тоже системный вызов. Почитал описание, но не совсем понял суть:
login имеет изначально права root, setuid понижает её права до UID выбранного пользователя? Получается, если я создам программу, включу библиотеку unistd.h, сделаю вызов setuid() на любого пользователя, то она либо переключит UID процесса в случае запуска из под root, либо выдаст ошибку при запуске из-под любой другой учётной записи.
Если можно, то хотел бы уяснить: что такое реальный, а что такое эффективный UID?

24.11.2014 14:06 #402288
"Aether" написал:
которые запускает init

Почему только он? Мы systemd не рассматриваем?

24.11.2014 17:31 #402313

Так это сути дела не изменит, как я понял, в системах с systemd, процессом init является файл-ссылка на systemd. Инициализирующим может являться, вообще, какой угодно процесс.

24.11.2014 19:08 #402339

Aether, я всего лишь юзер. Но даже я не понял всего драматизма и пафоса вопроса. Переформулируйте пожалуйста! Внятно.

25.11.2014 03:29 #402378
Aether написал:
Так это сути дела не изменит, как я понял, в системах с systemd, процессом init является файл-ссылка на systemd. Инициализирующим может являться, вообще, какой угодно процесс.

http://unix-pro.ru/un/linux/linuxlesson/53-polnomochija-polzovatelja.html

25.11.2014 04:12 #402381
"Aether" написал:
выходных данных

опечатка...

"Aether" написал:
Так вот, предположим, мы обратились к файлу, с запрещённой для нас записью, стало быть именно ядро должно принять решение можно нам с ним работать или нет, сверяя, UID, GID... Write() вернёт программе результат: либо отказ в доступе, либо операция исполнена.

да всё так, только это всё делается во время open(2)

"Aether" написал:
login имеет изначально права root, setuid понижает её права до UID выбранного пользователя?

да, но это делается уже для нового процесса, после fork'а, но до exec'а. т.е. сам login это не затрагивает...

"Aether" написал:
Получается, если я создам программу, включу библиотеку unistd.h, сделаю вызов setuid() на любого пользователя, то она либо переключит UID процесса в случае запуска из под root, либо выдаст ошибку при запуске из-под любой другой учётной записи.

да...

"Aether" написал:
Если можно, то хотел бы уяснить: что такое реальный, а что такое эффективный UID?

они одинаковы почти всегда: euid отличается только у программ с установленным setuid битом... в остальных случаях их можно не различать...

25.11.2014 18:13 #402436

Спасибо, подробно)

Войдите или зарегистрируйтесь, чтобы ответить.