Public key authentication for LDAP users using local authorized_keys

Public key authentication for LDAP users using local authorized_keys

We are using LDAP for account information. The environment is configured as follows ...

  • A CentOS 7 OpenLDAP directory server
  • A CentOS 7 client configured to use the directory server
    • authconfig has been used to configure the CentOS 7 client for LDAP authentication

I have noticed the following

  • A local user (one whose account information is in /etc/passwd) can ssh to the client itself without using public key authentication (without a password)
  • An LDAP user can ssh to the client itself using a password
  • An LDAP user cannot ssh to the client itself using public key authentication. The user has a properly configured ssh keys (id_rsa.pub, id_rsa) and authorized_keys similar to the local user

The debug output when performing an ssh using the local user is

debug1: Offering RSA public key: /home/localuser/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279

The debug output when performing an ssh using the LDAP user is

debug1: Offering RSA public key: /home/ldapuser/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic

The log, /var/log/secure, has the following entry after the LDAP user attempts to connect using public key authentication

Mar 19 16:47:01 localhost sshd[20539]: Connection closed by x.x.x.x [preauth]

LDAP can locate the user account

$ getent passwd ldapuser
ldapuser:x:5001:5000::/home/ldapuser:/bin/bash

When ssh allows PasswordAuthentication

$ ssh test
ldapuser@test's password: 
Last failed login: Sat Mar 19 17:08:29 UTC 2016 from x.x.x.x on ssh:notty
Last login: Sat Mar 19 15:55:40 2016

I realize that there are alternatives such as OpenSSH-LPK, but would like to be able to use a local authorized_keys that installed using Puppet as it doesn't require the maintenance of LDAP. I am not sure if this approach is possible and, if it is, of the configuration of sshd, PAM, or LDAP. Any pointers would be appreciated ...


Following Jakuje's suggestion of setting the log level to DEBUG for sshd, the logs contained the clue of

Mar 19 18:22:42 localhost sshd[20934]: debug1: temporarily_use_uid: 5001/5000 (e=0/0)
Mar 19 18:22:42 localhost sshd[20934]: debug1: trying public key file /home/ldapuser/.ssh/authorized_keys
Mar 19 18:22:42 localhost sshd[20934]: debug1: Could not open authorized keys '/home/ldapuser/.ssh/authorized_keys': Permission denied
Mar 19 18:22:42 localhost sshd[20934]: debug1: restore_uid: 0/0

The / and /home directories have the following permissions

$ ll -and / /home
dr-xr-xr-x. 17 0 0 4096 Feb 22 17:26 /
drwxr-xr-x.  5 0 0   45 Mar 19 03:05 /home

The /home/ldapuser directory has the following permissions

$ ll -an .
drwxr-xr-x. 3 5001 5000  99 Mar 19 16:46 .
drwxr-xr-x. 5    0    0  45 Mar 19 03:05 ..
drwx------. 2 5001 5000  76 Mar 19 02:45 .ssh

The /home/ldapuser/.ssh directory has the following permissions

$ ll -an .
total 16
drwx------. 2 5001 5000   76 Mar 19 02:45 .
drwxr-xr-x. 3 5001 5000   99 Mar 19 16:46 ..
-rw-r--r--. 1 5001 5000  419 Mar 19 02:45 authorized_keys
-rw-------. 1 5001 5000 1679 Mar 19 02:45 id_rsa
-rw-r--r--. 1 5001 5000  419 Mar 19 02:45 id_rsa.pub
-rw-r--r--. 1 5001 5000  177 Mar 19 02:45 known_hosts

The sshd daemon is setting the effective user to 5001/5000 and so am not sure why permission would be denied. The root user can switch to the ldapuser so the system is aware of the user.


Jakuje: Thanks so much! The SELinux was the cause of the problem and running the restorecon fixed the issue. I appreciate your help and patience!

答案1

Is SELinux on? What are the respective labels on these files?

ls -lZ /home/ldapuser /home/ldapuser/.ssh /home/ldapuser/.ssh/authorized_keys

Running restorecon -rf /home/ldapuser/ should fix the problems.

答案2

The home directory of the LDAP user needs to be owned by the user's LDAP uid. Same with the .ssh directory inside of the LDAP user's home, and the public key (authorized_keys) inside the .ssh directory.

Example:

mkdir -p /home/ldapuser/.ssh

cp authorized_keys /home/ldapuser/.ssh

getent passwd
...
kibosh:*:6035:100:kibosh:/home/kibosh:/bin/bash
ldapuser:*:6036:100:ldapuser:/home/ldapuser:/bin/bash

chmod -R 6036:users /home/ldapuser

ls -l /home
drwxr-xr-x  4 ldapuser         users      4096 Nov  2 10:40 ldapuser
...

Note: gid 100 is the gid of the local group users on my system.

Also, make sure permissions are correct for $HOME/.ssh and $HOME/.ssh/authorized_keys, etc.

相关内容