Linux:禁用用户帐户:是否有非 root shell 命令可以显示帐户是否被禁用?

Linux:禁用用户帐户:是否有非 root shell 命令可以显示帐户是否被禁用?

是否有非 root shell 命令可以告诉我某个用户的帐户是否被禁用?

请注意,我区分了 LOCKING 和 DISABLED:

  • LOCKING 是将!*或添加!!到 /etc/passwd 或 /etc/shadow 文件的密码字段中。密码锁定可以通过(password -l username以 root 身份)在 shell 提示符下完成,以锁定用户名的帐户,使用 选项-u将解锁它。
  • 禁用帐户是通过将用户帐户的到期时间设置为过去的某个时间点来完成的。这可以通过 来完成chage -E 0 username,它将到期日期设置为 Unix 纪元后的 0 天。将其设置为-1将禁用到期日期的使用。

就我的情况而言,使用锁定是不够的,因为用户可能仍然能够登录,例如使用 ssh 身份验证令牌,并且该用户下的进程仍然可以生成其他进程。因此,我们有启用或禁用的帐户,而不仅仅是锁定的帐户。我正在寻找一种通过 shell 命令检查帐户启用/禁用状态的方法,以便在自定义 Java 进程中使用。Java 进程可以解析输出或使用退出代码,并且可以执行复杂的语句,例如包括命令之间的管道的语句。

这旨在用于 Red Hat Enterprise 5.4 系统。

这个问题之前已经在 SuperUser 上问过了。

答案1

来自评论:
正如您所描述的,这是不可能的,因为:信息仅在 shadow 中描述,并且 shadow 只能由 root 读取。任何需要密码哈希或帐户过期的程序都必须是 SUID(如果您使用存储在 shadow 中的本地帐户,如您所说。)

补充信息:
我最初使用更改(1)作为来源。

笔记

chage 程序需要有一个可用的影子密码文件。

我现在已经更新了我的信息,使其更加精确,并确认了事情。

首先,我检查了 chage 的源代码以确保万无一失。看来它确实需要访问影子文件,并且将信息存储在其他地方。其次,您可以使用 PAM 来允许使用 chage 的 root 功能。(check_perms at chage.c:523)

正如其他人所说的那样,用作影子后端的任何其他东西(即,nsswitch.conf除了文件和数据库之外的任何东西)都有其自己的处理方式。

简而言之:当使用文件作为后端时,密码时效信息确实存储在那里,而且只存储在那里。如果您仍然想使用文件后端,您应该编写一个程序并将其设置为 SUID,因为系统要么全有要么全无。您可以只查询您的用户,也可以查询并设置所有人。从好的方面来说,用 C 编写一些东西来做您想做的事情只需要几行代码。您基本上可以从 chage 的源代码中复制三个函数并添加一个新的主函数。

答案2

我不确定是否有简单的检查方法。我怀疑作为普通用户,您是否有权访问 passwd 文件(不是影子文件),因此您无法轻松地使用 sed/awk/grep 查找 ! 字段。

您可以做的是设计一个非常具体的脚本,使其对非 root 用户无 rwx 权限,然后专门为该命令创建一个 sudo 条目。您甚至可以使其无密码。理想情况下,您不会接受任何输入,因此“破解”脚本也会更加困难。我想这取决于您想要有多偏执/谁将有权访问它。

答案3

没有非 root 命令,但有 root 命令。它是passwd -S <username>。它输出以下内容:

显示帐户状态信息。状态信息由 7 个字段组成。第一个字段是用户的登录名。第二个字段指示用户帐户是否有锁定密码 (L)、无密码 (NP) 或可用密码 (P)。第三个字段给出上次更改密码的日期。接下来的四个字段是密码的最小使用期限、最大使用期限、警告期限和不活动期限。这些使用期限以天为单位表示。

因此,最好的方法是调用如下脚本

#!/bin/sh
passwd -S $1

并允许sudo在 Java 程序内部使用密码进行调用。

注意:上述脚本容易受到代码注入的攻击,因此您必须确保其安全。

答案4

一种方法是将您的帐户信息移至 LDAP 或 SQL。然后使用 PAM 模块将它们与您的服务器集成。您的 Java 应用程序可以轻松直接访问 LDAP 或 SQL。

如果您拥有多台具有相同用户群的服务器,则这种方法的扩展性和管理性会更强。但是如果您拥有数千个或更多的用户帐户,/etc/passwd 的性能也会开始受到影响。

相关内容