OpenLDAP配置记录
- Create: 2012-12-24
- Update: 2012-12-27
- 参考: http://blog.christophersmart.com/articles/openldap-how-to-fedora/
概述
-
测试环境
- CentOS 6.3
- domain: gdu.me
- LDAP server: ldap.gdu.me
DEVICE="eth1" BOOTPROTO="static" HWADDR="08:00:27:EF:6C:2B" NM_CONTROLLED="no" ONBOOT="yes" TYPE="Ethernet" IPADDR=192.168.56.2 NETMASK=255.255.255.0
- 配置步骤
- 安装软件包
- 配置LDAP Server域信息
- 配置LDAP Server加密(TLS)认证
- 启动LDAP Server、测试
- 通过迁移工具导入本地用户
- 增加用户和组(ldif文件)
- 客户端LDAP认证配置
OpenLDAP Server
OpenLDAP 2.3以后版本有两种配置方式:
- 配置文件:旧方式,通过/etc/openldap/slapd.conf配置。
- 非配置文件:配置存储在LDAP server中,可动态更新。在/etc/openldap/sladp.d目录中配置。
安装所需软件包
yum install openldap-servers migrationtools #openssl
========================================================================================== Package Arch Version Repository Size ========================================================================================== Installing: migrationtools noarch 47-7.el6 base 25 k openldap-servers i686 2.4.23-26.el6_3.2 updates 2.0 M Installing for dependencies: openldap-clients i686 2.4.23-26.el6_3.2 updates 158 k portreserve i686 0.0.4-9.el6 base 22 k Transaction Summary ========================================================================================== Install 4 Package(s)
生成管理员密码串
slappasswd -s 123456 #{SSHA}IYj/KpP3SS4Ka3Qcn55hfvMb8Ionc/h8
配置文件
- 删除配置目录
如果使用配置文件,需删除或改名配置目录(启动脚本优先使用目录下的配置)。
rm -rf /etc/openldap/slapd.d/
- 创建配置文件
cp -a /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
- 修改配置
设置domain(dc=gdu,dc=me)、admin密码、密钥文件路径信息(注意:有的站点说配置项与配置内容间必须用TAB分隔,我没测试过)。
-
domain修改修改
-
直接替换
sed -i.bak 's/dc=my-domain,dc=com/dc=gdu,dc=com/g' /etc/openldap/slapd.conf
-
手工修改
suffix "dc=gdu,dc=me" rootdn "cn=Manager,dc=gdu,dc=me" ... # allow only rootdn to read the monitor # enable server status monitoring (cn=monitor) database monitor access to * by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.exact="cn=Manager,dc=gdu,dc=me" read by * none
-
直接替换
-
设置admin密码、密钥文件路径(后续生成)
cat >> /etc/openldap/slapd.conf <<EOF rootpw {SSHA}IYj/KpP3SS4Ka3Qcn55hfvMb8Ionc/h8 TLSCertificateFile /etc/openldap/ssl/slapdcert.pem TLSCertificateKeyFile /etc/openldap/ssl/slapdkey.pem EOF
非配置文件
通过修改slapd.d目录下的文件(.ldif),将配置存入LDAP server中(cn=config)。
首先配置的两个是基础数据库文件。
-
bdb.ldif
-
domain修改
sed -i.bak 's/dc=my-domain,dc=com/dc=gdu,dc=me/g' /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
-
手工修改
olcRootDN: dc=gdu,dc=me
-
手工修改
-
admin密码及密钥文件路径
cat >> /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif <<EOF olcRootPW: {SSHA}IYj/KpP3SS4Ka3Qcn55hfvMb8Ionc/h8 olcTLSCertificateFile: /etc/openldap/ssl/slapdcert.pem olcTLSCertificateKeyFile: /etc/openldap/ssl/slapdkey.pem EOF
-
domain修改
-
monitor.ldif
sed -i.bak 's/cn=manager,dc=my-domain,dc=com/cn=Manager,dc=gdu,dc=me/g' /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
数据库缓存
现在已用配置、或非配置文件方式完成了LDAP配置。复制DB_CONFIG文件,并设置使用Berkley数据库。
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG chown -Rf ldap:ldap /var/lib/ldap/
测试配置
slaptest -u #config file testing succeeded
配置文件转为目录
service slapd stop mkdir -p /etc/openldap/slapd.d/ rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/ chown ldap.ldap /etc/openldap/slapd.d/ -R
配置加密(LDAPS)
为提高使用LDAP认证的安全性,配置同时运行LDAP(TLS,tcp:389)和TLS或LDAPS(TLS,tcp:636)。
-
设置ldap启动参数
sed -i.bak 's/\(SLAPD_LDAPS=\).*$/\1yes/g' /etc/sysconfig/ldap
- 生成SSL密钥
注意替换按提示输入的ldap server信息。
mkdir /etc/openldap/ssl/ openssl req -new -x509 -nodes -out /etc/openldap/ssl/slapdcert.pem -keyout /etc/openldap/ssl/slapdkey.pem -days 365 # 设置生成的两个文件(公钥、私钥)ldap用户可读 chown -Rf root:ldap /etc/openldap/ssl chmod -Rf 750 /etc/openldap/ssl chmod -Rf 640 /etc/openldap/ssl/*
Generating a 2048 bit RSA private key ....................................................+++ writing new private key to '/etc/openldap/ssl/slapdkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: CN State or Province Name (full name) []: SC Locality Name (eg, city) [Default City]: Chengdu Organization Name (eg, company) [Default Company Ltd]: GDU Organizational Unit Name (eg, section) []: IT Common Name (eg, your name or your server's hostname) []: ldap.gdu.me Email Address []: admin@gdu.me
启动LDAP服务
-
启动LDAP服务
# 启动服务 service slapd start # 检查服务侦听 netstat -lt |grep ldap #tcp 0 0 *:ldap *:* LISTEN #tcp 0 0 *:ldaps *:* LISTEN # 设置自启动 chkconfig slapd on # 测试配置 ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF # # LDAPv3 # base <> with scope baseObject # filter: (objectclass=*) # requesting: namingContexts # # dn: namingContexts: dc=gdu,dc=me # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
LDAP基本服务配置完成,后面需构建用户和组。
配置base domain
LDAP已经运行起来,但还没有任何用户(People)、组(Group),我们将在后续添加,现在我们需要设置base、证书和组文件。
这是使用迁移本地用户的方式来完成:转换成LDIF文件用于导入LDAP。
我们面要建立base.ldif模板,给我们的目录(gdu.me)定义基本结构。
-
建立base.ldif
cat > base.ldif <<EOF dn: dc=gdu,dc=me dc: gdu objectClass: top objectClass: domain dn: ou=People,dc=gdu,dc=me ou: People objectClass: top objectClass: organizationalUnit dn: ou=Group,dc=gdu,dc=me ou: Group objectClass: top objectClass: organizationalUnit EOF
注意:换行符差别可能造成导入失败(从网页复制,换行符会出错)。与migrate_base.pl > base.ldif
生成的比较,只有一些换行符差别。
ldapadd: attributeDescription "dn": (possible missing newline after line 8, entry "dc=gdu,dc=m e"?)
-
导入base.ldif
ldapadd -x -W -D "cn=Manager,dc=gdu,dc=me" -f ./base.ldif # Enter LDAP Password: # adding new entry "dc=gdu,dc=me" # adding new entry "ou=People,dc=gdu,dc=me" # adding new entry "ou=Group,dc=gdu,dc=me"
If you saw the above, then it worked! If you get an error about authentication issues connecting to my-domain.com then it’s not reading your configuration properly, and is using the default. Stop the service and start again.
迁移本地用户和组
下面使用迁移工具根据本地已有用户和组创建ldif文件,用于导入LDAP。
-
配置migrate工具
vim /usr/share/migrationtools/migrate_common.ph
修改以下内容:
# Default DNS domain $DEFAULT_MAIL_DOMAIN = "gdu.me"; # Default base $DEFAULT_BASE = "dc=gdu,dc=me";
- Users (People)
生成已有用户ldif文件。
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd people.ldif
编辑people.ldif文件,删除不需要导入的用户信息(如:mysql,nobody等等)。
- Groups (Group)
生成已有组ldif文件。
/usr/share/migrationtools/migrate_group.pl /etc/group group.ldif
编辑group.ldif文件,删除不需导入的组信息(似乎保留root,wheel,users就可了)。
-
导入ldif文件
ldapadd -x -W -D "cn=Manager,dc=gdu,dc=me" -f group.ldif ldapadd -x -W -D "cn=Manager,dc=gdu,dc=me" -f people.ldif
-
测试连接LDAP数据库
ldapsearch -xWD "cn=Manager,dc=gdu,dc=me" -b "dc=gdu,dc=me" "cn=root" ldapsearch -x -b 'dc=gdu,dc=me' 'cn=yuanxing'
Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=gdu,dc=me> with scope subtree # filter: cn=root # requesting: ALL # # root, People, gdu.me dn: uid=root,ou=People,dc=gdu,dc=me uid: root cn: root objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e2NyeXB0fSQ2JFdjN..... shadowLastChange: 15663 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 0 gidNumber: 0 homeDirectory: /root gecos: root # root, Group, gdu.me dn: cn=root,ou=Group,dc=gdu,dc=me objectClass: posixGroup objectClass: top cn: root userPassword:: e2NyeXB0fXg= gidNumber: 0 # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 2
添加用户和组
创建用户、组ldif文件,导入LDAP。
- User
创建username.ldif文件(如yuanxing.ldif):
cat > yuanxing.ldif <<EOF dn: uid=yuanxing,ou=People,dc=gdu,dc=me uid: yuanxing cn: YuanXing objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword: {CRYPT}cr7JQsCc2EcXg shadowLastChange: 14846 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 501 gidNumber: 501 homeDirectory: /home/yuanxing gecos: YuanXing EOF
UserPassword可用下面的命令生成加密串:
slappasswd -c crypt -s 111111 {CRYPT}cr7JQsCc2EcXg
- Group
创建username.ldif文件(如yuanxing-group.ldif):
cat > yuanxing-group.ldif <<EOF dn: cn=yuanxing,ou=Group,dc=gdu,dc=me objectClass: posixGroup objectClass: top cn: yuanxing userPassword: {crypt}x gidNumber: 501 EOF
-
导入LDAP
ldapadd -x -W -D "cn=Manager,dc=gdu,dc=me" -f yuanxing-group.ldif #Enter LDAP Password: #adding new entry "cn=yuanxing,ou=Group,dc=gdu,dc=me" ldapadd -x -W -D "cn=Manager,dc=gdu,dc=me" -f yuanxing.ldif #Enter LDAP Password: #adding new entry "uid=yuanxing,ou=People,dc=gdu,dc=me"
客户端配置
认证配置
LDAP服务端运行正常,现在可以配置客户机通过LDAP进行认证。
-
设置DNS或host
192.168.56.101 ldap.gdu.me
-
安装软件包
yum install openldap-clients nss-pam-ldapd pam_ldap
CentOS/Fedora主机,使用authconfig-gtk或authconfig-tui(authconfig好像可以通过命令行参数完成?),并做如下设置:
- 证书文件
将slapdcert.pem文件上传到/etc/openldap/cacerts目录。
-
设置认证方式
┌────────────────┤ Authentication Configuration ├─────────────────┐ │ │ │ User Information Authentication │ │ [ ] Cache Information [*] Use MD5 Passwords │ │ [*] Use LDAP [*] Use Shadow Passwords │ │ [ ] Use NIS [*] Use LDAP Authentication │ │ [ ] Use IPAv2 [ ] Use Kerberos │ │ [ ] Use Winbind [ ] Use Fingerprint reader │ │ [ ] Use Winbind Authentication │ │ [*] Local authorization is sufficient │ └─────────────────────────────────────────────────────────────────┘
yum install nss-pam-ldapd pam_ldap
-
设置LDAP Server信息
┌─────────────────┤ LDAP Settings ├─────────────────┐ │ │ │ [*] Use TLS │ │ Server: ldaps://ldap.gdu.me/____________________ │ │ Base DN: dc=gdu,dc=me____________________________ │ │ │ └───────────────────────────────────────────────────┘
配置完成后,会启动nslcd服务进程(nslcd - local LDAP name service daemon)。
-
测试ldap查询
ldapsearch -xWD "cn=Manager,dc=gdu,dc=me" -b "dc=gdu,dc=me" "cn=root" ldapsearch -x -b 'dc=gdu,dc=me' 'cn=yuanxing' getent passwd|grep yuanxing
如果没有返回信息,或返回错误,请检查配置,重新进行测试。如果检查配置没有错误,可以做如下修改,重新进行测试。
将/etc/sssd/sssd.conf文件中的#enumerate=false,修改为:enumerate=true,这样修改完后,getent就会从LDAP查找账户信息。
并重新执行如下命令:
service sssd restart
- 测试登录
成功登录后提示无home目录,需后续设置登录时自动创建目录、或通过autofs自动mountNFS目录。
No directory /home/yuanxing! Logging in with home = "/".
- TLS方式失败,原因待查
LDAP以TLS方式运行时,执行登录后,LDAP服务端slapd进程CPU占用达90%以上,日志中无相应信息,原因待查。
客户快速配置
参考: http://myhat.blog.51cto.com/391263/972870
#!/bin/bash chmod 755 /var/log/audit grep "192.168.56.101" /etc/hosts || echo "192.168.56.101 ldap.gdu.me" >> /etc/hosts grep "192.168.56.102" /etc/hosts || echo "192.168.56.102 ldap.gdu.me" >> /etc/hosts grep SUDOERS /etc/openldap/ldap.conf || echo "SUDOERS_BASE ou=SUDOers,dc=gdu,dc=me" >> /etc/openldap/ldap.conf grep sudoers /etc/nsswitch.conf || echo "sudoers: ldap" >> /etc/nsswitch.conf test -e /etc/openldap/cacerts/ca.pem || wget http://192.168.56.101/config/ca.pem -P /etc/openldap/cacerts/ authconfig --useshadow --usemd5 --enableldap --enableldapauth --enableldaptls --ldapserver=ldap.gdu.me \ --ldapbasedn="dc=gdu,dc=me" --ldaploadcacert=file:///etc/openldap/cacerts/ca.pem --enablemkhomedir --updateall grep "sbin" /etc/skel/.bashrc || echo -e 'PATH=$PATH:/sbin:/usr/local/sbin:/usr/kerberos/sbin;\nexport PATH' >> /etc/skel/.bashrc
自动创建HOME
对于ldap认证的用户,通常需要自动创建他们的HOME目录,好在pam模块pam_mkhomedir.so解决了这一问题,只要把下面内容添加到/etc/pam.d/system-auth的session部分的第一行即可:
session required pam_mkhomedir.so skel=/etc/skel/ umask=0066
但如果没在sshd_config里启用pam,则通过ssh登录的用户没机会运行这个模块。因此,需要如下设置sshd_config:
UsePAM yes
开启日志
LDAP服务器需要手动添加日志功能。/etc/openldap/slapd.conf中末行添加
loglevel 296
local4.* /var/log/ldap.log (說明:local0-7为syslog的facilities,具体的程序应用的facility不一样,每一个facility都有它的数字代码,由这些代码加上错误信息的程度syslog可以判断出信息的优先权。就上例来说,local7的代码为23,notice的代码为5,那么local7.notice的信息优先权为:23*8+5=189。这是/var/adm/messages.T3是信息的优先仅。具体可以查RFC3164。我自己认为设定local7而不用local5是由应用程序决定的。)
这是一个比较详细的日志级别。同时在/etc/syslog.conf中添加local4.* /var/log/ldap.log 确定LDAP服务器的日志位置。
用如下命令使日志功能生效:
service syslog restart