在CentOS 7上为用户主目录设置具有SSL + NFS的OpenLDAP服务器

时间:2020-03-21 11:49:57  来源:igfitidea点击:

在CentOS 7上设置OpenLDAP服务器并部署NFS以导出用户的主目录。

软件

本文使用的软件:

  • CentOS的7
  • OpenLDAP 2.4.40
  • nfs-utils 1.3.0

OpenLDAP设置

我们的OpenLDAP服务器位于10.8.8.0/24局域网中。

安装和SSL配置

# yum install -y openldap-servers openldap-clients

生成带有证书签名请求的RSA私钥。

# cd /etc/pki/tls/private
# DOMAIN=ldap
# openssl genrsa -out "$DOMAIN".key 2048 && chmod 0600 "$DOMAIN".key
# openssl req -new -sha256 -key "$DOMAIN".key -out "$DOMAIN".csr

现在我们可以获得一些CA来签署我们的CSR,或者我们可以自己签署:

# openssl x509 -req -days 1825 -sha256 -in "$DOMAIN".csr -signkey "$DOMAIN".key \
  -out "$DOMAIN".crt

将PKCS#1转换为PKCS#8:

# openssl pkcs8 -topk8 -inform pem -in "$DOMAIN".key \
  -outform pem -nocrypt -out "$DOMAIN".pem

确保ldap组可以读取私钥:

# chmod 640 "$DOMAIN".crt "$DOMAIN".key "$DOMAIN".pem
# chgrp ldap "$DOMAIN".crt "$DOMAIN".key "$DOMAIN".pem
# mv "$DOMAIN".crt ../certs/

打开“/etc/sysconfig/slapd”进行编辑,然后添加以下内容以启用LDAPS:

SLAPD_URLS="ldapi:///ldap://0.0.0.0:389/ldaps://0.0.0.0:636/"

启用并启动服务:

# systemctl enable slapd.service
# systemctl start slapd.service

配置防火墙:

# iptables -A INPUT -s 10.8.8.0/24 -p tcp -m multiport --dport 389,636 -j ACCEPT

导入基本的OpenLDAP模式并创建数据库

相当多的LDAP模式可用,根据需要导入。

# ldapadd -Y EXTERNAL -H ldapi:///-f /etc/openldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:///-f /etc/openldap/schema/nis.ldif
# ldapadd -Y EXTERNAL -H ldapi:///-f /etc/openldap/schema/inetorgperson.ldif

尽管只有root才能运行slapadd,但slapd服务以ldap用户身份运行。
因此,目录服务器无法修改slapadd创建的任何文件。

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chmod 0600 /var/lib/ldap/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap/
# slaptest

配置OpenLDAP

我们需要一个目录来存储临时配置文件:

# mkdir /root/ldifconfigs/&& cd /root/ldifconfigs/

为LDAP管理员帐户生成userPassword值:

# slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}qFEhyuvWKiLGtOISbhbRlSijlMQGCAGh

我们的初始LDAP配置文件'initial_config.ldif'可以在下面看到。

我们启用所有日志记录,将密码哈希设置为SSHA(而不是SHA),提供SSL证书和密钥的路径,放置一个高密码套件以供使用。

RootDN条目是用户的专有名称(DN),该用户不受访问控制或者为LDAP目录上的操作设置的管理限制参数的限制。
我们使用'cn = admin,dc = top'。
请注意,由于我们打算在树下使用多个域(顶部域组件),因此将后缀设置为“ dc = top”。

我们还为只读访问定义了一个来宾帐户“ cn = autobind,dc = top”。
对于诸如nslcd之类的服务,这主要是在不允许匿名绑定时绑定到LDAP服务器。

然后是一个访问控制列表,该列表确定谁可以针对OpenLDAP服务器进行身份验证:

  • 管理员帐户(rootDN)具有完全访问权限,
  • 自动绑定帐户可以是只读的,
  • 为匿名用户提供了对userPassword属性的访问权限,以进行初始连接,
  • 由于具有“通过自写”权限,所有用户都可以对其密码进行读取访问。

创建文件。

# cat > ./initial_config.ldif << EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: -1

replace: olcPasswordHash
olcPasswordHash: {SSHA}

replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/pki/tls/certs/startssl.ca.crt

replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/pki/tls/certs/ldap.crt

replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/pki/tls/private/ldap.pem

replace: olcTLSCipherSuite
olcTLSCipherSuite: HIGH

replace: olcTLSVerifyClient
olcTLSVerifyClient: never
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=admin,dc=top" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=top

replace: olcRootDN
olcRootDN: cn=admin,dc=top

replace: olcRootPW
olcRootPW: {SSHA}qFEhyuvWKiLGtOISbhbRlSijlMQGCAGh

replace: olcLastMod
olcLastMod: TRUE

replace: olcDbCheckpoint
olcDbCheckpoint: 512 30

replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=top" write by dn="cn=autobind,dc=top" read by self write by anonymous auth by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=top" write by dn="cn=autobind,dc=top" read by self write by users read by anonymous auth by * none
EOF

应用配置表格文件:

# ldapadd -Y EXTERNAL -H ldapi:///-f ./initial_config.ldif

创建一个基本配置文件。
这定义了顶级域组件“ dc = top”以及管理员和自动绑定用户。

# cat > ./base.ldif << EOF
dn: dc=top
objectClass: top
objectClass: dcObject
objectclass: organization
o: top
dc: top
dn: cn=admin,dc=top
objectClass: simpleSecurityObject
objectclass: organizationalRole
description: LDAP Admin Access
userPassword: {SSHA}qFEhyuvWKiLGtOISbhbRlSijlMQGC315
dn: cn=autobind,dc=top
objectClass: simpleSecurityObject
objectclass: organizationalRole
description: LDAP Read-only Access
userPassword:
EOF

应用更改,然后为自动绑定帐户创建密码(我们将userPassword字段有意留为空白)。

# ldapadd -x -D cn=admin,dc=top -W -f ./base.ldif
# ldappasswd -x -D cn=admin,dc=top -W -S cn=autobind,dc=top

现在,我们将创建一个名为theitroad.com的域,其中包含几个用于用户和组的组织单位。

# cat > ./theitroad.com.ldif << EOF 
dn: dc=theitroad.com,dc=top
o: theitroad.com
dc: theitroad.com
objectClass: dcObject
objectClass: organization
dn: ou=Users,dc=theitroad.com,dc=top
objectClass: organizationalUnit
ou: Users
dn: ou=Groups,dc=theitroad.com,dc=top
objectClass: organizationalUnit
ou: Groups
EOF

应用更改:

# ldapadd -x -D cn=admin,dc=top -W -f ./theitroad.com.ldif

创建域后,我们可以添加一些用户。
对于已经在系统上创建了多个本地用户帐户的用户,明智的方法是使用MigrationTools实用程序。

MigrationTools是一组Perl脚本,用于将用户,组,别名,主机,网络组,网络和服务从现有名称服务(平面文件,NIS和NetInfo)迁移到LDAP。

我们将创建两个LDAP用户,alice和vincent,以及它们各自的组。
主目录('/home/guests /)'将通过NFS导出。
注意shadowLastChange值。

我们需要objectClass:person来分配姓氏,objectClass:inetOrgPerson来分配邮件和给定名称,再加上objectClass:posixAccount来设置用户密码。

# cat > ./users.ldif << EOF 
dn: uid=alice,ou=Users,dc=theitroad.com,dc=top
uid: alice
uidNumber: 5001
gidNumber: 5001
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword: {SSHA}biYSGrLyQG/+ntABuIYF2rXyzDgZdBaU
cn: Alice Abernathy
gn: Alice
sn: Abernathy
mail: Hyman@theitroad
shadowLastChange: 16890
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
shadowInactive: 3
loginShell: /bin/bash
homeDirectory: /home/guests/alice
dn: cn=alice,ou=Groups,dc=theitroad.com,dc=top
gidNumber: 5001
objectClass: top
objectClass: posixGroup
cn: alice
dn: uid=vincent,ou=Users,dc=theitroad.com,dc=top
uid: vincent
uidNumber: 5002
gidNumber: 5002
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword: {SSHA}biYSGrLyQG/+ntABuIYF2rXyzDgZdBaU
cn: Vincent Valentine
gn: Vincent
sn: Valentine
mail: Hyman@theitroad
shadowLastChange: 16890
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
shadowInactive: 3
loginShell: /bin/bash
homeDirectory: /home/guests/vincent
dn: cn=vincent,ou=Groups,dc=theitroad.com,dc=top
gidNumber: 5002
objectClass: top
objectClass: posixGroup
cn: vincent
EOF

申请:

# ldapadd -x -D cn=admin,dc=top -W -f ./users.ldif

如果我们想更改预定义的密码,可以通过发出以下命令来进行更改:

# ldappasswd -x -D cn=admin,dc=top -W -S uid=alice,ou=users,dc=theitroad.com,dc=top
# ldappasswd -x -D cn=admin,dc=top -W -S uid=vincent,ou=users,dc=theitroad.com,dc=top

LDAP结构如下所示:

可以在顶级域组件下轻松添加更多域和用户。

NFS设置

软件包安装和防火墙

安装nfs实用程序,启用并启动服务:

# yum install nfs-utils
# systemctl enable rpcbind && systemctl start rpcbind
# systemctl enable nfs-server && systemctl start nfs-server

为NFS配置防火墙(rpc-bind,nfs和mountd):

# iptables -A INPUT -s 10.8.8.0/24 -p tcp -m multiport --dport 111,2049,20048 -j ACCEPT
# iptables -A INPUT -s 10.8.8.0/24 -p udp -m multiport --dport 111,2049,20048 -j ACCEPT

创建主目录并配置导出

为LDAP用户alice和vincent创建主目录。
请注意我们最初在LDAP上创建用户时使用的用户ID和组ID号。

# mkdir -m0750 -p /home/guests/{alice,vincent}
# chown 5001:5001 /home/guests/alice/
# chown 5002:5002 /home/guests/vincent/

配置NFS导出:

# cat /etc/exports
/home/guests 10.8.8.0/24(rw,sync,no_subtree_check,root_squash)
# exportfs -rav
exporting 10.8.8.0/24:/home/guests

查看“相关文章”部分,了解如何配置CentOS 7以通过NFS自动挂载使用LDAP身份验证。

自动挂载配置应如下所示(其中10.8.8.2是NFS服务器的IP):

# cat /etc/auto.guests
*  -rw   10.8.8.2:/home/guests/&