OpenLDAP 是轻型目录访问协议 (LDAP) 的免费开源实现。
LDAP 是一种开放的、供应商中立的行业标准应用协议,用于通过 IP 网络访问和维护分布式目录信息服务。
目录服务通过允许在整个网络中共享有关用户、系统、网络、服务和应用程序的信息,在开发 Intranet 和 Internet 应用程序方面发挥着重要作用。
在这篇文章中,将介绍如何在 CentOS/RHEL 7 平台上使用 OpenLDAP v2.4 配置中央远程身份验证服务器。
在 CentOS 7 上配置 LDAP 服务器
以 root 用户登录到 VM,并安装 openldap 包。
[root@ldapserver ~]# yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-devel
从模板创建数据库。
[root@ldapserver ldap]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG [root@ldapserver ldap]# slaptest -u config file testing succeeded [root@ldapserver ldap]# chown ldap:ldap /var/lib/ldap/*
启动并启用 slapd 服务。
[root@ldapserver ~]# systemctl enable slapd && systemctl start slapd ln -s '/usr/lib/systemd/system/slapd.service' '/etc/systemd/system/multi-user.target.wants/slapd.service'
在防火墙中允许 ldaps 端口。
[root@ldapserver ~]# firewall-cmd --permanent --add-service=ldaps success [root@ldapserver ~]# firewall-cmd --reload success
配置 OpenLDAP 系统日志。
[root@ldapserver ~]# cat >> /etc/rsyslog.conf << EOF > #LDAP Logging > local4.* /var/log/openldap.log > EOF [root@ldapserver ~]# systemctl restart rsyslog
将所需的架构添加到我们的 OpenLDAP 目录。
[root@ldapserver ~]# ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" [root@ldapserver ~]# ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config"
为目录管理器生成密码哈希 123.
[root@ldapserver ~]# slappasswd New password: Re-enter new password: {SSHA}mNOljCtwWbG0P88Hu+jqsrkUOzjfqvak
复制密码哈希,我们将在以后的配置中需要它。
添加初始数据库配置。
[root@ldapserver ldap]# mkdir ~/ldap [root@ldapserver ldap]# cd ~/ldap [root@ldapserver ldap]# cat > db.ldif << EOF > dn: olcDatabase={2}hdb,cn=config > changetype: modify > replace: olcSuffix > olcSuffix: dc=itlab,dc=com > > dn: olcDatabase={2}hdb,cn=config > changetype: modify > replace: olcRootDN > olcRootDN: cn=ldapadm,dc=itlab,dc=com > > dn: olcDatabase={2}hdb,cn=config > changetype: modify > replace: olcRootPW > olcRootPW: {SSHA}mNOljCtwWbG0P88Hu+jqsrkUOzjfqvak > EOF [root@ldapserver ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config"
由于我们计划在 TLS 模式下运行此服务,因此必须为此目的创建安全证书。
为简单起见,我使用自签名证书,但是,如果我们为网络配置了证书颁发机构 (CA),则可以使用签名证书。
[root@ldapserver ~]# openssl req -new -x509 -nodes -out /etc/openldap/certs/ldapserver.pem -keyout /etc/openldap/certs/ldapserver.key -days 365 Generating a 2048 bit RSA private key .........................+++ ..................................................................+++ writing new private key to '/etc/openldap/certs/ldapserver.key' ---- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [XX]:PK State or Province Name (full name) []:Sindh Locality Name (eg, city) [Default City]:Karachi Organization Name (eg, company) [Default Company Ltd]:XYZ Organizational Unit Name (eg, section) []:IT Lab Common Name (eg, your name or your server's hostname) []:ldapserver.on-itroad.com Email Address []:root@ldapserver.on-itroad.com [root@ldapserver ~]# cd /etc/openldap/certs [root@ldapserver certs]# chown ldap:ldap * [root@ldapserver certs]# chmod 600 ldapserver.key
在 /etc/sysconfig/slapd 中编辑以下指令,使服务能够在 TLS 模式下运行。
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
现在,将安全证书和私钥添加到 LDAP 配置。
[root@ldapserver ~]# cd ~/ldap [root@ldapserver ldap]# cat > cert.ldif << EOF > dn: cn=config > changetype: modify > replace: olcTLSCertificateFile > olcTLSCertificateFile: /etc/openldap/certs/ldapserver.pem > > dn: cn=config > changetype: modify > replace: olcTLSCertificateKeyFile > olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key > > dn: cn=config > changetype: modify > replace: olcLogLevel > olcLogLevel: -1 > EOF [root@ldapserver ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f cert.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" modifying entry "cn=config" modifying entry "cn=config"
创建目录、LDAP 管理器用户和两个用于保存用户和组条目的组织单位。
[root@ldapserver ldap]# cd ~/ldap [root@ldapserver ldap]# cat > base.ldif << EOF > dn: dc=itlab,dc=com > dc: itlab > objectClass: top > objectClass: domain > > dn: cn=ldapadm ,dc=itlab,dc=com > objectClass: organizationalRole > cn: ldapadm > description: LDAP Manager > > dn: ou=People,dc=itlab,dc=com > objectClass: organizationalUnit > ou: People > > dn: ou=Groups,dc=itlab,dc=com > objectClass: organizationalUnit > ou: Groups > EOF [root@ldapserver ldap]# ldapadd -x -W -D "cn=ldapadm,dc=itlab,dc=com" -f base.ldif Enter LDAP Password: adding new entry "dc=itlab,dc=com" adding new entry "cn=ldapadm ,dc=itlab,dc=com" adding new entry "ou=People,dc=itlab,dc=com" adding new entry "ou=Groups,dc=itlab,dc=com"
定义目录的访问级别。
[root@ldapserver ldap]# cd ~/ldap [root@ldapserver ldap]# cat > access.ldif << EOF > dn: olcDatabase={1}monitor,cn=config > changetype: modify > replace: olcAccess > olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=ldapadm,dc=itlab,dc=com" read by * none > > changetype: modify > replace: olcAccess > olcAccess: {0}to dn.subtree="dc=itlab,dc=com" by dn.base="cn=ldapadm,dc=itlab,dc=com" manage by * read > EOF [root@ldapserver ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f access.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}monitor,cn=config"
让我们创建三个组。
此处的 jackli 和 fqyang 组被定义为用户 jackli 和 fqyang 的主要组。
而组 dba 将用作两个用户的补充组。
[root@ldapserver ldap]# cd ~/ldap [root@ldapserver ldap]# cat > groups.ldif << EOF > dn: cn=jackli,ou=Groups,dc=itlab,dc=com > cn: jackli > objectClass: posixGroup > objectClass: top > gidNumber: 10001 > memberuid: jackli > > dn: cn=fqyang,ou=Groups,dc=itlab,dc=com > cn: fqyang > objectClass: posixGroup > objectClass: top > gidNumber: 10002 > memberuid: fqyang > > dn: cn=dba,ou=Groups,dc=itlab,dc=com > cn: dba > objectClass: posixGroup > objectClass: top > gidNumber: 10003 > memberuid: jackli > memberuid: fqyang > EOF [root@ldapserver ldap]# ldapadd -x -W -D "cn=ldapadm,dc=itlab,dc=com" -f groups.ldif Enter LDAP Password: adding new entry "cn=jackli,ou=Groups,dc=itlab,dc=com" adding new entry "cn=fqyang,ou=Groups,dc=itlab,dc=com" adding new entry "cn=dba,ou=Groups,dc=itlab,dc=com"
现在创建用户。
[root@ldapserver ldap]# cd ~/ldap [root@ldapserver ldap]# cat > users.ldif << EOF > dn: uid=jackli,ou=People,dc=itlab,dc=com > uid: jackli > cn: jackli > objectClass: account > objectClass: posixAccount > objectClass: top > objectClass: shadowAccount > userPassword: {crypt}a > shadowLastChange: 17665 > shadowMin: 0 > shadowMax: 99999 > shadowWarning: 7 > loginShell: /bin/bash > uidNumber: 10001 > gidNumber: 10001 > homeDirectory: /home/jackli > > dn: uid=fqyang,ou=People,dc=itlab,dc=com > uid: fqyang > cn: fqyang > objectClass: account > objectClass: posixAccount > objectClass: top > objectClass: shadowAccount > userPassword: {crypt}a > shadowLastChange: 17665 > shadowMin: 0 > shadowMax: 99999 > shadowWarning: 7 > loginShell: /bin/bash > uidNumber: 10002 > gidNumber: 10002 > homeDirectory: /home/fqyang > EOF [root@ldapserver ldap]# ldapadd -x -W -D "cn=ldapadm,dc=itlab,dc=com" -f users.ldif Enter LDAP Password: adding new entry "uid=jackli,ou=People,dc=itlab,dc=com" adding new entry "uid=fqyang,ou=People,dc=itlab,dc=com"
为用户设置密码。
[root@ldapserver ldap]# ldappasswd -S -x -D "cn=ldapadm,dc=itlab,dc=com" -W "uid=jackli,ou=People,dc=itlab,dc=com" New password: Re-enter new password: Enter LDAP Password: [root@ldapserver ldap]# ldappasswd -S -x -D "cn=ldapadm,dc=itlab,dc=com" -W "uid=fqyang,ou=People,dc=itlab,dc=com" New password: Re-enter new password: Enter LDAP Password:
我们还可以使用 LDAP 浏览器实用程序来管理我们的目录。
以下是我们此时目录的截图。
有各种商业和免费的 LDAP 目录浏览器和管理员工具可用。
我使用 LDAPAdmin 来完成这项工作。
在 CentOS 7 上配置 LDAP 客户端
现在,我将配置 Linux 客户端以使用我们的 LDAP 目录进行远程身份验证。
我在这里有一台带有 hostname=Desktop1 的客户端机器,我将其用于此目的。
首先,确保我们的 LDAP 目录服务器的主机名必须是可解析的,因为我们使用主机名 ldapserver.on-itroad.com 作为安全证书中的通用名称。
[root@desktop1 ~]# echo 192.168.1.3 ldapserver.on-itroad.com ldapserver >> /etc/hosts
现在安装所需的软件包。
[root@desktop1 ~]# yum -y install openldap sssd Loaded plugins: langpacks, product-id, subscription-manager This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast localyum | 4.1 kB 00:00:00 Package openldap-2.4.39-3.el7.x86_64 already installed and latest version Package sssd-1.11.2-65.el7.x86_64 already installed and latest version Nothing to do [root@desktop1 home]# systemctl start sssd && systemctl enable sssd ln -s '/usr/lib/systemd/system/sssd.service' '/etc/systemd/system/multi-user.target.wants/sssd.service'
由于我们使用的是 LDAPS,因此我们必须将自签名证书复制到我们的客户端机器上。
[root@desktop1 ~]# scp root@ldapserver.on-itroad.com:/etc/openldap/certs/ldapserver.pem /etc/openldap/cacerts/ldapserver.pem The authenticity of host 'ldapserver.on-itroad.com (192.168.1.3)' can't be established. ECDSA key fingerprint is 4c:7f:83:39:d1:bc:ef:4c:fd:58:82:7b:36:ff:9e:f2. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'ldapserver.on-itroad.com,192.168.1.3' (ECDSA) to the list of known hosts. root@ldapserver.on-itroad.com's password: ldapserver.pem 100% 1452 1.4KB/s 00:00
现在在客户端机器上使用 LDAP 配置远程身份验证。
[root@desktop1 ~]# authconfig --update --enableldap --enableldapauth --enableldaptls --ldapserver=ldaps://ldapserver.on-itroad.com --ldapbasedn="dc=itlab,dc=com" --enablemkhomedir
现在使用 LDAP 用户进行连接。
[root@desktop1 home]# su - jackli Creating directory '/home/jackli'. Last login: Mon Jan 28 11:28:17 PDT 2018 on pts/0 [jackli@desktop1 ~]$ id uid=10001(jackli) gid=10001(jackli) groups=10001(jackli),10003(dba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
我们的客户端机器现在配置为向 OpenLDAP 远程身份验证服务器进行身份验证。