Question:
I’m using ansible to provision my Centos 7 produciton cluster. Unfortunately, execution of below command results with ansible Tiemout
and Linux Pluggable Authentication Modules (pam) error conversation failed
.
The same ansible command works well, executed against virtual lab mad out of vagrant boxes.
Ansible Command
1 2 3 4 5 6 |
$ ansible master_server -m yum -a 'name=vim state=installed' -b -K -u lukas -vvvv 123.123.123.123 | FAILED! => { "msg": "Timeout (7s) waiting for privilege escalation prompt: \u001b[?1h\u001b=\r\r" } |
SSHd Log
1 2 3 4 |
# /var/log/secure Aug 26 13:36:19 master_server sudo: pam_unix(sudo:auth): conversation failed Aug 26 13:36:19 master_server sudo: pam_unix(sudo:auth): auth could not identify password for [lukas] |
Answer:
I’ve found the problem. It turned out to be PAM’s auth module problem! Let me describe how I got to the solution.
Context:
I set up my machine for debugging – that is I had four terminal windows opened.
- 1st terminal (local machine): Here, I was executing
ansible prduction_server -m yum -a 'name=vim state=installed' -b -K -u username
- 2nd terminal (production server): Here, I executed
journalctl -f
(system wide log). - 3rd terminal (production server): Here, I executed
tail -f /var/log/secure
(log for sshd). - 4th terminal (production server): Here, I was editing
vi /etc/pam.d/sudo
file.
Every time, I executed command from 1st terminal I got this errors:
1 2 3 |
# ansible error - on local machine Timeout (7s) waiting for privilege escalation prompt error. |
1 2 3 4 |
# sshd error - on remote machine pam_unix(sudo:auth): conversation failed pam_unix(sudo:auth): [username] |
I showed my entire setup to my colleague, and he told me that the error had to do something with “PAM”. Frankly, It was the first time that I’ve heard about PAM.
I figured out, that error relates to auth interface located in /etc/pam.d/sudo module. Diging over the internet, I stambled upon this pam_permit.so
module with sufficient
controll flag, that fixed my problem!
Solution
Basically, what I added was auth sufficient pam_permit.so
line to /etc/pam.d/sudo
file. Look at the example below.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ cat /etc/pam.d/sudo #%PAM-1.0 # Fixing ssh "auth could not identify password for [username]" auth sufficient pam_permit.so # Below is original config auth include system-auth account include system-auth password include system-auth session optional pam_keyinit.so revoke session required pam_limits.so session include system-auth |
Conclusion:
I spent 4 days to arrive to this solution. I stumbled upon over a dozens solutions that did not worked for me, starting from “duplicated sudo password in ansible hosts/config file”, “ldap specific configuration” to getting advice from always grumpy system admins!
Note:
Since, I’m not expert in PAM, I’m not aware if this fix affects other aspects of the system, so be cautious over blindly copy pasting this code! However, if you are expert on PAM please share with us alternative solutions or input. Thanks!
This solution broken sudo.
You’ve just set PAM to test “if 1==1, let them sudo” which is incredibly insecure.