Openldap安装部署

openldap是ldap协议实现的一个开源软件,也是众多Linux版本中使用的ldap软件,与Windows中的AD一样,属于比较著名而且流行的目录协议软件。

安装openldap,网上大部分文档都是寥寥几笔,认为该软件实在是简单易用,无须大费周章的过多解释,确实在CentOS 5上进行安装时比较顺利的,但是由于操作系统版本的变化以及openldap软件版本的不断升级,反而使openldap的安装变得困难。至少我在安装openldap时大概尝试了3次都是失败,有很多小的细节,真的不得不去小心注意,不然就会导致前功尽弃。

一、安装前的准备

1
2
3
4
5
/etc/init .d /iptables  stop    #关闭iptables
setenforce 0     #禁用selinux
crontab  -e       #添加时间同步定时任务
* /5  * * * *  /usr/sbin/ntpdate   time .nist.gov > /dev/null  2>&1
crontab  -l       #查看添加结果


1
2
3
4
5
6
# 配置yum源
mkdir  -p  /etc/yum .repo.d /bak
mv  /etc/yum .repo.d/*.*  /etc/yum .repo.d /bak
wget -O  /etc/yum .repos.d /CentOS-Base .repo http: //mirrors .aliyun.com /repo/Centos-6 .repo
yum clean all
yum makecache


二、安装openldap等所需要的软件包

1
yum -y  install  openldap openldap-servers openldap-clients openldap-devel

安装之后最好使用/etc/init.d/slapd start测试一下,openldap服务是否能正常启动,如果不能,那么后面的操作就可能会出现问题了。

因为之前使用cobbler自动化安装的CentOS 6.5,精简了大部分的package,所以我尝试了两次,都无法启动slapd,也到官方查了文档,(有可能是sasl和openldap的版本不一致导致),但是因为每次安装都耗费大量的时间,而且还有别的工作进来,所以直接拿CentOS 6.5的光盘重新安装了一个虚拟机,然后一次性成功,所以部署服务的时候不能一味的追求系统的过量精简(当然我只是在测试的虚拟机中采用的精简配置,生产环境的cobbler还是尽量把各种运行库和开发库都安装上的),这一点可能我需要注意了。

三、配置openldap

[root@ldapsrv01 ~]# ll /etc/openldap/ 

drwxr-xr-x. 2 root root 4096 Sep  8 12:37 certs 

-rw-r-----. 1 root ldap  121 May 11 07:32 check_password.conf 

-rw-r--r--. 1 root root  280 May 11 07:32 ldap.conf 

drwxr-xr-x. 2 root root 4096 Sep  8 12:37 schema 

drwx------. 3 ldap ldap 4096 Sep  8 12:46 slapd.d

安装完openldap之后,openldap的配置目录/etc/openldap中的文件基本上就这些。

1
2
3
4
5
cp  /usr/share/openldap-servers/slapd .conf.obsolete  /etc/openldap/slapd .conf
#因为openldap的默认配置文件不存在,所以我们从/usr/share/openldap-servers/下拷贝一份
cd  /etc/openldap/
cp  slapd.conf slapd.conf.bak    #备份一下配置文件  
cp  -a slapd.d slapd.d.bak$( date  +%F)    #备份一下slapd.d目录,里面的文件等下要全部删除

[root@ldapsrv01 openldap]# service slapd start   #尝试启动一下slapd,该操作会在/var/lib/ldap目录下生成数据库文件

Starting slapd:                                            [  OK  ]

[root@ldapsrv01 openldap]# ll

total 40

drwxr-xr-x. 2 root root 4096 Sep  8 12:37 certs

-rw-r-----. 1 root ldap  121 May 11 07:32 check_password.conf

-rw-r--r--. 1 root root  280 May 11 07:32 ldap.conf

drwxr-xr-x. 2 root root 4096 Sep  8 12:37 schema

-rw-r--r--. 1 root root 4635 Sep  8 12:38 slapd.conf

-rw-r--r--. 1 root root 4635 Sep  8 12:38 slapd.conf.bak

drwx------. 3 ldap ldap 4096 Sep  8 12:37 slapd.d

drwx------. 3 ldap ldap 4096 Sep  8 12:37 slapd.d.bak2016-09-08

[root@ldapsrv01 openldap]# rm -rf /etc/openldap/slapd.d/*   #删除原有的配置文件

[root@ldapsrv01 openldap]# slappasswd -s 123456    #生成openldap管理员的密码,稍后添加到slapd.conf文件中

{SSHA}jl5e9Ez5qn30Ur5sD74pXh8uDnRncmQN

[root@ldapsrv01 openldap]# vi slapd.conf  #编辑slapd.conf文件

[root@ldapsrv01 ~]# egrep -v "#|^$" /etc/openldap/slapd.conf

include/etc/openldap/schema/corba.schema

include/etc/openldap/schema/core.schema

include/etc/openldap/schema/cosine.schema

include/etc/openldap/schema/duaconf.schema

include/etc/openldap/schema/dyngroup.schema

include/etc/openldap/schema/inetorgperson.schema

include/etc/openldap/schema/java.schema

include/etc/openldap/schema/misc.schema

include/etc/openldap/schema/nis.schema

include/etc/openldap/schema/openldap.schema

include/etc/openldap/schema/ppolicy.schema

include/etc/openldap/schema/collective.schema

allow bind_v2

pidfile/var/run/openldap/slapd.pid

argsfile/var/run/openldap/slapd.args

TLSCACertificatePath /etc/openldap/certs

TLSCertificateFile "\"OpenLDAP Server\""

TLSCertificateKeyFile /etc/openldap/certs/password

database config

access to *            #数据库授权,这里只做测试使用

        by self write

        by anonymous auth

        by * read

databasebdb

suffix"dc=contoso,dc=com"     #设置域或组织的名称

rootdn"cn=admin,dc=contoso,dc=com"    #管理员账号dn

rootpw                  {SSHA}jl5e9Ez5qn30Ur5sD74pXh8uDnRncmQN   #管理员密码

directory/var/lib/ldap

index objectClass                       eq,pres

index ou,cn,mail,surname,givenname      eq,pres,sub

index uidNumber,gidNumber,loginShell    eq,pres

index uid,memberUid                     eq,pres,sub

index nisMapName,nisMapEntry            eq,pres,sub

loglevel            296   #设置日志级别,记录之日信息方便调试

checkpoint          2048  10   #设置把内存中的数据写回数据文件的操作,此处的设置表示每达到2048KB或10分钟执行一次checkpoint,即写入数据文件的操作

cachesize           1000    #设置ldap可以缓存的记录数

# 其中蓝色的部分是修改的地方,其他都不需要改动

四、配置rsyslog记录ldap日志

[root@ldapsrv01 openldap]# echo "local4.*               /var/log/ldap.log" >>/etc/rsyslog.conf 

[root@ldapsrv01 openldap]# tail -1 /etc/rsyslog.conf 

local4*               /var/log/ldap.log

[root@ldapsrv01 openldap]# service rsyslog restart

Shutting down system logger:                               [  OK  ]

Starting system logger:                                    [  OK  ]

五、测试并启动openldap服务

[root@ldapsrv01 openldap]# ll /var/lib/ldap/

total 980

-rw-r--r--. 1 ldap ldap     2048 Sep  8 12:38 alock

-rw-------. 1 ldap ldap    24576 Sep  8 12:38 __db.001

-rw-------. 1 ldap ldap   188416 Sep  8 12:38 __db.002

-rw-------. 1 ldap ldap   270336 Sep  8 12:38 __db.003

-rw-------. 1 ldap ldap    98304 Sep  8 12:38 __db.004

-rw-------. 1 ldap ldap   753664 Sep  8 12:38 __db.005

-rw-------. 1 ldap ldap    32768 Sep  8 12:38 __db.006

-rw-------. 1 ldap ldap     8192 Sep  8 12:38 dn2id.bdb

-rw-------. 1 ldap ldap    32768 Sep  8 12:38 id2entry.bdb

-rw-------. 1 ldap ldap 10485760 Sep  8 12:38 log.0000000001

# 这就是生成的数据库文件,如果该目录下为空,则执行/etc/init.d/slapd start会自动生成。

[root@ldapsrv01 openldap]# slaptest -u  #测试配置文件是否正确

config file testing succeeded

[root@ldapsrv01 openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

57d0ed14 bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).

Expect poor performance for suffix "dc=contoso,dc=com".

57d0ed14 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable

config file testing succeeded

# 重新生成/etc/openldap/slapd.d/目录下的文件

[root@ldapsrv01 openldap]# chown -R ldap:ldap /etc/openldap/slapd.d  #将该目录授权给ldap用户

[root@ldapsrv01 openldap]# chmod -R 700 /etc/openldap/slapd.d

[root@ldapsrv01 openldap]# /etc/init.d/slapd restart

Stopping slapd:                                            [FAILED]

Starting slapd:                                            [  OK  ]

[root@ldapsrv01 openldap]# ps -ef|grep ldap

ldap       1754      1  0 12:47 ?        00:00:00 /usr/sbin/slapd -h  ldap:/// ldapi:/// -u ldap

root       1762   1487  0 12:47 pts/0    00:00:00 grep ldap

[root@ldapsrv01 openldap]# lsof -i :389

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

slapd   1754 ldap    7u  IPv4  16168      0t0  TCP *:ldap (LISTEN)

slapd   1754 ldap    8u  IPv6  16169      0t0  TCP *:ldap (LISTEN)

六、执行一个简单查询操作

[root@ldapsrv01 openldap]# ldapsearch -x -b "dc=contoso,dc=com"

# extended LDIF

#

# LDAPv3

# base with scope subtree

# filter: (objectclass=*)

# requesting: ALL

#


# search result

search: 2

result: 32 No such object


# numResponses: 1

返回结果32 No such object,因为我还没有创建任何账号或OU,下一篇进行数据的导入。


好吧,总结一下,还是用一个shell脚本来完成自动安装的任务。(这个脚本用了大概小一天的时间,还是有些不太满意的地方,时间关系,也只能以后回头完善了,Mark。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/bin/bash
#############################################################
#Description: Openldap install script for CentOS 6.x        #
#Tips: You will asked to input a valid domain name and set  #
#      password for the administrator in your domain.       #
#Usage: bash openldap_install.sh                            #
#Author: Jerry Zhao                                         #
#Date: 2016-09-09 14:19:49 Friday                           #
#############################################################
openldap_install(){
      #检查openldap是否已经安装
      ps  -ef| grep  slapd | grep  - v  grep  > /dev/null 
  [ $? - eq  0 ] &&  echo  "Service slapd is running, exit now."  &&  exit 
  [ -x  /etc/init .d /slapd  ] &&  echo  "Openldap was installed on this server, nothing will do."  &&  exit 
      
      #准备操作
      [ -d  /etc/openldap  ] &&  rm  -rf  /etc/openldap/ *
  [ -d  /var/lib/ldap  ] &&  rm  -rf  /var/lib/ldap/ *
      echo  "*/5 * * * * /usr/sbin/ntpdate  time.nist.gov >/dev/null 2>&1"  >> /var/spool/cron/root 
       
  
      #配置yum源
  mkdir  -p  /etc/yum .repo.d /bak_ $( date  +%F) 
      mv  /etc/yum .repo.d/*.*  /etc/yum .repo.d /bak_ $( date  +%F) 2> /dev/null
      wget -q -O  /etc/yum .repos.d /CentOS-Base .repo http: //mirrors .aliyun.com /repo/Centos-6 .repo 
      yum clean all > /dev/null
      yum makecache > /dev/null 
  
  
  #安装openldap软件包
  yum -y  install  openldap openldap-servers openldap-clients openldap-devel 1> /dev/null  2> /dev/null 
      [ $? - ne  0 ] &&  echo  "Install openldap package failed."  &&  exit  1 ||  echo  "Install openldap package successful."
  
  
  #生成slapd.conf和DB_CONFIG文件
      if  [ -d  /etc/openldap  ]; then
      [ ! -f  /usr/share/openldap-servers/slapd .conf.obsolete ] &&  echo  "Can't find file /usr/share/openldap-servers/slapd.conf.obsolete."  &&  exit  1 ||  cp  /usr/share/openldap-servers/slapd .conf.obsolete  /etc/openldap/slapd .conf
  cp  /usr/share/openldap-servers/DB_CONFIG .example  /var/lib/ldap/DB_CONFIG
  chown  ldap:ldap  /var/lib/ldap/DB_CONFIG
      cp  -a  /etc/openldap/slapd .d  /etc/openldap/slapd .d.bak$( date  +%F)
      else
          echo  -e  "Directory [/etc/openldap] didn't found."
          exit  1
      fi 
  
  
      #检测slapd能否正常启动
  /etc/init .d /slapd  start > /dev/null 
  [ $? - ne  0 ] &&  echo  "Service slapd start failed, please check your system."  &&  exit  1 ||  echo  "Service slapd start successful."
  rm  -rf  /etc/openldap/slapd .d/*
  
   
  #编辑slapd.conf文件     
  while  "$PassWord"  ==  ""  ]; do 
  read  -p  "Please input the password for the administrator in your domain:"  PassWord 
  done
  slappasswd -s $PassWord | sed  -s  's/^/rootpw                /g'  >> /etc/openldap/slapd .conf 
  
  sed  -i  '/^checkpoint/s/^/#/'  /etc/openldap/slapd .conf 
      sed  -i  's/Manager/admin/g'  /etc/openldap/slapd .conf
      sed  -i  "s/dc=my-domain,dc=com/$DomainCN/g" /etc/openldap/slapd .conf
      echo  -e  "# add some settings on $(date +%F)\nloglevel         296\ncheckpoint       2048  10\ncachesize        1000\n"  >> /etc/openldap/slapd .conf
  
  
  #配置rsyslog记录ldap日志
  [ -f  /etc/rsyslog .conf ] &&  cp  /etc/rsyslog .conf  /etc/rsyslog .conf.bak$( date  +%F)
  echo  'local4.*             /var/log/ldap.log'  >> /etc/rsyslog .conf
  /etc/init .d /rsyslog  restart > /dev/null 
  [ $? - ne  0 ] &&  echo  "Change settings of rsyslog failed."  &&  exit  1 ||  echo  "Change settings of rsyslog successful."
  
  
  #启动slapd服务
  slaptest -f  /etc/openldap/slapd .conf -F  /etc/openldap/slapd .d  > /dev/null
  [ $? - ne  0 ] &&  echo  "Slaptest with configure file failed."  &&  exit  1 ||  echo  "Slaptest with configure file successful."
  chown  -R ldap:ldap  /etc/openldap/slapd .d 
      chmod  -R 700  /etc/openldap/slapd .d
  chkconfig slapd on 
  /etc/init .d /slapd  restart > /dev/null 
  lsof  -i :389 > /dev/null
  [ $? - ne  0 ] &&  echo  "Start slapd service failed."  &&  exit  1 ||  echo  "Start slapd service successful."  &&  exit  0
}
while  true do
      read  -p  "Please input your domain name:"   DomainName 
  #检测用户输入的域名格式,如果为空则重新输入
      if  "$DomainName"  !=  ""  ]; then
      PotNum=` echo  $DomainName | awk  - v  RS=.  'END{print --NR}' `
  #检测用户输入的域名格式,只能有1个或2个".",子域名的形式暂不考虑
  case  $PotNum  in 
                  1|2)
      DomainKey1=` echo  $DomainName | awk  -F "."  '{print $1}' `
  DomainKey2=` echo  $DomainName | awk  -F "."  '{print $NF}' `
  #检测用户输入的域名格式,其中域名不能以.号开头和结尾,其实域名应该
  #也不能以数字结尾,域名中只能包含-而不能包含其他特殊字符,但是这里的
  #判断实在是不能尽善,所以只能简单的作了判断,留待以后再做改善
  if  [[ -n $DomainKey1  &&  -n $DomainKey2 ]] ; then
  
                          DomainCN=` echo  $DomainName | sed  's/\./,/g' | sed  's/^/dc=/g' | sed  's/,/,dc=/g' `
          openldap_install
  else 
      echo  "Invalid domain name, the correct format should be like: a.com, a.com.cn,etc."
  fi
              ;;
              *)
                  echo  "Invalid domain name, the correct format should be like: a.com, a.com.cn,etc."
              ;;
          esac  
      else 
      echo  -e  "DomainName can not be empty, please input again."
      fi 
done




本文转自 jerry1111111 51CTO博客,原文链接:http://blog.51cto.com/jerry12356/1850799,如需转载请自行联系原作者

你可能感兴趣的:(数据库,ldap,运维)