web-dev-qa-db-ja.com

「chage-l」と「passwd-S」は、RHEL6のパスワード設定日の異なる値を示します

RHEL6では「chage-lUSER」と「passwd-SUSER」でパスワードの設定日が異なることに気づきました。理由を知りたい。これが私が見るものです:

[root@sci-fi ~]# chage -l jedi
Last password change                    : Jun 21, 2015
Password expires                    : never
Password inactive                   : never
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7

[root@sci-fi ~]# passwd -S jedi
jedi PS 2015-06-20 0 99999 7 -1 (Password set, SHA512 crypt.)

結果を新しいアカウントの/ etc/shadowに表示されるものと一致させると、passwdが示すように2015年6月20日を取得します。これは、ユーザーjediの日付値に変換されたエポックです。

[root@sci-fi ~]# date -d@"$(echo "$(awk -F ":" '/jedi/ {print $3}' /etc/shadow)*86400"|bc)"
Sat Jun 20 20:00:00 EDT 2015

それで、どちらが正しいですか?

**正解はすでに以下に示されていますが。私はもう少し掘り下げて、答えが正しいことを合理的に証明することができました。このリンクは非常に役に立ちました:

https://serverfault.com/questions/220633/calculate-days-since-1-1-197

  1. Passwdコマンドでパスワードを設定すると、/ etc/shadowはUTCの時刻を使用して、エポック(1/1/1970)からの日数を記録します。

私はこれを証明するためにテストをしました。 jediアカウントに新しいパスワードを設定しました。以下で計算されるように、エポックからの現在の日数は16823です。

[root@sci-fi ~]# echo $(($(date --utc --date "$1" +%s)/86400))
16823

ファイル/ etc/shadowはこれに同意します(したがって、これは事実です):

[root@sci-fi ~]# awk -F ":" '/jedi/ {print $3}' /etc/shadow
16823
  1. 変更プログラムは、/ etc/shadowファイルで報告された最後のパスワード変更を使用して、最後の変更日を報告します。

Straceツールは、ファイル/ etc/shadowがchageによってアクセスされていることを示しています。はい、他のいくつかのファイルがchageによって読み取られますが、パスワードが最後に設定されたエポックからの日数が含まれるのはシャドウファイルのみです。

[root@sci-fi ~]# strace chage -l jedi 2>&1 | grep etc
open("/etc/ld.so.cache", O_RDONLY)      = 3
access("/etc/shadow", F_OK)             = 0
open("/etc/passwd", O_RDONLY)           = 4
open("/etc/shadow", O_RDONLY)           = 5
open("/etc/localtime", O_RDONLY)        = 6

このため、chageプログラムが1月23日にパスワードが最後に変更されたと報告するのは当然のことです。

[root@sci-fi ~]# chage -l jedi | head -1
Last password change                    : Jan 23, 2016
  1. Passwdコマンドは少し異なり、それほど明確ではありません。

Straceを使用すると、passwdコマンドも/ etc/shadowから最後のパスワード変更を引き出しているように見えます。

[root@sci-fi ~]# strace passwd -S jedi 2>&1 | grep etc
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/etc/nsswitch.conf", O_RDONLY)    = 4
read(4, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1688
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/libuser.conf", O_RDONLY)     = 4
open("/etc/login.defs", O_RDONLY)       = 4
open("/etc/default/useradd", O_RDONLY)  = 4
stat("/etc/shadow", {st_mode=S_IFREG, st_size=1295, ...}) = 0
open("/etc/passwd", O_RDONLY)           = 4
open("/etc/shadow", O_RDONLY)           = 4
open("/etc/localtime", O_RDONLY)        = 4
  1. 「passwd-S」の出力は、システムのロケールに関して/ etc/shadowに記録されている最後のパスワード変更時刻を報告しているようです。これが私のロケールと「passwd-S」の出力です。

    [root @ sci-fi〜] #ls -l/etc/localtimelrwxrwxrwx。 1ルートルート36Jan 23 17:59/etc/localtime->/usr/share/zoneinfo/America/New_York

    [root @ sci-fi〜] #passwd -S jedi jedi PS 2016-01-22 0 99999 7 -1(パスワードセット、SHA512暗号化)

私の理論をテストします。ゾーンをロンドンに変更しました(5時間先):

[root@sci-fi ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 33 Jan 24 00:33 /etc/localtime -> /usr/share/zoneinfo/Europe/London

[root@sci-fi ~]# passwd -S jedi
jedi PS 2016-01-23 0 99999 7 -1 (Password set, SHA512 crypt.)

「passwd-S」コマンドの出力は、「chage-l」で表示されるものと一致するようになりました。

代わりに、タイムゾーンを山岳部標準時(MST)に変更すると、ESTタイムゾーンを使用した場合と同じ値が得られます。

[root@sci-fi ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 34 Jan 23 17:49 /etc/localtime -> /usr/share/zoneinfo/America/Denver

[root@sci-fi ~]# passwd -S jedi
jedi PS 2016-01-22 0 99999 7 -1 (Password set, SHA512 crypt.)
2
Suave-V

おそらく両方:

https://unix.stackexchange.com/questions/23193/etc-shadow-date-of-last-password-change-utc-or-local-time

計算で日付に「-u」フラグを追加すると、6月21日も返されると思います。

0
M. Ayers