Возобновить раздел подкачки LVM

TL, DR: вам, вероятно, понадобится / proc / PID / loginuid , хотя его поведение не t всегда соответствует имя журнала . Но не на всех дистрибутивах "из коробки". Обратите внимание, что мой ответ предполагает использование Linux, это не относится к другим вариантам Unix.

Я не думаю, что вы найдете полностью удовлетворительный ответ, потому что у вас нет четких ожиданий от того, что делает logname .С одной стороны, в настоящее время вы используете имя журнала , которое основано на записях utmp - записях, которые связывают пользователя с терминалом и которые обновляются по доброй воле эмулятора терминала (многие не делают этого) т). С другой стороны, вы ожидаете, что «возможность изменить имя пользователя должна быть ограничена суперпользователем». Это не относится к записям utmp! Как объяснялось в той самой ветке комментариев, которую вы цитируете , записи utmp работают большую часть времени, но их можно подделать.

Определение «имени пользователя, которое использовалось для входа в консоль» проблематично. В номинальных случаях это достаточно ясно, но бывает много сложных. Что произойдет, если пользователь вызовет su и подключится к сеансу экрана другого пользователя? Что произойдет, если пользователь подключится к сеансу X11 или VNC другого пользователя? Как вы отслеживаете процессы до терминалов - что вы делаете с процессами, у которых нет управляющего терминала?

На самом деле Linux имеет понятие «UID входа в систему». Он отображается для каждого процесса как / proc / PID / loginuid . Эта информация отслеживается ядром, но пользователь может сообщить ядру, когда происходит вход в систему. Обычно это делается через pam_loginuid . Под капотом это делается путем записи в / proc / self / loginuid . UID входа в систему Linux следует за происхождением процесса, что не всегда является правильным определением, но имеет то преимущество, что оно простое.

Помните, что если UID процесса 4294967295, то процесс может его изменить.Init начинается с UID входа 4294967295 (равно -1 как 32-битное значение); обычно это указывает на процесс, который не является частью сеанса входа в систему . Пока процесс входа в систему правильно устанавливает UID входа (непосредственно перед тем, как он устанавливает реальный UID от root пользователю, который входит в систему), все в порядке. Но если есть способ войти в систему без установленного UID входа, пользователь может объявить любой UID входа по своему выбору. Таким образом, эта информация является надежной только в том случае, если все способы запуска процесса в системе проходят через этап установки UID входа в систему - забудьте об одном, и информация станет бесполезной.

Экспериментально, на машине Debian jessie все мои длительные процессы, UID которых равен -1, являются системными службами. Но есть способы запустить процесс с UID для входа -1, например, через incron. Я не знаю, сколько есть других способов; incron был первым, что я попробовал, и он сработал. На машине Ubuntu 16.04 запись pam_loginuid для lightdm закомментирована, я не выяснил почему. Возможно, lightdm и incron в Ubuntu следует считать ошибками безопасности, но факт в том, что сегодня вы не можете полагаться на UID входа в систему, работающий из коробки в основных дистрибутивах.

См. Также Loginuid, должно быть разрешено изменение или нет (изменяемое или нет)? , который касается параметра ядра, предотвращающего изменение UID входа в систему root. Но имейте в виду, что это действует только после того, как UID входа в систему будет установлен на правильное значение; если пользователь запускает процесс с UID для входа в систему, все еще установленным на -1, он может установить для него все, что пожелает.Фактически, было бы безопаснее переключить init на другое значение, скажем -2, и иметь pam_loginuid переопределить это значение; тогда -1 никогда не произойдет, а -2 будет означать «неизвестно».

1
07.12.2017, 03:19
0 ответов

Теги

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