环境:centos6.4 openldap 2.4.23 iptables selinux关闭 理论知识:
实践: 一. openldap安装
-
Yum安装 yum install -y openldap openldap-servers openldap-clients
-
准备配置文件 cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
-
修改server配置文件slapd.conf # ldap.conf是客户端的配置文件 vim /etc/openldap/slapd.conf
- 设置目录树的后缀 suffix "dc=dianping,dc=com"
- 设置管理员DN rootdn "cn=admin,dc=example,dc=com"
- 设置管理员密码 rootpw redhat 或机密格式, 加密格式可通过 slappasswd命令来生成 rootpw {SSHA}j6OO++o76F2yhww2Cg/+Hy8oDPixx6C3
- 设置ldap日志,在argsfile下面添加 loglevel 1 修改系统日志配置文件 vim /etc/rsyslog.conf # centos5版应该是syslog.conf local4.* /var/log/ldap.log service rsyslog restart
- 修改完配置文件后用以下命令生成新的配置文件,以后不再特殊说明 service slapd start rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/ service slapd restart
-
修改权限 chown -R ldap.ldap /etc/openldap/* chown -R ldap.ldap /var/lib/ldap/*
-
启动 service slapd start
netstat -tulnp | grep slapd # 查看是否监听389 -
初始化库测试库
vim example.ldif
dn:dc=dianping,dc=com objectclass:dcObject objectclass:organization o:dianping, Inc. dc:dianping
dn:cn=admin,dc=dianping,dc=com objectclass:organizationalRole cn:admin
导入到ldap中 ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f example.ldif #会提示导入的数据 测试查找 ldapsearch -x -b "dc=dianping,dc=com" "(objectclass=*)"
-
用phpldapadmin测试(也可以安装ldap browser或者ldap administrator) 下载地址 phpldapadmin.sourceforge.net/ 安装简介:1). 放到apache+php定义的vhost的RootDocument中 2). 修改配置文件 cd ldapadmin/config/;cp config.php.example;config.php 278行开始配置: $servers = new Datastore(); $servers->newServer('ldap_pla'); $servers->setValue('server','name','dc'); $servers->setValue('server','host','localhost'); $servers->setValue('server','port',389); $servers->setValue('server','base',array('dc=dianping,dc=com')); $servers->setValue('login','auth_type','session'); $servers->setValue('login','bind_id','cn=admin,dc=dianping,dc=com'); # 初始登录的id,以下两行可以不定义 $servers->setValue('login','bind_pass','redhat'); # 初始登录的密码
-
访问定义的ldapadmin vhost 点击登录,登录dn: cn=admin,dc=dianping,dc=com 密码:redhat ##上面如果设置了,应该会默认填写着的
-
下载migrationtools,迁移主机的passwd shadow group等到ldap中 yum -y install migrationtools cd /usr/share/migrationtools/ vim migrate_common.ph # 71行左右 $DEFAULT_MAIL_DOMAIN = "dianping.com"; $DEFAULT_BASE = "dc=dianping,dc=com";
-
利用perl脚本转换为ldif ./migrate_base.pl > /tmp/base.ldif ./migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif ./migrate_group.pl /etc/group > /tmp/group.ldif
-
导入到ldap中 # 删除/var/lib/ldap下面的数据库文件,重启slapd再导入 ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/base.ldif ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/passwd.ldif ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/group.ldif 重启slapd,在phpldapadmin中查看
二. 客户端使用ldap作为auth # centos6.3
-
安装LDAP客户端及依赖组件 yum -y install openldap openldap-clients nss-pam-ldapd pam_ldap
-
增加BIND策略,避免LDAP无法连接时无法开机 echo "bind_policy soft" >> /etc/openldap/ldap.conf
-
自动创建目录设置 echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" >> /etc/pam.d/system-auth
-
设置LDAP启用 备份一下: authconfig --savebackup=auth.bak 启用新的:
authconfig --enableldap --enableldapauth --enablemkhomedir --enableforcelegacy --disablesssd --disablesssdauth --ldapserver=192.168.2.128 --ldapbasedn="dc=dianping,dc=com " --update启用tls --enableldapstarttls --enableldaptls --ldaploadcacert=file:///etc/openldap/cacerts/cacert.pem
-
客户端登陆测试,如果不能登陆服务器端tail -f /var/log/ldap.log查看
三。 扩展一下
- 客户端支持sudo 服务器端 (1) 拷贝sudo schema cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema ## 拷贝schema (2) 配置文件导入schema vim /etc/openldap/slapd.conf include /etc/openldap/schema/sudo.schema rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/* service slapd restart (3) 建立sudo.ldif实例 注: 导入ldap server中的有个ldapuser的用户,还有个test用户组 vim sudo.ldif dn: ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: organizationalUnit ou: Sudoers
dn: cn=defaults,ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: sudoRole cn: defaults sudoOption: !visiblepw sudoOption: always_set_home sudoOption: env_reset sudoOption: requiretty
dn: cn=ldapuser,ou=Sudoers,dc=dianping,dc=com ## dn
objectClass: top
objectClass: sudoRole
cn: ldappuser ## 对应的是用户名或者组
sudoCommand: ALL ## 可以执行的命令
sudoHost: ALL ## 可以登录的Host
sudoOption: !authenticate ## 是否需要输入密码
sudoRunAsUser: ALL ## 以哪个用户执行
sudoUser: ldapuser ## 用户或者组
dn: cn=%test,ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: sudoRole cn: %test sudoCommand: /bin/su sudoHost: 192.168.2.134 sudoOption: !authenticate sudoRunAsUser: ALL sudoUser: %test
(2) 客户端
vi /etc/sudo-ldap.conf
uri ldap://192.168.2.128 # 如果有备用后面跟备用的
Sudoers_base ou=Sudoers,dc=dianping,dc=com
vi /etc/nsswitch.conf 增加
Sudoers: ldap files
(3) sudo测试
- 用户家目录是挂载着NFS NFS Server设置 (1) 安装nfs yum -y install nfs-utils portmap (2) vim /etc/exportfs /home *(rw,sync) (3) 启动nfs,关闭防火墙 service nfs start service iptables stop
客户端设置: (1) 配置autofs服务 vim /etc/auto.master /home auto.nfs
vim /etc/auto.nfs
* -fstype=nfs,rw,sync 192.168.2.128:/home/&
# 说明,上面的*表示要挂载的某用户的目录,后面的&表示用户名。
(2) 启动或重启autofs服务 service autofs start|restart
(3) 重新登录测试,mount查看
- 允许用户修改密码 服务器端设置 (1) 编辑配置文件slapd.conf, 注意:需要加载 database config之前 vim /etc/openldap/slapd.conf
access to attrs=userPassword
by self write
by anonymous auth
by dn.base="cn=admin,dc=dianping,dc=com" write
by * none
access to *
by self write
by dn.base="cn=admin,dc=dianping,dc=com" write
by * read
(2) 重新生成配置文件 rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/* service slapd restart
(3) 客户端修改密码测试 ldappasswd -D 'cn=admin,dc=dianping,dc=com' -W -S 'uid=ldapuser,ou=People,dc=dianping,dc=com' ## 以rootdn修改 ldappasswd -D 'uid=ldapuser,ou=People,dc=dianping,dc=com' -W -S 'uid=ldapuser,ou=People,dc=dianping,dc=com' ## 以普通用户修改
是不是很麻烦,其实passwd命令也是可以的
passwd
Changing password for user ldapuser.
Enter login(LDAP) password:
New password:
Retype new password:
LDAP password information changed for ldapuser
passwd: all authentication tokens updated successfully.
三。 使用openssl加密
服务器端:
-
下载生成证书的perl脚本 yum install openssl-perl openssl-devel
-
清空/etc/pki/CA下面的内容,否则脚本不会正常执行 rm -rf /etc/pki/CA/*
-
编辑openssl.conf 设置默认参数,以防写错 vim /etc/pki/tls/openssl.conf [ CA_default ] dir = /etc/pki/CA
...其它的默认 default_days = 3650 [ req_distinguished_name ] countryName_default = CN stateOrProvinceName_default = BeiJing localityName_default = BeiJing 0.organizationName_default = dianping.inc organizationalUnitName_default = Tech -
生成CA证书 cd /etc/pki/tls/misc ./CA.pl -newca # 会提示输入密码,设置一个, 完成后会在CA中生成CA证书cacert.pem # 提示的参数默认即可
-
为ldap服务器生成证书 ./CA.pl -newreq-nodes # 会提示输入一些信息,需要注意的是Common Name需要是客户端连接ldap服务器用的域名或者ip
-
为ldap证书签名 ./CA.pl -sign
-
将证书移动到/etc/openldap/cacerts目录,修改权限 mv new* /etc/openldap/cacerts cd /etc/openldap/cacerts cp /etc/pki/CA/cacert.pem . chown ldap:ldap * chmod 644 newcert.pem chmod 600 newkey.pem
-
修改配置文件slapd.conf,添加如下 TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3 TLSCACertificateFile /etc/openldap/cacerts/cacert.pem TLSCertificateFile /etc/openldap/cacerts/newcert.pem TLSCertificateKeyFile /etc/openldap/cacerts/newkey.pem TLSVerifyClient allow
说明:
never:默认选项,不验证客户端证书。
allow:检查客户端证书,没有证书或证书错误,都允许连接。
try:检查客户端证书,没有证书(允许连接),证书错误(终止连接)。
demand | hard | true:检查客户端证书,没有证书或证书错误都将立即终止连接。
- 以ldaps方式运行slapd, 两种方法
1) slapd -h 'ldaps:///'
2) 修改 /etc/sysconfig/ldap
SLAPD_LDAP=no # 不启用389
SLAPD_LDAPS=yes # 启用636
然后service slapd restart
netstat -tulnp | grep slapd # 查看是不是636端口
- 修改客户端配置文件
vim /etc/openldap/ldap.conf
TLS_REQCERT allow
TLS_CACERT /etc/openldap/cacerts/cacert.pem
TLS_CACERTDIR /etc/openldap/cacerts
URI ldaps://192.168.2.128
BASE dc=dianping,dc=com
- 客户端测试
ldapwhoami -v -x -Z # 匿名测试,最后显示success就是对的 ldapsearch -x -b "dc=dianping,dc=com" -H ldaps://192.168.2.128 # search测试
四。 主从复制 1) 一主多从 2) 双主mirror模式 测试服务器: 主: 192.168.2.131 从: 192.168.2.128
- 基于tls的主从模式
1) 两台机器上安装openldap server,并配置加密,两端的证书一致(不一致貌似有问题)
yum -y install openldap-server openldap
2) 修改主配置文件slapd.conf,添加,并重启
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload syncprov.la # 默认没有load
index entryCSN,entryUUID eq # 加索引
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
3) 修改从配置文件slapd.conf,并重启 注意,后面的注释不能有,下面是tab
moduleload syncprov.la # 默认没有load
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
syncrepl rid=125
provider=ldaps://192.168.2.131:636
searchbase="dc=dianping,dc=com"
type=refreshOnly
interval=00:00:01:00 # 同步间隔,分别是天时分秒
filter="(objectClass=*)"
schemachecking=off
bindmethod=simple # 认证
binddn="cn=admin,dc=dianping,dc=com"
credentials=redhat # 密码
retry="60 +" # 重试时间
4) 主上面添加记录测试从是否复制过来
主配置文件slapd.conf
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.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
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
loglevel 1
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload syncprov.la
database config
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=Manager,dc=my-domain,dc=com" read
by * none
database bdb
suffix "dc=dianping,dc=com"
checkpoint 1024 15
rootdn "cn=admin,dc=dianping,dc=com"
rootpw redhat
directory /var/lib/ldap
index entryCSN,entryUUID eq
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
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/cacerts/newcert.pem
TLSCertificateKeyFile /etc/openldap/cacerts/newkey.pem
TLSVerifyClient allow
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
从配置文件slapd.conf
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.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
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
loglevel 1
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload syncprov.la
database config
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=Manager,dc=my-domain,dc=com" read
by * none
database bdb
suffix "dc=dianping,dc=com"
checkpoint 1024 15
rootdn "cn=admin,dc=dianping,dc=com"
rootpw redhat
directory /var/lib/ldap
index objectClass eq,pres
index entryCSN,entryUUID eq
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
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/cacerts/newcert.pem
TLSCertificateKeyFile /etc/openldap/cacerts/newkey.pem
TLSVerifyClient allow
syncrepl rid=125
provider=ldaps://192.168.2.131:636
searchbase="dc=dianping,dc=com"
type=refreshOnly
interval=00:00:01:00
filter="(objectClass=*)"
schemachecking=off
bindmethod=simple
binddn="cn=admin,dc=dianping,dc=com"
credentials=redhat
retry="60 +"
- 双主mirror模式,双向同步 mirror模式就是互为主从,任何一个写都会复制到另一个上面 master1 192.168.2.128 master2 192.168.2.131
1) master1的配置文件片段
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
serverID 1
syncrepl rid=001
provider=ldaps://192.168.2.131:636
bindmethod=simple
binddn="cn=admin,dc=dianping,dc=com"
credentials=redhat
searchbase="dc=dianping,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on
2) master2的配置文件片段,与master1配置文件基本相同,只是serverid和provider不同而已
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
serverID 2
syncrepl rid=001
provider=ldaps://192.168.2.128
bindmethod=simple
binddn="cn=admin,dc=dianping,dc=com"
credentials=redhat
searchbase="dc=dianping,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on
3) 重启,测试添加条目
五、 权限控制
passwd 直接修改吗 serverfault.com/questions/303256/ldap-password-information-update-failed-insufficient-access-50