로컬 계정 비밀번호가 몇 살인지 확인하는 방법은 무엇입니까?

로컬 계정 비밀번호가 몇 살인지 확인하는 방법은 무엇입니까?

Ansible 2.9.27 및 Python 2.7.5가 설치된 RHEL 7.9 환경에서 알고 싶습니다.

  • 로컬 루트 계정의 비밀번호는 며칠(일)입니까?
  • 마지막 비밀번호 변경 후 며칠이 지났나요?

여기에서 다음을 통해 마지막 비밀번호 변경 날짜를 확인할 수 있습니다.

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

getent그러나 필요한 정보를 얻으 려면 루트 권한이 필요할 수도 있습니다 . (이는 의 데이터에 해당되지만 /etc/shadow데이터가 예를 들어 LDAP에 있는 경우 구성에 따라 달라질 수 있습니다.)

물론 누군가가 getent루트로 실행하도록 허용하면(예: 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의 비로컬 계정이 관련된 경우 추가 작업이 필요합니다.

관련 정보