Назад | Перейти на главную страницу

Linux: отключенные учетные записи пользователей: есть ли команда оболочки без полномочий root, которая может показать, отключена учетная запись или нет?

Есть ли команда оболочки без полномочий root, которая может сказать мне, отключена ли учетная запись пользователя или нет?

Обратите внимание, что я различаю БЛОКИРОВКУ и ОТКЛЮЧЕНИЕ:

В моей ситуации использования блокировки недостаточно, потому что пользователь все еще может войти в систему, например используя токены аутентификации 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 также начинает ухудшаться с точки зрения производительности, если у вас тысячи учетных записей пользователей или больше.