Понимание getlogin ()

Это имеет отношение к порядку загрузки. Самый высокий приоритет требуется для начальной загрузки (/и по-моему/usr / var/tmp...). / загружаются, файловая система может сделать с более низким приоритетом, потому что к тому времени, когда система может запустить fsck's, это уже считало необходимые файлы из начальной загрузки. Файловые системы для корневых каталогов и т.д. являются более низким приоритетом во время процесса начальной загрузки.

4
13.04.2017, 15:36
2 ответа

getlogin() и logname (который просто звонит getlogin()) получите зарегистрированное имя пользователя путем поиска текущего tty в utmp и создание отчетов об имени для входа в систему найдено в этом utmp запись. Причина, которую они делают, который является, что они разработаны для работы над системами, где несколько имен пользователей могли бы отобразиться на тот же uid (практика, обычно осуждаемая, но иногда раньше, создавал несколько корневых учетных записей или различных имен для входа в систему, которые запускают пользовательские оболочки, но всю карту к тому же, лежащему в основе uid). При использовании с такими учетными записями, getpwuid(getuid()) только сообщит первое соответствие от passwd базы данных, тогда как getlogin() найдет тот, который на самом деле использовался для входа в систему.

Однако, потому что эта функция полагается на содержание перезаписываемого файла, это не достойно того же уровня доверия как getpwuid(getuid()). Это верно, что только привилегированные процессы должны смочь записать utmp, но существует несколько "дополнительных" программ, которые часто настраиваются, чтобы смочь записать это (обычно, будучи setgid-utmp) как экран GNU и Вы не могли бы хотеть доверять им. Я знаю, что исторически в некоторых системах SysV раньше справлялся, utmp было склонным, чтобы иногда повреждаться.

3
27.01.2020, 20:58

Как @Celada указанный, оба logname и getlogin() зависьте от /var/run/utmp, который помещает их в степень доверия среднего уровня (это - регулярный файл вместо чего-то, что обязательно повторно создано с перезагрузками, в отличие от структур ядра, таким образом, существует небольшая возможность загрязнения, если они могут загрузить с CD или чего-то, с другой стороны что они не могли поставить под угрозу, если бы они сделали это?). Существует надежда, скрывающаяся в простом виде все же. Я намеренно игнорировал /proc/$$/loginuid до этой точки, потому что это принадлежало пользователю вызова и перезаписываемому биту, был установлен для владельца, таким образом, я полагал, что это было главным образом просто удобство и не механизм защиты. Кажется, что это предположение было неправильным. Вот описательный текст для патча ядра, отправленного к концу 2011:

В данный момент мы позволяем задачам установить их loginuid, если у них есть CAP_AUDIT_CONTROL. В действительности мы хотим задачи установить loginuid, когда они входят в систему и он быть невозможными когда-либо сбросить. Мы должны были сделать это изменяемым даже после того, как это было когда-то установлено (с ОГРАНИЧЕНИЕМ), потому что на обновлении и администраторе, возможно, придется перезапустить sshd. Теперь sshd получил бы его loginuid и следующего пользователя, который вошел в систему с помощью ssh, не сможет установить его loginuid.

Systemd изменился, как пространство пользователя работает и позволило нам заставлять ядро работать способ, которым он должен. С systemd пользователями (даже администраторы), как предполагается, не перезапускают сервисы непосредственно. Система перезапустит сервис для них. Таким образом, так как systemd идет в loginuid ==-1, sshd добрался бы-1, и sshd позволят установить новый loginuid без специальных полномочий.

Если администратор в этой системе должен был вручную запустить sshd, он вводит себя в системную цепочку доверия и таким образом, логически, именно его loginuid должен использоваться!

Таким образом, это перечислено как перезаписываемое пользователем? Да. Пользователь может на самом деле изменить его? Только если они - корень или имеют CAP_AUDIT_CONTROL (который является, вероятно, не большим количеством людей). Большая часть безопасного решения, которое я могу найти, состоит в том, чтобы на самом деле вытянуть это от /proc/$$/loginuid (при записи сценария оболочки или на командной строке) или audit_getloginuid() из программы.

0
27.01.2020, 20:58

Теги

Похожие вопросы