本文首发: https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html
我这里使用的是 CentOS 完成的 LDAP 用户管理, 可能与网上的大部分教程不同, 不过写出来了, 那么是肯定能用的了, 不过会有部分文件, 忘指教.
这里使用的 OPENLdap 配合 CentOS7 完成的用户管理, 需要配置 nssswitch ,pam 和 sssd 3 个服务, 需要先有一定的了解才能完成本文的配置.
基础配置
完成 yum 源的配置
- mkdir /root/back
- tar -Jcvf /root/back/yum.repos.d-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/yum.repos.d/
- rm -rf /etc/yum.repos.d/*
- curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- curl -o /etc/yum,repos.d/CentOS-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
- yum makecache
安装必要软件
yum -y install VIM bash-completion openldap-servers openldap-clients nss-pam-ldapd sssd
OPENLdap 服务初始化
初始化过程就不再过多赘述, 详细查询《OPENLDAP 服务搭建和后期管理》.
首先停止数据库服务:
systemctl stop slapd
然后编辑文件:
- # 首先备份文件, 以免无法复原
- mkdir /root/back
- tar -Jcvf /root/back/slapd.config-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/openldap/slapd.d/
- tar -Jcvf /root/back/slapd.data-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap/
- # 然后再删除配置文件
- rm -rf /etc/openldap/slapd.d/*
- rm -rf /var/lib/ldap/*
- # 复制配置文件到临时目录
- mkdir /root/ldap
- cd /root/ldap
编写 slapd 的配置文件. 这里的配置文件是从
/usr/share/openldap-servers/slapd.ldif
中演变而来的, 主要修改了 baseDN(suffix), OPENLDAPTLS,olcRootPW(密码由 slappasswd 生成, 本文中的密码为: 123456) 和 include.
- # file: /root/ldap/slapd.ldif
- dn: cn=config
- objectClass: olcGlobal
- cn: config
- olcArgsFile: /var/run/openldap/slapd.args
- olcPidFile: /var/run/openldap/slapd.pid
- olcTLSCertificateFile: /etc/openldap/certs/server.crt
- olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
- olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem
- dn: cn=schema,cn=config
- objectClass: olcSchemaConfig
- cn: schema
- include: file:///etc/openldap/schema/core.ldif
- include: file:///etc/openldap/schema/cosine.ldif
- include: file:///etc/openldap/schema/nis.ldif
- include: file:///etc/openldap/schema/inetorgperson.ldif
- dn: olcDatabase=frontend,cn=config
- objectClass: olcDatabaseConfig
- objectClass: olcFrontendConfig
- olcDatabase: frontend
- dn: olcDatabase=config,cn=config
- objectClass: olcDatabaseConfig
- olcDatabase: config
- olcAccess: to *
- by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
- by * none
- dn: olcDatabase=monitor,cn=config
- objectClass: olcDatabaseConfig
- olcDatabase: monitor
- olcAccess: to *
- by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
- by dn.base="cn=Manager,dc=black,dc=com" read
- by * none
- dn: olcDatabase=hdb,cn=config
- objectClass: olcDatabaseConfig
- objectClass: olcHdbConfig
- olcDatabase: hdb
- olcSuffix: dc=black,dc=com
- olcRootDN: cn=Manager,dc=black,dc=com
- olcRootPW: {SSHA}l1vBI/HOMKLEiQZgcm3Co+hFQI68rH1Q
- olcDbDirectory: /var/lib/ldap
- olcDbIndex: objectClass eq,pres
- olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
配置 OPENSSL 的证书. 为 openldap 服务器的加密隧道使用.
- # 首先是创建 CA 服务的证书文件
- cd /etc/pki/CA
- openssl genrsa -out private/cakey.pem 2048
- openssl req -new -x509 -key private/cakey.pem -out cacert.pem # 这里的证书创建过程就省略不写了.
- # 不过需要注意的是, 必须要保证后面服务器证书申请的开头部分必须与证书开头相同, 否则无法通过 CA 签发证书.
- touch index.txt
- echo "01"> serial
- # 然后申请签发服务器证书
- cd /etc/openldap/certs/
- openssl genrsa -out server.key 2048
- openssl ca -in server.csr -out server.crt -days 365
- # 复制 CA 证书到指定位置
- mkdir /etc/openldap/cacerts
- cp /etc/pki/CA/cacert.pem /etc/openldap/cacerts/
根据配置生成服务器的配置文件
- slapadd -F "/etc/openldap/slapd.d/" -b "cn=config" -l slapd.ldif
- # 这里还需要注意文件属主还是 root 的, 需要改回为 openldap
- chown -R ldap:ldap /etc/openldap/slapd.d/*
- # 然后再开启服务即可
- systemctl start slapd
- _#################### 100.00% eta none elapsed none fast!
Closing DB...
初始化数据库
- dn: dc=black,dc=com
- dc: black
- objectClass: top
- objectClass: domain
- dn: cn=Manager,dc=black,dc=com
- objectClass: organizationalRole
- cn: Manager
- description: LDAP Manager
- dn: ou=People,dc=black,dc=com
- ou: People
- objectClass: top
- objectClass: organizationalUnit
- objectClass: domainRelatedObject
- associatedDomain: black.com
- dn: ou=Group,dc=black,dc=com
- ou: Group
- objectClass: top
- objectClass: organizationalUnit
- objectClass: domainRelatedObject
- associatedDomain: black.com
导入至数据库
- ldapadd -x -D "cn=Manager,dc=black,dc=com" -w 123456 -f base.ldif # 将基础信息导入数据库.
- adding new entry "dc=black,dc=com"
- adding new entry "cn=root,dc=black,dc=com"
- adding new entry "ou=People,dc=black,dc=com"
- adding new entry "ou=Group,dc=black,dc=com"
那么再使用 apache directory studio 来查看 服务器是否配置成功.
首先先将防火墙开启
firewall-cmd --add-service=ldap
我们这里先导入一个用户用于后面的测试使用
NSS ,PAM 和 SSSD 配置
NSS 服务配置
如果想使 nss 可以查询 ldap, 那么首先就需要启用一个叫 nslcd 的服务, 以下是该服务的配置文件.
- # file: /etc/nslcd.conf
- uid nslcd
- gid ldap
- uri ldap://127.0.0.1/
- base dc=black,dc=com
- binddn cn=Manager,dc=black,dc=com
- bindpw 123456
- ssl no
- tls_cacertdir /etc/openldap/cacerts
启动服务
- chmod 600 /etc/nslcd.conf
- systemctl start nslcd
- systemctl enable nslcd
配置 nss
- # file: /etc/nsswitch.conf
- passwd: files ldap # 主要就是 passwd,shadow 和 group 这 3 行需要后面添加 ldap
- shadow: files ldap
- group: files ldap
- hosts: files dns myhostname
- bootparams: nisplus [NOTFOUND=return] files
- ethers: files
- netmasks: files
- networks: files
- protocols: files
- rpc: files
- services: files sss
- netgroup: nisplus sss
- publickey: nisplus
- automount: files nisplus sss
- aliases: files nisplus
测试是否可用:
- getent passwd | grep black
- black1001:1001:black:/home/black:/bin/bash
PAM 服务配置
这里 PAM 的配置文件我是从另一台使用 authconfig-tui 配置内容拷过来的.
- # file: /etc/pam.d/system-auth
- auth required pam_env.so
- auth required pam_faildelay.so delay=2000000
- auth [default=1 ignore=ignore success=ok] pam_succeed_if.so uid>= 1000 quiet
- auth [default=1 ignore=ignore success=ok] pam_localuser.so
- auth sufficient pam_unix.so nullok try_first_pass
- auth requisite pam_succeed_if.so uid>= 1000 quiet_success
- auth sufficient pam_sss.so forward_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_sss.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 sha512 shadow nullok try_first_pass use_authtok
- password sufficient pam_sss.so use_authtok
- password required pam_deny.so
- session optional pam_keyinit.so revoke
- session required pam_limits.so
- -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_sss.so
PAM 不用进行服务重启, 直接可以使用
sssd 服务配置
针对 LDAP 用户登入, PAM 配置会将其转发给 SSSD, 由 SSSD 来认证用户.
- # file: /etc/sssd/sssd.conf
- [domain/black.com]
- autofs_provider = ldap
- cache_credentials = True
- ldap_search_base = dc=black,dc=com
- id_provider = ldap
- auth_provider = ldap
- chpass_provider = ldap
- ldap_uri = ldap://127.0.0.1/
- ldap_id_use_start_tls = True
- ldap_tls_reqcert = never
- ldap_tls_cacertdir = /etc/openldap/cacerts
- [sssd]
- services = nss, pam, autofs
- domains = black.com
- [nss]
- homedir_substring = /home
- [pam]
- [sudo]
- [autofs]
- [SSH]
- [pac]
- [ifp]
- [secrets]
- [session_recording]
配置启动服务, 并且设置开机自启动.
- chmod 600 /etc/sssd/sssd.conf # 注意权限的配置, 否则无法启动.
- systemctl start sssd
- systmctl enable sssd
测试
那么这样用户认证的部分就制作好了, 那么现在来测试一下:
因为配置的 system-auth 文件, 并没有配置 SSH 文件, 所以 SSH 是连接不进去的. 所以这里使用 login 来测试可行性.
脚本
我为这个 LDAP 用户认证写了一个脚本, 方便添加用户. 我这里还是要强调一下, CentOS 虽然有提供 migrationtools 工具用于将用户存放至 LDAP 数据库, 但是如果你把本地用户全都提到 LDAP 数据库, 不保留本地用户, 那么你就会发现, 电脑就会无法重启了, 所以推荐不要把 UID 小于 1000 的用户存放到 LDAP 服务器.
脚本放在 gitee 上了.
使用方法很简单
然后再测试一下这个添加的用户是否可以登入:
本文经「原本」原创认证, 作者乾坤盘, 访问 yuanben.io 查询 [5AT479HZ] 获取授权信息.
来源: https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html