ローカルアカウントのパスワードが何歳であるかを確認するには?

ローカルアカウントのパスワードが何歳であるかを確認するには?

Ansible 2.9.27とPython 2.7.5がインストールされているRHEL 7.9環境で知りたいです。

  • ローカルルートアカウントのパスワードは何日ですか?
  • 最後のパスワード変更後数日経過しましたか?

ここでは、次のように最後のパスワード変更日を確認できます。

sudo chage -l root
Last password change                                    : Jan 01, 1970
...
  • Ansibleで最後の変更日と今日の違いを計算する方法は?

答え1

RHELには利用可能なものが1つあるため、getentそこからパスワード使用期間データを取得できます。 3番目のフィールドは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

getentただし、必要な情報を取得するにはroot権限が必要な場合があります。 (これはのデータに対応しますが、/etc/shadowデータがたとえばLDAPにある場合、構成によって異なります。)

もちろん、誰かがgetentrootとして実行することを許可した場合(例えばsudoを介して)、不要なパスワードハッシュを見ることができますchage -l。これが発生しないようにしたり、少なくとも困難にするには、getent | cutスクリプトパイプラインを実行して実行のみを許可するスクリプトを作成できます。それ

答え2

いくつかの調査の終わりに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 の非ローカルアカウントが関連している場合は、追加の作業が必要です。

関連情報