Есть ли команда оболочки без полномочий 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.
Из комментария:
Это невозможно, как вы описываете, потому что: информация описывается только в тени, а тень может быть прочитана только пользователем root. Любая программа, требующая хэшей паролей или истечения срока действия учетной записи, должна иметь SUID (если вы используете локальные учетные записи, хранящиеся в тени, как вы говорите).
Добавлена информация:
Я изначально использовал чаге (1) как источник.
Заметка
Программа chage требует наличия файла теневого пароля.
Я обновил свою информацию, чтобы быть более точным, подтверждая вещи.
Прежде всего, я проверил исходный код чейджа, чтобы убедиться. Похоже, ему действительно нужен доступ к теневому файлу и больше нигде не хранить информацию. Во-вторых, вы можете использовать PAM, чтобы разрешить использование корневых функций chage. (check_perms на chage.c: 523)
И, как говорили другие, все остальное, что используется в качестве бэкэнда для тени (а именно, что-либо в nsswitch.conf
для него кроме файлов и db) есть свои способы работы с вещами.
Вкратце: при использовании файлов в качестве бэкэнда информация об устаревании пароля действительно сохраняется там и только там. Если вы все еще хотите использовать файловый бэкэнд, вам следует написать программу и сделать ее SUID, так как система работает все или ничего. Вы можете запросить только своего пользователя, или вы можете запросить и настроить всех. С другой стороны, написать что-то на C, чтобы делать то, что вы хотите, было бы всего лишь несколькими строками кода. Вы можете скопировать три функции из исходного кода chage и добавить новый main.
Я не уверен, есть ли простой способ проверить. Я сомневаюсь, что у вас, как у обычного пользователя, будет доступ к файлу passwd (а не к теневому файлу), так что вы не можете легко использовать sed / awk / grep для! поле.
Что вы могли бы сделать, так это разработать очень конкретный сценарий, сделать его без rwx и без полномочий root, а затем создать запись sudo специально для этой команды. Вы даже можете сделать его беспарольным. В идеале вы бы не принимали никаких вводимых данных, поэтому было бы сложнее «сломать» сценарий. Я полагаю, все сводится к тому, насколько вы параноиком хотите быть / у кого будет к этому доступ.
Нет команды без полномочий root, но есть команда root. это passwd -S <username>
. Что выводит следующее:
Отображение информации о статусе учетной записи. Информация о статусе состоит из 7 полей. Первое поле - это логин пользователя. Второе поле указывает, имеет ли учетная запись пользователя заблокированный пароль (L), не имеет пароля (NP) или имеет пригодный пароль (P). В третьем поле указана дата последней смены пароля. Следующие четыре поля - это минимальный возраст, максимальный возраст, период предупреждения и период бездействия для пароля. Эти возрасты выражаются в днях.
Поэтому лучше всего было бы вызвать сценарий типа
#!/bin/sh
passwd -S $1
и разрешить вызов с помощью sudo
и никакого пароля из программы Java.
Осторожно: приведенный выше сценарий уязвим для внедрения кода, поэтому вы должны защитить его для своих целей.
Один из способов - переместить информацию о вашей учетной записи в LDAP или SQL. Затем используйте модули PAM для интеграции их с вашим сервером. Ваше приложение Java может легко получить прямой доступ к LDAP или SQL.
Для бонусных баллов этот подход более масштабируемый и управляемый, если у вас много серверов с одинаковой базой пользователей. / etc / passwd также начинает ухудшаться с точки зрения производительности, если у вас тысячи учетных записей пользователей или больше.