OpenLDAP配置记录

概述

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
  1. 安装软件包
  2. 配置LDAP Server域信息
  3. 配置LDAP Server加密(TLS)认证
  4. 启动LDAP Server、测试
  5. 通过迁移工具导入本地用户
  6. 增加用户和组(ldif文件)
  7. 客户端LDAP认证配置

OpenLDAP Server

OpenLDAP 2.3以后版本有两种配置方式:

  1. 配置文件:旧方式,通过/etc/openldap/slapd.conf配置。
  2. 非配置文件:配置存储在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分隔,我没测试过)。

  1. 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
      
  2. 设置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)。

首先配置的两个是基础数据库文件。

数据库缓存

现在已用配置、或非配置文件方式完成了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 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服务

# 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)定义基本结构。

注意:换行符差别可能造成导入失败(从网页复制,换行符会出错)。与migrate_base.pl > base.ldif生成的比较,只有一些换行符差别。

ldapadd: attributeDescription "dn": (possible missing newline after line 8, entry "dc=gdu,dc=m                e"?)

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。

修改以下内容:

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "gdu.me";
 
# Default base 
$DEFAULT_BASE = "dc=gdu,dc=me";

生成已有用户ldif文件。

/usr/share/migrationtools/migrate_passwd.pl /etc/passwd people.ldif

编辑people.ldif文件,删除不需要导入的用户信息(如:mysql,nobody等等)。

生成已有组ldif文件。

/usr/share/migrationtools/migrate_group.pl /etc/group group.ldif

编辑group.ldif文件,删除不需导入的组信息(似乎保留root,wheel,users就可了)。

添加用户和组

创建用户、组ldif文件,导入LDAP。

创建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

创建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服务端运行正常,现在可以配置客户机通过LDAP进行认证。

CentOS/Fedora主机,使用authconfig-gtk或authconfig-tui(authconfig好像可以通过命令行参数完成?),并做如下设置:

将slapdcert.pem文件上传到/etc/openldap/cacerts目录。

配置完成后,会启动nslcd服务进程(nslcd - local LDAP name service daemon)。

如果没有返回信息,或返回错误,请检查配置,重新进行测试。如果检查配置没有错误,可以做如下修改,重新进行测试。 将/etc/sssd/sssd.conf文件中的#enumerate=false,修改为:enumerate=true,这样修改完后,getent就会从LDAP查找账户信息。 并重新执行如下命令: service sssd restart

成功登录后提示无home目录,需后续设置登录时自动创建目录、或通过autofs自动mountNFS目录。

No directory /home/yuanxing!
Logging in with home = "/".

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