Chinaunix首页 | 论坛 | 博客
  • 博客访问: 885261
  • 博文数量: 254
  • 博客积分: 5350
  • 博客等级: 大校
  • 技术积分: 2045
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 13:27
文章分类

全部博文(254)

文章存档

2015年(1)

2014年(9)

2013年(17)

2012年(30)

2011年(150)

2010年(17)

2009年(28)

2008年(2)

分类: LINUX

2011-04-09 21:23:23

LDAP配置


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通讯》:

http://blog.chinaunix.net/u2/65250/showart_1904537.html

阅读(3048) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~