如何找出本地帐户密码的天数?

如何找出本地帐户密码的天数?

在具有 Ansible 2.9.27 和 Python 2.7.5 的 RHEL 7.9 环境中,我想了解一下

  • 本地 root 帐户的密码有多长(以天为单位)?
  • 自上次更改密码以来已经过了多少天?

由此可以通过以下方式获取最后一次密码更改的日期

sudo chage -l root
Last password change                                    : Jan 01, 1970
...
  • 如何在 Ansible 中计算上次更改日期和今天之间的差异?

答案1

RHEL 应该有一个可用的getent,因此您可以从那里获取密码期限数据。这是第三个字段,是从 1970 年开始的天数。今天的天数可以从纪元以来的当前时间(以秒为单位)除以 86400 并截断后找到。 (好吧,也许可以给出或去掉你的时区偏移量。我不确定影子工具是否根据当地的时区,或根据 UTC。)

# user=ilkkachu
# age=$(( $(date +%s) / 86400 - $(getent -- shadow "$user" |cut -d: -f3) ))
# printf "age of user %s's password is %d days\n" "$user" "$age"
age of user ilkkachu's password is 1444 days

不过,您可能需要成为 root 才能getent获取所需的信息。 (对于 中的数据来说确实如此/etc/shadow,但如果数据位于例如 LDAP 中,则可能取决于配置。)

当然,允许某人getent以 root 身份运行(例如通过 sudo)也将允许他们看到密码哈希,这是他们不需要的,而且这不仅仅是chage -l让他们知道。为了防止这种情况发生,或者至少让它变得更难,您可以创建一个运行该脚本的脚本getent | cut管道的脚本,并且只允许它们运行

答案2

经过一些研究,我发现两者之间的区别当前时间(以秒为单位)自日期以来的秒数可以按照下面所示的方式减去。之后只需要通过除法将秒变成天即可。

  - name: Gather root password age in days
    shell:
      cmd: echo $(( ($(date +%s) - $(date +%s -d "$(chage -l root | head -1 | cut -d ':' -f 2)")) / 86400 ))
    check_mode: false
    changed_when: false
    failed_when: false
    register: result

  - name: Show result
    debug:
      msg: "{{ result.stdout | int }}"

谢谢

进一步的步骤

如果涉及到 LDAP 中的非本地帐户,则需要做更多的工作。

相关内容