Как работают демоны с учетной записью пользователя с недопустимой оболочкой?

Я всюду пытался найти ответ на этот вопрос и попытался мысленно разобрать сценарии инициализации, чтобы найти, где это делается, безрезультатно.

Я просто сделал ps и вытащил случайный пример. У меня есть процесс, который выглядит следующим образом:

polkitd 1230 1 0 May07 ? 00:00:00 /usr/lib/polkit-1/polkitd --no-debug

глядя на мой / etc / passwd, я вижу:

polkitd:x:87:87:PolicyKit daemon owner:/var/lib/polkit:/bin/false

В качестве теста я запускаю команду как root: # su - polkitd -c whoami Которая не возвращает выход, как и ожидалось из-за наличия / bin / false в качестве оболочки. Кроме того, # su - polkitd не переключает меня на polkitd. Чтобы убедиться, что я делаю это правильно, я тестировал их оба с обычной учетной записью пользователя, и они работали так, как должны.

Итак, как сделать так, чтобы в моем примере могла быть создана специальная учетная запись, такая как polkitd, когда вы, похоже, не можете заставить ее запускать что-либо вообще вручную?

root может стать polkitd через соответствующий системный вызов, например, seteuid(2) что можно продемонстрировать с помощью

 $ cat becomepolkit.c #include <sys/types.h> #include <stdio.h> #include <unistd.h> int main(void) { // ID obtained via `id polkitd` on a Centos7 system // other systems may vary seteuid(999); printf("look for %d in process list\n", getpid()); sleep(99999); return 0; } $ make becomepolkit cc becomepolkit.c -o becomepolkit $ sudo ./becomepolkit & [1] 10914 $ look for 10915 in process list $ ps auwwx | grep '1091[5]' polkitd 10915 0.0 0.0 4160 340 pts/0 S 22:46 0:00 ./becomepolkit $ 

Обычно root через систему init (например, systemd ) или cron запускает процесс как root , а затем меняет пользователя процесса; для этого не требуется доступа к оболочке. Вы можете наблюдать это за произвольный процесс, запустив процесс под strace или другим инструментом трассировки:

 sudo strace -o blah ./becomepolkit look for 10968 in process list ^C$ grep 999 blah setresuid(-1, 999, -1) = 0 nanosleep({99999, 0}, {99997, 670178798}) = ? ERESTART_RESTARTBLOCK (Interrupted by signal) $ 

Итак, здесь Linux фактически использует setresuid(2) но с той же разницей, что процесс будет отображаться как polkitd в таблице процессов.

Оболочка входа пользователя – это программа, которую большинство программ входа в систему вызывается, когда пользователь прошел аутентификацию (обычно, введя свое имя и пароль). Программы login включают login (для входа в текстовую консоль), sshd (для входа в сеть), su (для входа в другую учетную запись) и т. Д.

Программы входа в систему могут запускать все, что они выбирают. Тот факт, что большинство из них запускает пользовательскую оболочку пользователя, является административным решением больше, чем техническим ограничением. Класс программ входа, которые не соответствуют этому соглашению, – это диспетчеры дисплеев, то есть программы, которые регистрируют пользователя в графическом режиме: обычно они выполняют сценарий /bin/sh например /etc/X11/Xsession .

Системные службы обычно не вызывают программы входа. Они запускаются автоматически с помощью пусковой установки daemon, которая работает с правами администратора; запуск системной службы не требует никакой аутентификации. (Для того чтобы пользователь запросил запуск системной службы, как правило, требует аутентификации, чтобы стать root.) Таким образом, оболочка входа вообще не задействована, не было бы причин ее привлекать.

Демонские пусковые установки (моя терминология с целью этого ответа) включают systemd , start-stop-daemon , runuser и т. Д.