分类: LINUX
2011-04-09 21:23:23
LDAP配置文档(基础篇)
本文档LDAP域设置为igoo.cn,
服务器IP为192.168.2.143,客户端IP为192.168.2.206
请按实际环境进行修改
安装
LDAP服务器安装以下软件包
# yum -y install authconfig authconfig-gtk libtool-ltdl \
openldap openldap-servers openldap-clients
nss_ldap
LDAP客户端不需要openldap-servers
# yum -y install authconfig authconfig-gtk libtool-ltdl \
openldap openldap-clients nss_ldap
在服务器和客户机/etc/hosts文件中都加入:
192.168.2.143 CA
192.168.2.206 client
配置
a) 配置LDAP服务器
1. 记下slappasswd命令生成的字串用于配置/etc/openldap/slapd.conf中的rootpw项
# slappasswd
New password:
Re-enter new password:
{SSHA}8OilbfvZ4DjHznURWHL3cl4FnHaCN6uU -->
slapd.conf:rootpw
2. 修改服务器配置文件slapd.conf
# perl -pi -e 's|dc=my-domain,dc=com|dc=igoo,dc=cn|g'
/etc/openldap/slapd.conf; \
perl -pi -e 's|^# modulepath\t|modulepath\t|g'
/etc/openldap/slapd.conf; \
perl -pi -e 's|^# moduleload
accesslog.la|moduleload accesslog.la|g'
/etc/openldap/slapd.conf
# echo 'rootpw {SSHA}8OilbfvZ4DjHznURWHL3cl4FnHaCN6uU'
>> /etc/openldap/slapd.conf
打开ldap日志,默认级别为256
# echo 'local4.* /var/log/ldap.log'
>> /etc/syslog.conf; touch
/var/log/ldap.log; service syslog restart
注意,slapd.conf中设定了LDAP数据库格式为bdb,存储路径/var/lib/ldap
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG;
\
chown ldap:ldap /var/lib/ldap/DB_CONFIG
3. 检查系统安全配置,启动ldap(顺便把NFS需要的端口打开)
# iptables -I RH-Firewall-1-INPUT -m state --state NEW -m tcp -p
tcp --dport 389 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 389 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 636 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 636 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 30389 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 30389 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 30636 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 30636 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 111 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 111 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 2049 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 2049 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m tcp -p tcp --dport 30002:30005 -j ACCEPT; \
iptables -I RH-Firewall-1-INPUT -m state --state
NEW -m udp -p udp --dport 30002:30005 -j ACCEPT; \
iptables-save >
/etc/sysconfig/iptables
# service ldap start; chkconfig ldap on
# netstat -nlp|grep slapd
4. 添加测试用户ldapuser01,配置用户登录环境
# groupadd -g 5000 ldapgroup; mkdir /opt/home;
# useradd -u 5001 -g 5000 -d /opt/home/ldapuser01 ldapuser01; echo
test|passwd ldapuser01 --stdin; \
useradd -u 5002 -g 5000 -d /opt/home/ldapuser02
ldapuser02; echo test|passwd ldapuser02 --stdin
5. 创建根项,并使用openldap-servers自带脚本生成和导入pass/group配置
# grep ldapuser /etc/passwd > mypasswd; grep
ldapgroup /etc/group > mygroup
# perl -pi -e
's|padl.com|igoo.cn|g;s|dc=padl,dc=com|dc=igoo,dc=cn|g' \
/usr/share/openldap/migration/migrate_common.ph;
\
/usr/share/openldap/migration/migrate_base.pl
> base.ldif; \
/usr/share/openldap/migration/migrate_passwd.pl
mypasswd passwd.ldif; \
/usr/share/openldap/migration/migrate_group.pl
mygroup group.ldif; \
ls -al *.ldif
# ldapadd -x -D "cn=Manager,dc=igoo,dc=cn" -W -f base.ldif; \
ldapadd -x -D "cn=Manager,dc=igoo,dc=cn" -W -f
passwd.ldif; \
ldapadd -x -D "cn=Manager,dc=igoo,dc=cn" -W -f
group.ldif
# tail /var/log/messages; tail /var/log/secure; tail -f
/var/log/ldap.conf
b) 配置客户端(以下命令均在LDAP客户端运行)
先将LDAP服务器IP加入到/etc/hosts中
# echo '192.168.2.143 ldapserver'
>> /etc/hosts
配置本机使用LDAP认证,并配置LDAP服务器IP
# vi /etc/nsswitch.conf
perl -pi -e
's|^passwd:
files|passwd:
files ldap|g' /etc/nsswitch.conf; \
perl -pi -e
's|^shadow:
files|shadow:
files ldap|g' /etc/nsswitch.conf; \
perl -pi -e
's|^group:
files|group:
files ldap|g' /etc/nsswitch.conf
# authconfig-tui
[*] Use LDAP Authentication
[ ] Use TLS
Server:
<-- 此处为LDAP服务器IP
Base DN: dc=igoo,dc=cn
# grep -v '#' /etc/openldap/ldap.conf
<-- 实际上修改的就是这个配置文件
URI
BASE dc=igoo,dc=cn
TLS_CACERTDIR /etc/openldap/cacerts
检查LDAP服务
# ldapsearch -LLL -x|grep ldapuser
# ldapsearch -LLL -W -x -D "cn=Manager,dc=igoo,dc=cn" -b
"dc=igoo,dc=cn" "(uid=miaohongzhi)" userPassword
Enter LDAP Password:
dn: uid=ldapuser01,ou=People,dc=igoo,dc=cn
userPassword::
e2NyeXB0fSQxJFJuczJuT0hEJDhqd3ZwVUVaeUNuRlRKLk8zdGxaTjE=
测试LDAP账户是否可用
# ssh
password:
Last login: Thu Jul 16 12:10:07 2009 from
localhost.localdomain
Could not chdir to home directory /opt/home/ldapuser01: No such
file or directory
-bash-3.2$
可见,LDAP已经可用,如果需要让用户拥有漫游主目录,结合NFS和autofs,按以下步骤进行配置:
1. 回到LDAP服务器192.168.2.143进行操作
绑定nfs端口
#cat << EOF
>> /etc/sysconfig/nfs
LOCKD_TCPPORT="30002"
LOCKD_UDPPORT="30002"
STATD_PORT="30003"
MOUNTD_PORT="30004"
RQUOTAD_PORT="30005"
EOF
# chkconfig nfs on; service nfs stop; service nfslock stop; service
portmap stop; \
service portmap start; service portmap start;
service portmap start
确认NFS相关端口被绑定到指定端口
# netstat -nlp|grep 'LISTEN '
配置export,可以设置为客户端所在网段允许mount
# echo
"/opt/home
192.168.2.206(rw,no_root_squash,async)" >
/etc/exports
# exportfs -a; showmount -e localhost
2. 到客户端192.168.2.206上配置
# mkdir /opt/home
# echo
"/opt/home
/etc/auto.ldap --timeout=60 --ghost"
>> /etc/auto.master; \
echo
"*
-fstype=nfs,ro,soft,intr
192.168.2.143:/opt/home/&"
>> /etc/auto.ldap
注意中间是TAB隔开
# service autofs restart; cat /proc/mounts |grep autofs; ls -al
/opt/home/ldapuser01
# ssh
password:
Last login: Thu Jul 16 12:14:33 2009 from
localhost.localdomain
[ldapuser01@h206 ~]$ ls -al
可见,LDAP用户的目录已经漫游到LDAP客户端所在服务器了。
附1. LDAP管理命令:
1、修改用户密码,用户需要有userPassword项了。
# ldappasswd -x -D "cn=Manager,dc=igoo,dc=cn" -W
"uid=miaohongzhi,ou=People,dc=igoo,dc=cn" -S
New password:
Re-enter new password:
Enter bind password:
Result: Success (0)
注意:"Enter bind password" 是"cn=Manager,dc=igoo,dc=cn"管理员的密码。
2、删除命令ldapdelete
# ldapdelete -x -D "cn=Manager,dc=igoo,dc=cn" -W
"uid=ldapuser01,ou=People,dc=igoo,dc=cn"
3、管理员密码更改
# slappasswd
New password
Re-enter new password
{SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs
再copy到 /path/to/sldap.conf 的 rootpw 即可,重启使用配置文件生效
4、通过ldapmodify修改条目
# cat modify.ldif
dn: uid=ldapuser01,ou=People,dc=igoo,dc=cn
changetype: modify
replace: loginShell
loginShell: /bin/false
还可以使用LDAP管理工具:phpLDAPadmin,LDAP Browser&Editor
暂未进行测试
附2. 更安全的LDAP,即在服务器和客户端使用TSL来加密通讯
1. 在服务器端生成证书
# cd /etc/pki/tls/misc; ./CA -newca
输入CA密码,以后要用此密码来签发证书,。
# openssl req -new -nodes -subj
-keyout slapdkey.pem -out slapd-req.pem -days 3650
# openssl ca -out slapdcert.pem -infiles slapd-req.pem
2. 路径、权限
# rm -f slapd-req.pem; mv slapd*.pem /etc/openldap/; cp
/etc/pki/CA/cacert.pem /etc/openldap/cacerts/
# cd /etc/openldap; chown ldap:ldap slapdkey.pem slapdcert.pem
cacerts/cacert.pem ;\
chmod 400 slapdkey.pem; chmod 644 slapdcert.pem
cacerts/cacert.pem
# cat << EOF
>> /etc/openldap/slapd.conf
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem
EOF
# service ldap restart; netstat -nlp|grep slapd
可见LDAP30389端口和LDAPS30636端口已经在监听状态
3. 在客户端配置和确认
# openssl s_client -connect CA:30636
配置用户信息和验证均使用LDAP,详细配置中不要选择使用TLS,URI修改为
<--注意勿用TLS,否则会报tls already use!!!
authconfig-gtk可以通过ftp或http自动下载CA,否则需要手动将服务器上的cacert.pem存入本机/etc/openldap/cacerts目录
# tail -5 /etc/ldap.conf
...
uri
ssl no
#tls_checkpeer yes
tls_cacertdir /etc/openldap/cacerts
---or---tls_cacertfile /etc/openldap/cacerts/cacert.pem
pam_password md5
# tail -5 /etc/openldap/ldap.conf
...
URI
BASE dc=igoo,dc=cn
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow
# ldapsearch -x -LLL -H
如直接用IP,可能出现下面的报错,这是由于IP和前面CN=CA不一致:
ldap_bind: Can't contact LDAP server (-1)
additional info: TLS: hostname does not match CN in peer
certificate
# ssh
OK!
若确定使用LDAPS,可将服务器上iptables原先打开的389端口去掉。
selinux is preventing nscd(nscd_t) "read write" to socket
unconfined_t
附3. LDAP主备结构
1. 配置主服务器
# echo
'192.168.3.27
SLAVE' >> /etc/hosts
在配置文件/etc/openldap/slapd.conf,添加如下:
replogfile
/var/lib/ldap/ldaprep.log
replica uri=ldap://slave:30389
binddn="cn=Manager,dc=igoo,dc=cn"
bindmethod=simple credentials=igoo
#updatedn "cn=Manager,dc=igoo,dc=cn"
启动服务
# touch /var/lib/ldap/ldaprep.log; chown ldap:ldap
/var/lib/ldap/ldaprep.log
/etc/init.d/ldap restart
/etc/init.d/slurpd restart
chkconfig ldap on
chkconfig slurpd on
# openssl req -new -nodes -subj
'/CN=SLAVE/O=igoo/C=CN/ST=BJ/L=Beijing' -keyout slapdkey-slave.pem
-out slapd-req-slave.pem -days 3650
# openssl ca -out slapdcert-slave.pem -infiles
slapd-req-slave.pem
# rm -f slapd-req-slave.pem; scp -r slapd*.pem
SLAVE:/etc/openldap/; scp /etc/pki/CA/cacert.pem
SLAVE:/etc/openldap/cacerts/
2. 配置备份服务器
# echo
'192.168.2.143
CA' >> /etc/hosts
# cp -fR /etc/openldap/ /etc/openldap.bak; cp -fR /var/lib/ldap
/var/lib/ldap.bak; \
scp CA:/etc/openldap/slapd.conf /etc/openldap/;
\
scp -r CA:/var/lib/ldap/* /var/lib/ldap/;
\
scp -r CA:/etc/openldap/schema/*
/etc/openldap/schema/; \
chmod 644 /etc/openldap/slapdcert-slave.pem
/etc/openldap/cacerts/cacert.pem; \
chmod 400 /etc/openldap/slapdkey-slave.pem;
\
chown ldap:ldap /etc/openldap/*.pem
/etc/openldap/cacerts/cacert.pem /var/lib/ldap/*
/etc/openldap/schema/*
# perl -pi -e 's|slapdcert.pem|slapdcert-slave.pem|g'
/etc/openldap/slapd.conf; \
perl -pi -e
's|slapdkey.pem|slapdkey-slave.pem|g' /etc/openldap/slapd.conf;
\
echo 'updatedn
"cn=Manager,dc=igoo,dc=cn"' >>
/etc/openldap/slapd.conf
3. 配置客户端
# echo
'192.168.2.143
CA' >> /etc/hosts; \
echo
'192.168.3.27
SLAVE' >> /etc/hosts
设置为使用多个LDAP服务器
# perl -pi -e 's|^uri |#uri |g' /etc/ldap.conf; \
echo 'uri
>> /etc/ldap.conf
在主服务器查看复制日志
# tail -f /var/lib/ldap/ldaprep.log
添加新用户ldapuser07,ldapuser08
# ldapadd -x -D "cn=Manager,dc=igoo,dc=cn" -W -f passwd.ldif
在客户端验证主备库均增加了两个用户,同时,在刚才主服务器窗口可以看到有复制信息输出。
# ldapsearch -x -H uid; ldapsearch -x -H
uid
4. 定时备份
# vi /root/ldapbackup.sh
#!/bin/bash
Date=`date +%Y%m%d`
slapcat > /root/ldapdata.ldif.$Date
# chmod 700 /root/ldapbackup.sh; crontab -e
30 0 * * * /root/ldapbackup.sh
参考《SLES10 SP1下Openldap实现用户单点登录的方法》
Tips:
1. 使用加密方式通信,服务器生成证书,LDAPS监听在636,客户端TLS不要打勾,只需要使用即可
2. 让LDAP监听在其它端口,修改/etc/init.d/ldap
# perl -pi -e 's|ldap:///|ldap://0.0.0.0:30389|g' /etc/init.d/ldap;
\
perl -pi -e
's|ldaps:///|ldaps://0.0.0.0:30636|g' /etc/init.d/ldap
SELinux is preventing the slapd (slapd_t) from binding to port
30389
注意SELinux保护,默认不允许slapd监听在其它端口。
semanage port -{a|d|m} [-tr] [ -p protocol ] port |
port_range
# semanage port -l|grep ldap
# semanage port -a -t ldap_port_t -p tcp 30389; semanage port -a -t
ldap_port_t -p udp 30389; \
semanage port -a -t ldap_port_t -p tcp 30636;
semanage port -a -t ldap_port_t -p udp 30636
3. 我们可以采用两种方法来配置 LDAP 客户机。一种快速而简单的方法是运行
/usr/sbin/authconfig,并在两个屏幕中输入信息。
另外一种方法是通过编辑客户机 LDAP 配置文件 /etc/ldap.conf,然后修改
/etc/nsswitch.conf、/etc/sysconfig/authconfig 和
/etc/pam.d/system-auth。
# groupadd -g 19999 vip
把新用户添加到/etc/group的vip行尾部,用英文逗号隔开
# echo
"session
required
pam_mkhomedir.so skel=/etc/skel/ umask=0022"
>> /etc/pam.d/login; \
echo
"session
required
pam_mkhomedir.so skel=/etc/skel/ umask=0022"
>> /etc/pam.d/sshd
echo
"account
required
pam_require.so root @vip" >>
/etc/pam.d/sshd
echo
"account
required
pam_require.so root @vip" >>
/etc/pam.d/sshd
# scp
/etc/openldap/cacerts/; \
scp
miaohongzhi@ldap1v.ops.lfc.igoo.cn:/lib/security/pam_require.so
/lib/security/
# chmod 644 /etc/openldap/cacerts/cacert.pem; chown ldap:ldap
/etc/openldap/cacerts/cacert.pem; \
chmod 755 /lib/security/pam_require.so
# authconfig-tui 勾选LDAP,服务器 ,DN
dc=igoo,dc=cn
# tail -5 /etc/ldap.conf
...
uri
ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5
# tail -5 /etc/openldap/ldap.conf
...
URI
BASE dc=igoo,dc=cn
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow
# ldapsearch -x -LLL -H
access to attrs=userpassword
by self write
by anonymous auth
by dn.base="cn=Manager,dc=igoo,dc=cn" write
by * none
access to *
by self write
by dn.base="cn=Manager,dc=igoo,dc=cn" write
by * none
管理LDAP条目更多示例参考:
参考《配置OpenLDAP使用TLS通讯》: