CentOS7实现OpenLDAP统一认证(客户端)

接着上次的OpenLDAP统一认证继续写,这次写的是我们的客户端如何对接到OpenLDAP服务端。

实现Linux用户统一认证


身份验证服务是实际向LDAP验证用户身份的服务,通过可插入身份验证模块(PAM)提供了本地 Linux 身份验证服务。
PAM 先对本地的 /etc/passwd 文件检查用户帐号,然后再对 LDAP 服务器进行检查,PAM LDAP 模块可以用来将身份验证重定向到 LDAP 目录上。

安装PAM模块

1
yum install pam_ldap nss-pam-ldapd -y

修改配置文件

总共需要修改4个配置文件分别如下

编辑ldap.conf文件

1
2
3
4
5
6
7
8
9
10
vim /etc/openldap/ldap.conf
BASE dc=11ziyun,dc=com
# 修改为服务端之前定义的组织名称
URI ldap://10.10.7.160:389/
# 修改为服务端的ip地址
tls_cacertdir /etc/openldap/cacerts
pam_password md5
ssl no
SASL_NOCANON on

编辑nsswitch.conf文件

1
2
3
4
5
vim /etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group: files ldap
# 在此三项后面添加 ldap 即可

编辑system-auth文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vim /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
#session optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
#上面这个为用户登录自动创建家目录,但是我测试因为权限问题创建不成功
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session optional pam_ldap.so
session required pam_unix.so

编辑nslcd.conf文件

1
2
3
4
5
6
vim /etc/nslcd.conf
uri ldap://10.10.7.160/
base dc=11ziyun,dc=com
ssl no
tls_cacertdir /etc/openldap/cacerts

编辑sshd_config配置文件

1
2
UsePAM yes
# 其他默认不变即可

编辑sshd文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
#session required pam_mkhomedir.so
# 用于第一次登录的账户自动创建家目录,这里我没有测试成功

启动及验证

重启服务
1
2
systemctl restart nslcd
systemctl restart sshd

通过LDAP WEB界面创建一个账号,然后用SSH登录测试一下


通过登录我们可以看到,用户是没有家目录的,这样是非常不友好的。

用户家目录

我们可以通过两种方式来实现创建家目录:
1. 用户登录自动创建家目录
2. 通过nfs共享家目录,用户登录自动挂载

自动创建家目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
yum install -y oddjob-mkhomedir oddjob
service messagebus start
service oddjobd start
vim /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
# 这个就是登陆自动创建家目录
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session optional pam_ldap.so
session required pam_unix.so

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vim /etc/pam.d/password-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so

SSH登陆上同样也要加一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
session required pam_mkhomedir.so
# 这个就是通过ssh登录自动创建家目录的

配置完重启 sshdnslcd即可,接下来我们验证下

这里我们通过web界面创建了一个用户,设置了用户家目录,默认shell为/bin/bash,然后通过登录我们可以看到,会自动创建家目录。不过有一点需要注意的是用户的密码一定要设置成md5验证方式,如果设置成其他的,可能或导致ldap认证失败。

NFS自动挂载家目录

服务端配置,安装NFS
1
yum -y install nfs-utils rpcbind

设置需要共享的家目录

1
2
vim /etc/exports
/home 10.10.7.0/24(sync,rw)

启动NFS服务

1
2
systemctl start rpcbind
systemctl start nfs

客户端配置

1
2
3
4
5
6
7
8
9
10
11
mount -t nfs 10.10.7.163:/ldaphome /ldaphome
df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext3 40G 7.2G 31G 20% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 500K 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vdb1 ext4 493G 572M 467G 1% /data
tmpfs tmpfs 783M 0 783M 0% /run/user/0
10.10.7.163:/ldaphome nfs4 40G 5.1G 33G 14% /ldaphome

可以加入到开机自动挂载中

1
10.10.7.163/ldaphome /ldaphome nfs defaults 1 2

这样永久挂载后,每次系统启动都会自动挂载服务器端NFS,当服务端NFS没有开启时,本地客户端启动时会执行挂载任务,导致系统启动速度变慢。因此,我们可以把服务端的NFS自动挂载到本地,当我们需要时,再去访问。
很多都是推荐用autofs这个软件包来实现自动挂载,不过我在centos6中可以实现,在Cetnos7上好像出现了问题。
所以这里我推荐还是用自动创建家目录的方式,然后在配置sudo来管理用户的权限问题。

ldap支持密钥认证

之前的配置只能用密码认证,但是我们需要直接ssh密钥认证还需要做一点配置
1
2
yum install openssh-ldap
cp /usr/share/doc/openssh-ldap-6.6.1p1/ldap.conf /etc/ssh/

再来修改/etc/ssh/sshd_config文件

1
2
3
AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP
PubkeyAuthentication yes
AuthorizedKeysCommandUser root

这里需要一个小脚本,脚本将从LDAP获取密钥并将其提供给SSH服务器

1
2
3
4
5
#!/bin/sh
vim /usr/local/bin/fetchSSHKeysFromLDAP
ldapsearch -x '(&(objectClass=ldapPublicKey)(uid='"$1"'))' 'sshPublicKey' | \
sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

配置完sshd之后重启一下即可,接下来还需要在ldap web界面配置支持密钥登录

我们看一下之前建的用户,给他添加一个新值

接下来我们可以通过xshell生成密钥的工具来生成密钥对,将公钥复制到对话框即可

添加完公钥,我们用xshell密钥验证的方式来登录测试一下

ldap用户支持sudo

默认Centos中并没有让LDAP支持sudo的套件,所以这里我们需要简单的配置一下

服务端配置

先找到sudo套件里面的 schema.OpenLDAP,然后复制到相对应的目录
1
2
3
4
5
6
yum install openldap-servers openldap-clients openssh-ldap
rpm -qal | grep sudo
/usr/share/doc/sudo-1.8.6p7/schema.OpenLDAP
# 找到schema.OpenLDAP文件
cp /usr/share/doc/sudo-1.8.6p7/schema.OpenLDAP /usr/local/openldap-2.4.44/etc/openldap/schema/sudo.schema
# 这里是编译安装的所以在这个路径,如果是yum安装的应该是在/etc/openldap/schema/sudo.schema

接下来在找到openssh的部分

1
2
3
4
rpm -qal | grep openssh-ldap
/usr/share/doc/openssh-ldap-6.6.1p1/openssh-lpk-openldap.schema
cp /usr/share/doc/openssh-ldap-6.6.1p1/openssh-lpk-openldap.schema /usr/local/openldap-2.4.44/etc/openldap/schema/
# yum安装的同上

接下来我们直接在主配置文件上引入即可

1
2
3
4
vim /usr/local/openldap-2.4.44/etc/openldap/slapd.conf
include /usr/local/openldap-2.4.44/etc/openldap/schema/openssh-lpk-openldap.schema
include /usr/local/openldap-2.4.44/etc/openldap/schema/sudo.schema
# 接下来kill掉之前的进程,重新启动下slapd即可

默认情况下phpldapadmin是不支持sudo的配置,所以需要到官网上弄两个template
http://phpldapadmin.sourceforge.net/wiki/index.php/TemplatesContributed:Sudo
在这个网站中有Creation TemplateModification Templat,分别将内容复制到以下两个xml文件中即可

1
2
/usr/share/phpldapadmin/templates/creation/sudo.xml
/usr/share/phpldapadmin/templates/modification/sudo.xml

配置完成之后phpldapadmin会自动载入,但是必须在phpldapadmin中先建立 ou=sudoers才可以使用此模板

客户端配置

让用户通过LDAP支持sudo需要做两个配置
编辑/etc/sudo-ldap.conf
1
2
3
vim /etc/sudo-ldap.conf
uri ldap://10.10.7.163/
sudoers_base ou=sudoers,dc=11ziyun,dc=com

编辑/etc/nsswitch.conf

1
2
3
vim /etc/nsswitch.conf
sudoers: files ldap
# 这句话的意思是先判断本机的sudo,然后在判断ldap的

验证

sudo的建立方式必须是ou=sudoers,所以这里先建一个sudoers

接下我们在sudoers下面随便建一个用户

建完用户之后我们先用这个用户登录一下,确认能不能使用sudo

这里应该是不能使用sudo,不过我们这次在ldap web界面上配置一下,应该就ok了


我们再次登录,使用sudo命令看会不会报错

可以看到我们的sudo配置已经生效。

实现GitLab用户统一认证


这里安装的是9.5.4-ce.0.el7这个版本的gitlab,其他版本应该类似,请自行测试。
因为之前安装过gitlab,所以一些默认配置暂时不贴出来,这里只更改gitlab相关配置。

修改gitlab文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vim /etc/gitlab/gitlab.rb
gitlab_rails['ldap_enabled'] = true
###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main: # 'main' is the GitLab 'provider ID' of this LDAP server
label: 'LDAP'
host: '10.10.7.163'
port: 389
uid: 'uid'
method: 'plain' # "tls" or "ssl" or "plain"
bind_dn: 'cn=admin,dc=11ziyun,dc=com'
password: '123.com'
active_directory: true
allow_username_or_email_login: false
block_auto_created_users: false
base: 'dc=11ziyun,dc=com'
user_filter: ''
attributes:
username: ['uid', 'userid', 'sAMAccountName']
email: ['mail', 'email', 'userPrincipalName']
name: 'cn'
first_name: 'givenName'
last_name: 'sn'
EOS

初始化配置

1
2
gitlab-ctl reconfigure
gitlab-ctl restart

配置完成之后,我们用之前的openldap账户登录gitlab验证一下即可

实现jenkins用户统一认证

安装ldap相关插件

在 [系统管理] –> [插件管理] –> [可选插件] 查找ldap,最好把所有的ldap相关的插件都安装一下

ldap相关配置

在 [系统管理] –> [Configure Global Security] 中配置

ldap相关验证

不过这里需要注意一点,jenkins配置完ldap之后,之前配置的用户密码就不能在登录使用了

实现zabbix用户统一认证


暂时未配置,敬请期待

本文标题:CentOS7实现OpenLDAP统一认证(客户端)

文章作者:火柴

发布时间:2017年09月09日 - 09:09

最后更新:2017年09月14日 - 09:09

原始链接:http://www.chen-hao.com.cn/posts/5943/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

火柴 wechat
扫描上方二维码关注我的博客!
0%