Select Your Language

Infrastructure and Management

Cloud Computing

Storage

Runtimes

Integration and Automation

  • Comments
  • RHEL 7 and pam_pwhistory - old password can still be re-used

    Posted on

    The intent is to prevent a user from re-using old passwords. We elect to remember 4 previous passwords in our requirements. We are trying to implement this on RHEL 7.2.1511.

    Previously, this should be done via pam_unix.so, but we now have pam_pwhistory.so, so I base my attempts around it.

    First, we examine /etc/pam.d/passwd to see what is used for the service:

    #%PAM-1.0
    auth       include      system-auth
    account    include      system-auth
    password   substack     system-auth
    -password   optional    pam_gnome_keyring.so use_authtok
    password   substack     postlogin
    

    Surprisingly, it's not password-auth, but rather system-auth that's used (probably because password-auth is used for remote authentication (e.g. sshd), whereas system-auth is geared more towards local authentication -- just my guess).

    So, we look at the system-auth: ls -l /etc/pam.d/system-auth results in:

    lrwxrwxrwx. 1 root root 16 Aug  2 16:34 /etc/pam.d/system-auth -> system-auth-ac
    

    As system-auth-ac is overwritten automatically by authconfig, it's recommended to create a different file and link it to your system-auth. We choose to call ours "system-auth-paid". Here are its contents:

    auth include system-auth-ac
    
    account include system-auth-ac
    
    password include system-auth-ac
    
    session include system-auth-ac
    

    Next, we modify it to use our specs:

    auth include system-auth-ac
    
    account include system-auth-ac
    
    password substack system-auth-ac
    password required pam_pwhistory.so debug use_authtok remember=4
    
    session include system-auth-ac
    
    

    Only two things changed here:
    1) I included password directives from "system-auth-ac" as a substack, rather than plain include (had to do this after some testing).
    2) I added a new line for pam_pwhistory.so with three parameters (debug, use_authtok, remember=4).

    Now I try to test this with a non-elevated user.
    I had already changed the password once, so I have two values for passwords: CURRENT_PASSWORD and OLD_PASSWORD.

     passwd    # here, I am logged in as a non-elevated user called 'testuser'
    Changing password for user testuser.
    Changing password for testuser.
    (current) UNIX password: CURRENT_PASSWORD
    New password: OLD_PASSWORD
    Retype new password: OLD_PASSWORD
    Password has been already used. Choose another.
    passwd: Have exhausted maximum number of retries for service
    

    This would appear to be exactly what we want. The problem is that now OLD_PASSWORD is actually set as my password, despite the system telling me that it was rejected (?!)

    At the same time, I am tailing /var/log/messages to see what "debug" directive from pam_pwhistory.so spits out.

    Snippet from /var/log/messages

    Aug  3 12:27:48 localhost passwd: pam_unix(passwd:chauthtok): password changed for testuser
    Aug  3 12:27:48 localhost passwd: pam_pwhistory(passwd:chauthtok): pam_sm_chauthtok entered
    Aug  3 12:27:48 localhost passwd: pam_pwhistory(passwd:chauthtok): got new auth token
    Aug  3 12:27:48 localhost passwd: pam_pwhistory(passwd:chauthtok): check against old password file
    Aug  3 12:27:48 localhost pwhistory_helper[18109]: New password already used   # --- this is good
    Aug  3 12:27:48 localhost passwd: pam_pwhistory(passwd:chauthtok): Aborted, too many tries 
    Aug  3 12:27:48 localhost passwd: gkr-pam: no password set, and use_authtok was specified   # --- ???
    

    Problems:
    1) Right now, although OLD_PASSWORD appears to have been rejected, it's actually my new password!
    2) Looking at /var/log/messages last line, I thought I should remove use_authtok. But if I do so, then I obviate previous directives (e.g. from pam_pwquality.so) which are very useful and should be passed onto this stage.
    3) Also, if I do go ahead and remove use_authtok, so that my line looks like this:

     password required pam_pwhistory.so debug remember=4
    

    I still have the same problem. So, I chose to leave use_authtok in.

    Finally, if I change "required" directive to "requisite", so that it looks like this:

    password requisite pam_pwhistory.so debug use_authtok remember=4
    

    I still have the same problem.

    Looking for any ideas/help. Greatly appreciated.

    by

    points

    Responses

    Red Hat LinkedIn YouTube Facebook X, formerly Twitter

    Quick Links

    Help

    Site Info

    Related Sites

    © 2025 Red Hat