前面两篇文章主要介绍了SVN的安装和使用http/https方式访问SVN,但是SVN登录使用的验证方式仍然是明文密码形式,本文主要调查如何使用已有的OpenLDAP服务器进行SVN服务器的登录和验证。
我们先在CentOS 7上安装OpenLDAP服务器,安装方法参照这个链接
https://www.itzgeek.com/how-tos/linux/centos-how-tos/step-step-openldap-server-configuration-centos-7-rhel-7.html
1.安装OpenLDAP
1.1 安装LDAP服务器
执行以下命令安装OpenLDAP
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel
安装完成后启动LDAP服务
systemctl enable slapd.service
systemctl start slapd.service
启动完成后,查看端口号,可以看到LDAP服务已经启动。
1.2 设置LDAP服务器的root用户密码
1.3 配置LDAP服务器
我们切换到 /etc/openldap/slapd.d/目录下,创建db.ldif文件,内容如下:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=rick,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=manager,dc=rick,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}NQpsOl1hX39ub2NYtubl85F0+pEtcM0K
执行以下命令,使db.ldif文件生效,修改/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif文件的实际内容(不建议直接修改olcDatabase={2}hdb.ldif文件,下面修改monitor文件也是一样)
ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif
执行结果如下图所示:
再创建monitor.ldif文件
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=manager,dc=rick,dc=com" read by * none
执行ldapmodify命令更新cn=config/olcDatabase={1}monitor.ldif文件
ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif
执行后的结果如下图所示
1.4 创建LDAP服务器证书
执行以下指令创建LDAP服务器证书文件
openssl req -new -x509 -nodes -out /etc/openldap/certs/rickldapcert.pem -keyout /etc/openldap/certs/rickldapkey.pem -days 365
指令执行后,在/etc/openldap/certs目录下生成两个pem文件
接下来我们将这两个pem文件的所有权赋给ldap用户(在安装OpenLDAP时创建),以便在使用ldap用户启动
LDAP服务器时使用这两个pem文件。
chown -R ldap:ldap /etc/openldap/certs/*.pem
创建certs.ldif文件,标明在LDAP服务器中使用这两个pem文件。
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/rickldapcert.pem
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/rickldapkey.pem
执行LDAPModify命令,导入certs.ldif文件
ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif
执行结果如下图所示
执行下列命令确定上述LDAP服务器配置修改是否有效
slaptest -u
如果配置无误,会显示config file testing succeeded信息
1.5 创建LDAP数据库
拷贝LDAP数据库配置样例文件到/var/lib/ldap目录下,并改变样例文件所有者为ldap用户。
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/*
添加consine和nis LDAP schemas
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
执行后的结果如下图所示
创建rick域生成所需的base.ldif文件
dn: dc=rick,dc=com
dc: rick
objectClass: top
objectClass: domain
dn: cn=Manager,dc=rick,dc=com
objectClass: organizationalRole
cn: Manager
description: LDAP Manager
dn: ou=People,dc=rick,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=rick,dc=com
objectClass: organizationalUnit
ou: Group
执行下列命令,加载base.ldif文件,添加rick域
ldapadd -x -W -D "cn=Manager,dc=rick,dc=com" -f base.ldif
执行结果如下图所示
创建SVN访问的用户svnuser2,配置文件svnuser2.ldif如下
dn: uid=svnuser2,ou=People,dc=rick,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: svnuser2
uid: svnuser2
uidNumber: 9999
gidNumber: 100
homeDirectory: /home/svnuser2
loginShell: /bin/bash
gecos: svnuser2 [Admin (at) Rick]
userPassword: {crypt}x
shadowLastChange: 17058
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
加载svnuser2.ldif文件,创建LDAP用户svnuser2
ldapadd -x -W -D "cn=Manager,dc=rick,dc=com" -f svnuser2.ldif
执行结果如下图所示
设置svnuser2用户的密码为123456
ldappasswd -s 123456 -W -D "cn=Manager,dc=rick,dc=com" -x "uid=svnuser2,ou=People,dc=rick,dc=com"
其中-D 是表示登录的root用户,-x 表示是需要设置的LDAP用户的路径,-s表示需要设置的密码。
设置完成后,我们查看svnuser2用户的信息
ldapsearch -x cn=svnuser2 -b dc=rick,dc=com
信息如下图所示
1.6 开启LDAP防火墙
为了方便管理LDAP服务器,也便于远端服务器访问LDAP服务器,我们需要开启LDAP服务器的防火墙,执行以下指令
firewall-cmd --permanent --add-service=ldap
firewall-cmd --reload
或者
firewall-cmd --permanent --add-port=[LDAP服务器端口号]
systemctl restart firewalld.service
1.7 开启LDAP日志
配置rsyslog记录LDAP服务器的事件日志到/var/log/ldap.log文件
我们修改/etc/rsyslog.conf文件,在文件最后添加以下语句:
local4.* /var/log/ldap.log
重启rsyslog服务器,conf文件的修改即生效
systemctl restart rsyslog
1.8 LDAP服务器连接验证
我们使用Apache Directory Studio对我们安装的LDAP服务器进行连接验证,连接参数如下图所示
其中Bind DN or user我们使用base.ldif中创建的管理员用户,密码则是base.ldif中设置的olcRootPW的明文密码。
连接成功后可以看到LDAP服务器的节点树结构,以及我们创建的svnuser2用户。
2.配置SVN服务器使用LDAP验证
首先安装mod_ldap模块
yum install -y mod_ldap
安装完成后访问/etc/httpd/conf.d/subversion.conf文件,配置使用LDAP方式验证登录
<Location /rootSvn>
DAV svn
SVNPath /opt/svnRepos/
SVNListParentPath On
AuthType Basic
AuthBasicProvider ldap
AuthName "SVN Repo"
Require valid-user
AuthzSVNAccessFile /opt/svnRepos/conf/authz
#AuthUserFile /opt/svnRepos/conf/http_passwd
AuthLDAPURL "ldap://192.168.56.103:389/ou=People,dc=rick,dc=com?uid?sub?(objectClass=*)"
AuthLDAPBindDN "cn=Manager,dc=rick,dc=com"
AuthLDAPBindPassword [LDAP管理员用户登录密码]
</Location>
AuthLDAPURL行表示我们使用192.168.56.103(我们安装的LDAP服务器)上的
ou=People,dc=rick,dc=com节点下所有具有uid的用户节点进行SVN用户登录验证。
AuthLDAPBindDN是LDAP管理员帐号,AuthLDAPBindPassword是管理员帐号密码,和使用Apache Directory Studio登录时配置信息一致。
AuthBasicProvider ldap一行表示使用ldap作为用户登录验证。
AuthzSVNAccessFile一行保持不变,表示用户访问SVN的权限仍然在authz文件中配置。
再修改/opt/svnRepos/conf/authz文件,添加svnuser2用户的访问权限。
[/]
.....
svnuser2=rw
修改完成后重启httpd服务。
我们使用浏览器访问SVN服务器,弹出用户名/密码输入框
我们输入svnuser2和LDAP密码,登录成功后显示SVN目录
需要说明的是,之前设置的svnuser2密码默认是按SSHA方法存储密码的,在进行SVN用户和密码验证时会出现验证不通过的情况,为了避免这种情况,建议使用Apache Directory Studio登录LDAP服务器后修改SVN用户密码为plain text方式保存,我之后会继续研究如何使用SSHA保存密码的前提下保证SVN用户验证通过。