OpenLDAP实现服务器集中化认证及安全管理

目的
1·实现对于服务器普通用户账号的集中化认证管理
2·实现对于认证服务器的主从复制,保证数据一致
3·实现对于服务器数据传输的加密保护
Openldap 集中化认证需要实现的效果
1·两台ldap服务器,做单向主从,写操作只允许发生在Master上。
Master的任意数据更新都会引发Slave做相同操作,以确保数据一致。
2·通过ldap认证的用户,可以通过系统命令passwd直接更改自己的密码。
3·普通登录用户可以查询任意ldap用户信息,但无法看到密码项。
安全性方面需要达到的效果:
·以下几个方面的数据传输应用了SSL加密保护
1 客户端认证时提交的信息以及服务器返回的信息
2 主从ldap服务器间的同步信息
安装环境
三台CentOS 5.7 x86_64服务器:10.20.10.202 10.20.10.211 10.20.10.203
Master:10.20.10.202
Slave:10.20.10.211
客户机:10.20.10.203
202和211作为LDAP集中认证服务器
一台作为需要进行安全性配置的应用服务器。
软件环境
在Master和Slave两台ldap服务器上使用yum的方式分别安装以下软件:
openldap
openldap-clients
openldap-servers
openssl
nss_ldap
在客户机上安装:
openldap
nss_ldap
2.1 生成根证书
cd /etc/pki/tls/misc
./CA -newca
期间需要建立根证书密码,国家名,公司名等等,这些都可以随便填,我是按真实情况填写
请先确认已经删除了/etc/pki/CA这个目录
2.2 生成Master服务器的证书
2.2.1openssl req -new -nodes -keyout newreq.pem -out newreq.pem
期间需要建立证书信息,其中common name一定要注意,因为后面会用到
这里common name填入的是ldap1.woyo.com
2.2.2/etc/pki/tls/misc/CA -sign
需要输入之前建立的根证书密码,并且还要经过两次确认
复制根证书:
cp /etc/pki/CA/cacert.pem /etc/openldap/cacerts/
对于新生成的证书做以下调整:
mv /etc/pki/tls/misc/newcert.pem /etc/openldap/cacerts/server202.csr
mv /etc/pki/tls/misc/newreq.pem /etc/openldap/cacerts/server202.key
chmod 400 /etc/openldap/cacerts/server202.key
chown ldap /etc/openldap/cacerts/server202.key
2.3 生成Slave服务器的证书
2.3.1 openssl req -new -nodes -keyout newreq.pem -out newreq.pem
同master一样,common name需要注意,这里common name填入的是ldap2.woyo.com
2.3.2 /etc/pki/tls/misc/CA -sign
然后将新生成的证书移动到Slave服务器上:
scp /etc/pki/CA/cacert.pem 10.20.10.211:/etc/openldap/cacerts/
scp /etc/pki/tls/misc/newcert.pem 10.20.10.211:/etc/openldap/cacerts/server211.csr
scp /etc/pki/tls/misc/newreq.pem 10.20.10.211:/etc/openldap/cacerts/server211.key
到Slave上更改证书文件属性
chmod 400 /etc/openldap/cacerts/server211.key
chown ldap /etc/openldap/cacerts/server211.key
将根证书传一份到客户机上
scp /etc/pki/CA/cacert.pem 10.20.10.203:/etc/openldap/cacerts/
注:注意移动和拷贝的区别
3LDAP 主从认证服务器配置
3.1.1  更改 Master 服务器配置文件
首先清空配置文件
>/etc/openldap/slapd.conf
然后将下面内容导入slapd.conf文件中
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/cacerts/server202.csr
TLSCertificateKeyFile /etc/openldap/cacerts/server202.key
access to attrs=userPassword
by self write
by users read
by anonymous auth
access to *
by self write
by * read
database bdb
suffix "dc=woyo,dc=com"
rootdn "cn=root,dc=woyo,dc=com"
rootpw {MD5}VR39fkEqxx7BYXtZaVmCfg== #slappasswd –h {md5}
directory /var/lib/ldap
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
replogfile /var/lib/ldap/replog
replica uri=ldaps://ldap1.woyo.com:636
binddn="cn=root,dc=woyo,dc=com"
bindmethod=simple
credentials=secret #这里是你的rootpw后面密码
loglevel 256
更改/etc/ldap.conf和/etc/openldap/ldap.conf两个文件,确保两个文件分别包含以下内容:
tls_cacert /etc/openldap/cacerts/cacert.pem
tls_cacertdir /etc/openldap/cacerts
3.1.2  更改 Slave 服务器配置文件
首先清空配置文件
>/etc/openldap/slapd.conf
然后将下面内容导入slapd.conf文件
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
CACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/cacerts/server211.csr
TLSCertificateKeyFile /etc/openldap/cacerts/server211.key
access to attrs=userPassword
by self read
by users read
by anonymous auth
access to *
by self write
by * read
database bdb
suffix "dc=woyo,dc=com"
rootdn "cn=root,dc=woyo,dc=com"
rootpw {SHA}5en6G6MezRroT3XKqkdPOmY/BfQ=
directory /var/lib/ldap
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
updatedn "cn=root,dc=woyo,dc=com"
updateref  ldaps://ldap1.woyo.com:636
loglevel 256
更改/etc/ldap.conf和/etc/openldap/ldap.conf两个文件,同样确保两个文件分别包含以下内容:
tls_cacert /etc/openldap/cacerts/cacert.pem
tls_cacertdir /etc/openldap/cacerts
3.1.3  打开两台 ldap 服务器的日志功能
syslog中加入ldap日志文件
vi /etc/syslog.conf
# save OpenLDAP log
local4.* /var/log/ldap.log

重启syslog
service syslog restart
这样,日志文件/var/log/ldap.log就会保存ldap的日志了
分别启动两台ldap服务器的ldap服务
Service ldap start
分别测试两台 ldap server 是否正常工作
ldapsearch -x -b "dc=woyo,dc=com" -H ldaps://ldap1.woyo.com
ldapsearch -x -b "dc=woyo,dc=com" -H ldaps://ldap2.woyo.com
如果命令执行成功,返回一些信息,则说明服务器正常运行,且证书及ssl设置没有问题了
3.2 在主 ldap服务器上录入数据
使用Migration来进行ldif文件的转换
tar xvf MigrationTools.gz -C /usr/local/openldap
cd /usr/local/openldap/MigrationTools-47
vi migrate_common.ph 文件,将其中两行改为下列形式
  $DEFAULT_MAIL_DOMAIN = "woyo.com";
  $DEFAULT_BASE = "dc=woyo,dc=com";
1·创建根项,并为 Hosts、Networks、Group 和 People 等创建第一级的组织单元(OU)
migrate_base.pl > /tmp/base.ldif
编辑 base.ldif,删除除下面之外的所有条目
  dn: dc=woyo,dc=com
  dc: woyo
  objectClass: top
  objectClass: domain
dn: ou=People,dc=woyo,dc=com
  ou: People
  objectClass: top
  objectClass: organizationalUnit
dn: ou=Group,dc=woyo,dc=com
  ou: Group
  objectClass: top
  objectClass: organizationalUnit
2·创建test组和test用户
Useradd woyogame
3·创建用户项,这里导入系统的woyogame用户信息
grep woyogame /etc/passwd > /tmp/passwd.in
./migrate_passwd.pl /tmp/passwd.in > /tmp/passwd.ldif
可以对/tmp/passwd.ldif文件进行修改,更改家目录,uid等一些选项,达到想要的效果
4·导入ldap数据
ldapadd -x -D "cn=root,dc=woyo,dc=com" -W -f base.ldif
ldapadd -x -D "cn=root,dc=woyo,dc=com" -W -f passwd.ldif
注:由于是主从同步,因此上面的更新操作会同步到从ldap服务器上
好了,可以通过以下命令查看导入到ldap中的数据
ldapsearch -x -b "dc=woyo,dc=com"


修改以下三个文件
/etc/ldap.conf
uri  ldaps://ldap1.woyo.com ldaps://ldap2.woyo.com #主从ldap服务器的ip
base dc=woyo,dc=com #ldap服务器配置文件所设置的域
ssl on
tls_cacertdir /etc/openldap/cacerts
tls_cacert /etc/openldap/cacerts/cacert.pem
bind_policy soft
/etc/openldap/ldap.conf
uri ldap://ldap1.woyo.com ldap://ldap2.woyo.com
base dc=woyo,dc=com
tls_cacertdir /etc/openldap/cacerts
tls_cacert /etc/openldap/cacerts/cacert.pem
/etc/sysconfig/authconfig
USESHADOW=no
USELDAP=yes
USELDAPAUTH=yes
4.2加入 ldap认证方式
vi /etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group: files ldap
现在,就可以用任意客户端通过远程连接的方式连接到这台应用服务器进行测试了


备注
·SSL部分的说明
ldap1.woyo.com为Master服务器证书的common name,后面所有涉及到ldaps地址的部分均填写这个名称
ldap2.woyo.com作用相同,只不过是Slave服务器证书的common name
·红色粗体部分,为主从单向复制部分的配置
·紫色粗体部分,为主从机器上SSL配置的部分,分别指定了三个证书文件
·橙色粗体部分,为ACL控制语句,这里的控制语句实现的效果是:
登录后的用户可以修改自己的密码,匿名用户可以提交密码信息用于认证
· 4.1 部分的bind_policy soft语句,解决了若两台openldap服务器均挂掉的情况下,普通用户登录不断尝试,导致等待时间过长的问题

后记:

ldap的数据库文件是在:/var/lib/ldap/下面的。
1、一开始把ldap放在一台计算的服务器上,当这台服务器负载重的时候,依靠ldap验证登录的机器登录会非常慢(超慢,近乎死机),所以建议用一台空闲的主机(甚至可以是vmware一台虚拟机)。
2、和MySql一样,有2种方法做数据库的备份:一、用ldapsearch -x把内容倒出来存成文件,注意清除一下这个命令输出的和数据无关的信息。万一数据库完了,把ldap相关的包删掉,把原来的数据库文件删掉,在重新安装 ldap相关包,把备份的文件改成ldif扩展名,一次导入就行了。个人建议每次作修改时的ldif文件最好保存被查,最好编辑成一个ldif文件,也可以算是一种备份ldap数据的方案。二、另一种是把数据库文件直接打包备份,出现问题时,停止ldap server,把文件解压,再重新启动。
3、authconfig文件修改的文件中有2个ldap.conf文件:/etc/ldap.conf和 /etc/openldap/ldap.conf。在我看来前者只是客户端在作认证时才用的,而后者是客户端控制server时用的。具体点:不管在客户端还是服务器,如果用ldap做认证,服务器的ldap server应该指向本机,前者是必须的,后者可有可无。在管理ldap server时后者是必须的,前者可有可无,即一台客户端配置了/etc/openldap/ldap.conf文件,就能通过ldap相关的命令来配置文件中指定的服务器,但这台机器未必使用了ldap认证。只要修改一下/etc/openldap/ldap.conf文件中的主机名或IP就能用一台机器配置任何一台ldap server。
为保持系统稳定,建议配置多台ldap server,并以空格分隔把主机名或IP列在/etc/ldap.conf文件中,这样万一第一台server宕了,第二台server会继续认证。
另外,建议多台server使用不同的管理员密码,要修改数据时只需修改你本地的/etc/openldap/ldap.conf文件中的主机名后对每台执行一次就行了。应该不会很麻烦。

 

本文摘自http://gxjluck.blog.51cto.com/1211751/794323