- 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目录中配置。
安装所需软件包
1 2 |
yum install openldap-servers migrationtools
|
========================================================================================== 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
配置文件
- 删除配置目录
如果使用配置文件,需删除或改名配置目录(启动脚本优先使用目录下的配置)。
1 |
rm -rf /etc/openldap/slapd .d/ |
- 创建配置文件
1 |
cp -a /usr/share/openldap-servers/slapd .conf.obsolete /etc/openldap/slapd .conf |
- 修改配置
设置domain(dc=gdu,dc=me)、admin密码、密钥文件路径信息(注意:有的站点说配置项与配置内容间必须用TAB分隔,我没测试过)。
domain修改修改
- 直接替换
1
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密码、密钥文件路径(后续生成)
1 2 3 4 5 |
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修改
1 |
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
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启动参数
1
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 []: [email protected]
启动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
配置base domain
LDAP已经运行起来,但还没有任何用户(People)、组(Group),我们将在后续添加,现在我们需要设置base、证书和组文件。
这是使用迁移本地用户的方式来完成:转换成LDIF文件用于导入LDAP。
我们面要建立base.ldif模板,给我们的目录(gdu.me)定义基本结构。
- 建立base.ldif
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
12
3
4
5
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工具
1
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文件。
1 |
/usr/share/migrationtools/migrate_passwd .pl /etc/passwd people.ldif |
编辑people.ldif文件,删除不需要导入的用户信息(如:mysql,nobody等等)。
- Groups (Group)
生成已有组ldif文件。
1 |
/usr/share/migrationtools/migrate_group .pl /etc/group group.ldif |
编辑group.ldif文件,删除不需导入的组信息(似乎保留root,wheel,users就可了)。
- 导入ldif文件
12
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数据库
12
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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cat > yuanxing.ldif <<EOF
|
UserPassword可用下面的命令生成加密串:
1 2 |
slappasswd -c crypt -s 111111
|
- Group
创建username.ldif文件(如yuanxing-group.ldif):
1 2 3 4 5 6 7 8 |
cat > yuanxing-group.ldif <<EOF
|
- 导入LDAP
12
3
4
5
6
7
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
- 安装软件包
1
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 │ └─────────────────────────────────────────────────────────────────┘
1
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查询
12
3
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash
|
自动创建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