|
环境:centos6.4 openldap 2.4.23 iptables selinux关闭
理论知识:
实践:
一. openldap安装
1. Yum安装
yum install -y openldap openldap-servers openldap-clients
2. 准备配置文件
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
3. 修改server配置文件slapd.conf # ldap.conf是客户端的配置文件
vim /etc/openldap/slapd.conf
1) 设置目录树的后缀
suffix "dc=dianping,dc=com"
2) 设置管理员DN
rootdn "cn=admin,dc=example,dc=com"
3) 设置管理员密码
rootpw redhat
或机密格式, 加密格式可通过 slappasswd命令来生成
rootpw {SSHA}j6OO++o76F2yhww2Cg/+Hy8oDPixx6C3
4) 设置ldap日志,在argsfile下面添加
loglevel 1
修改系统日志配置文件
vim /etc/rsyslog.conf # centos5版应该是syslog.conf
local4.* /var/log/ldap.log
service rsyslog restart
5) 修改完配置文件后用以下命令生成新的配置文件,以后不再特殊说明
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
4. 修改权限
chown -R ldap.ldap /etc/openldap/*
chown -R ldap.ldap /var/lib/ldap/*
5. 启动
service slapd start
netstat -tulnp | grep slapd # 查看是否监听389
6. 初始化库测试库
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=*)"
7. 用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'); # 初始登录的密码
8. 访问定义的ldapadmin vhost
点击登录,登录dn: cn=admin,dc=dianping,dc=com 密码:redhat ##上面如果设置了,应该会默认填写着的
9. 下载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";
10. 利用perl脚本转换为ldif
./migrate_base.pl > /tmp/base.ldif
./migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif
./migrate_group.pl /etc/group > /tmp/group.ldif
11. 导入到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
1. 安装LDAP客户端及依赖组件
yum -y install openldap openldap-clients nss-pam-ldapd pam_ldap
2. 增加BIND策略,避免LDAP无法连接时无法开机
echo "bind_policy soft" >> /etc/openldap/ldap.conf
3. 自动创建目录设置
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" >> /etc/pam.d/system-auth
4. 设置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
5. 客户端登陆测试,如果不能登陆服务器端tail -f /var/log/ldap.log查看
三。 扩展一下
1. 客户端支持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测试
2. 用户家目录是挂载着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查看
3. 允许用户修改密码
服务器端设置
(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加密
服务器端:
1. 下载生成证书的perl脚本
yum install openssl-perl openssl-devel
2. 清空/etc/pki/CA下面的内容,否则脚本不会正常执行
rm -rf /etc/pki/CA/*
3. 编辑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
4. 生成CA证书
cd /etc/pki/tls/misc
./CA.pl -newca # 会提示输入密码,设置一个, 完成后会在CA中生成CA证书cacert.pem
# 提示的参数默认即可
5. 为ldap服务器生成证书
./CA.pl -newreq-nodes # 会提示输入一些信息,需要注意的是Common Name需要是客户端连接ldap服务器用的域名或者ip
6. 为ldap证书签名
./CA.pl -sign
7. 将证书移动到/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
8. 修改配置文件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:检查客户端证书,没有证书或证书错误都将立即终止连接。
9. 以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端口
10. 修改客户端配置文件
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
11. 客户端测试
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
1. 基于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 +"
2. 双主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
|
|