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.

Осторожно: приведенный выше скрипт уязвим для внедрения кода, поэтому вы должны защитить его для своих целей.

Другие вопросы по тегам