«Chage -l» и «passwd -S» дают разные значения для даты установки пароля в RHEL 6


3

Я заметил, что в RHEL 6 "chage -l USER" и "passwd -S USER" дают разные даты установки пароля. Любопытно узнать почему. Вот что я вижу:

[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 для новой учетной записи, я получаю 20.06.2015 как ПАРОЛЬ показывает. Вот эпоха, преобразованная в значение даты для пользователя 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-1970

  1. Когда пароль установлен с помощью команды passwd, / etc / shadow запишет количество дней с начала эпохи (01.01.1970) с использованием времени в UTC

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

Поэтому неудивительно, что программа изменений сообщает, что последний раз пароль изменялся 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 / localtime lrwxrwxrwx. 1 root root 36 янв. 23 17:59 / etc / localtime - & gt; / USR / доли / ZoneInfo / Америка / Триатлон

    [root @ sci-fi ~] # passwd -S джедай Джедай 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.)

Ответы:


0

Возможно оба:

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

Если вы добавите флаг «-u» к дате в своем расчете, я думаю, он вернется и 21 июня.


Да, использование -u с датой действительно дало мне время UTC, которое привело к 21.06.2015. Таким образом, выходные данные "chage -l" сообщают время UTC для последнего изменения пароля, тогда как выходные данные "passwd -S" возвращают время, используя местное время, которое видит сервер. Благодарю.
Suave-V
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.