Linux: отключенные учетные записи пользователей: есть ли команда без полномочий root, которая может показать, отключена ли учетная запись или нет?
Есть ли команда не-root, которая может сказать мне, отключена ли учетная запись пользователя или нет?
Обратите внимание, что я делаю различие между блокировкой и отключением:
- БЛОКИРОВКА - это место, где вы готовитесь
!
или же*
или же!!
в поле пароля файла / etc / passwd или / etc / shadow. Блокировка паролем может быть выполнена (по приглашению оболочки) черезpassword -l username
(как root) для блокировки учетной записи имени пользователя и использования опции-u
разблокирует это. - ОТКЛЮЧЕНИЕ учетной записи выполняется путем установки срока действия учетной записи пользователя до определенного момента в прошлом. Это может быть сделано с
chage -E 0 username
, который устанавливает дату истечения 0 дней после эпохи Unix. Установка его в-1
отключит использование срока годности.
В моей ситуации использование блокировки недостаточно, поскольку пользователь все еще может войти в систему, например, используя токены аутентификации ssh, а процессы под этим пользователем могут порождать другие процессы. Таким образом, у нас есть учетные записи, которые включены или отключены, а не просто заблокированы. То, что я ищу, - это способ проверить состояние включения / выключения учетной записи с помощью команды оболочки для использования в пользовательском процессе Java. Процесс Java может анализировать выходные данные или использовать код выхода и может выполнять сложные операторы, например, такие как каналы между командами.
Это предназначено для использования в системе Red Hat Enterprise 5.4.
Этот вопрос ранее задавался на SuperUser.
4 ответа
Из комментария:
Это невозможно, как вы описываете, потому что: информация описана только в тени, а тень может быть прочитана только root. Любая программа, требующая хеши паролей или срок действия учетной записи, должна быть SUID (если вы используете локальные учетные записи, хранящиеся в тени, как вы говорите).
Добавлена информация:
Я изначально использовал chage(1) в качестве источника.
Заметка
Программа chage требует наличия файла теневого пароля.
Сейчас я обновил свою информацию, чтобы быть более точным, подтверждающим вещи.
Прежде всего, я проверил исходный код chage, чтобы быть уверенным. Похоже, ему действительно нужен доступ к теневому файлу и хранение информации в другом месте. Во-вторых, вы можете использовать PAM, чтобы разрешить использование корневых функций chage. (check_perms на chage.c:523)
И, как уже говорили другие, все остальное используется в качестве основы для тени (а именно, что-либо в nsswitch.conf
для него кроме файлов и дб) есть свои способы работы с вещами.
Вкратце: при использовании файлов в качестве бэкэнда информация о устаревании пароля действительно сохраняется там и только там. Если вы все еще хотите использовать файлы бэкэнда, вы должны написать программу и сделать ее SUID, так как в системе все или ничего. Вы можете запросить только своего пользователя, или вы можете запросить и настроить всех. С другой стороны, написание чего-то на C для того, что вы хотите, было бы всего лишь несколькими строками кода. Вы можете просто скопировать три функции из источника chage и добавить новую главную.
Я не уверен, есть ли простой способ проверить. Я сомневаюсь, что как обычный пользователь у вас будет доступ к файлу passwd (не теневой), так что вы не сможете легко использовать sed/awk/grep для! поле.
Что вы можете сделать, так это разработать очень специфический скрипт, сделать его не rwx и не root, а затем создать запись sudo специально для этой команды. Вы даже можете сделать это без пароля. В идеале вы не принимаете никаких входных данных, поэтому будет сложнее "сломать" скрипт. Я полагаю, все сводится к тому, насколько параноиком вы хотите быть / кто будет иметь к нему доступ.
Одним из способов было бы перенести информацию о вашей учетной записи в LDAP или SQL. Затем используйте модули PAM для их интеграции с вашим сервером. Ваше Java-приложение может легко получить доступ к LDAP или SQL напрямую.
Для бонусных баллов этот подход является более масштабируемым и управляемым, если у вас много серверов с одинаковой базой пользователей. /etc/passwd также начинает страдать от производительности, если у вас есть тысячи учетных записей пользователей или больше.
Нет команды без полномочий root, но есть команда root. это passwd -S <username>
, Который выводит следующее:
Отображение информации о состоянии учетной записи. Информация о состоянии состоит из 7 полей. Первое поле - это логин пользователя. Второе поле указывает, имеет ли учетная запись пользователя заблокированный пароль (L), не имеет пароля (NP) или имеет пригодный для использования пароль (P). В третьем поле указана дата последнего изменения пароля. Следующие четыре поля - это минимальный возраст, максимальный возраст, период предупреждения и период бездействия для пароля. Эти возрасты выражены в днях.
Так что лучше всего было бы назвать сценарий как
#!/bin/sh
passwd -S $1
и позвольте этому быть вызванным с sudo
и нет пароля из программы Java.
Осторожно: приведенный выше скрипт уязвим для внедрения кода, поэтому вы должны защитить его для своих целей.