翻译自How to Configure OpenLDAP server in Red Hat Enterprise Linux 7 using cn=config method ?

环境

  • CentOS 7
  • openldap-2.4

问题

  • 使用slapd工具在CentOS上安装与配置OpenLDAP Server
  • 使用olc方式如何配置OpenLDAP Server

操作

  1. 安装openldap包
    1
    yum install -y openldap openldap-clients openldap-servers
    LDAP默认的配置目录是/etc/openldap/slapd.d
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@rhel7 ~]# cd /etc/openldap/slapd.d/
    [root@rhel7 slapd.d]# ls -l
    drwxr-x---. 4 ldap ldap 4096 Aug 3 22:49 cn=config
    -rw-------. 1 ldap ldap 589 Aug 2 23:39 cn=config.ldif
    [root@rhel7 slapd.d]# cd cn\=config
    [root@rhel7 cn=config]# ls -l
    drwxr-x---. 2 ldap ldap 4096 Aug 3 22:11 cn=schema
    -rw-------. 1 ldap ldap 378 Aug 2 22:21 cn=schema.ldif
    -rw-------. 1 ldap ldap 552 Aug 3 20:42 olcDatabase={0}config.ldif
    -rw-------. 1 ldap ldap 443 Aug 2 22:21 olcDatabase={-1}frontend.ldif
    -rw-------. 1 ldap ldap 562 Aug 2 22:21 olcDatabase={1}monitor.ldif
    drwxr-x---. 2 ldap ldap 65 Aug 3 22:53 olcDatabase={2}hdb.ldif
  2. 设置olcSuffix,设置domain。只需要更新下文件olcDatabase={2}hdb.ldif中的olcSuffix
    1
    2
    [root@rhel7 cn=config]# vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
    olcSuffix: dc=example,dc=com
  3. 推荐先创建一个专用的具有所有权限的账号,用它来更新LDAP的数据库。需要更新文件olcDatabase={2}hdb.ldif中的olcRootDN和olcRootPW
    1
    2
    3
    [root@rhel7 cn=config]# vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
    olcRootDN: cn=Manager,dc=example,dc=com
    olcRootPW: redhat
  4. 同时设置config数据库的管理员账号
    这里设置的密码很简单,请在生产环境下将密码设置复杂些
    1
    2
    3
    [root@rhel7 cn=config]# vi olcDatabase\=\{0\}config.ldif
    olcRootDN: cn=config
    olcRootPW: secret
  5. 使用slaptest命令去验证配置
    1
    2
    [root@rhel7 cn=config]# slaptest -u
    config file testing succeeded
    如果报ldif_read_file: checksum error这样的错误,是因为计算文件的CRC32码来自动校验(文件中前两行中带有校验码),需要更新校验码
  • 删除掉报错的文件的前两行
    1
    2
    # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
    # CRC32 3e515b74
  • 安装crc32工具(perl-Archive-Zip)
    1
    [root@rhel7 cn=config]# yum install perl-Archive-Zip -y
  • 计算新文件的CRC32码
    1
    2
    [root@rhel7 cn=config]# crc32 <(cat olcDatabase\=\{2\}hdb.ldif)
    509f92c7
  • 将计算的CRC32码更新到文件中,添加到文件的前两行
    1
    2
    # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
    # CRC32 509f92c7
  1. 如果配置验证成功,启动openldap server
    1
    $ systemctl start slapd
  2. 创建ldap server的基础结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cat base.ldif
    dn: dc=example,dc=com
    objectClass: dcObject
    objectClass: organization
    o: example.com

    dn: ou=users,dc=example,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: users

    dn: ou=groups,dc=example,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: groups
  3. 使用ldapadd命令向LDAP目录导入基础结构
    1
    2
    3
    4
    $ ldapadd -x -D "cn=Manager,dc=example,dc=com" -w redhat -f base.ldif
    adding new entry "dc=example,dc=com"
    adding new entry "ou=users,dc=example,dc=com"
    adding new entry "ou=groups,dc=example,dc=com"
  4. 使用ldapsearch命令验证基础结构是否成功导入
    1
    $ ldapsearch -x -D 'cn=Manager,dc=example,dc=com' -b dc=example,dc=com -w redhat
  5. 在向ldap结构中添加users和groups之前,先使用ldapadd导入schema,以免出现“object class not defined”的报错
    1
    2
    3
    $ ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/cosine.ldif 
    $ ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/nis.ldif
    $ ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/inetorgperson.ldif
  6. 向ldap结构中添加users和groups
  • Users
    • 使用slappasswd命令获取需要的密码
      1
      2
      # slappasswd -s test
      {SSHA}5rMM/3f8Ki13IyarGTtwzieoTu7KMgwc
    • 使用ldif文件和上面的hashed密码创建users.ldif
      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
      $ cat users.ldif
      dn: uid=testuser,ou=users,dc=example,dc=com
      uid: testuser
      cn: testuser
      objectClass: shadowAccount
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: posixAccount
      userPassword: {SSHA}5rMM/3f8Ki13IyarGTtwzieoTu7KMgwc
      shadowLastChange: 17016
      shadowMin: 0
      shadowMax: 99999
      shadowWarning: 7
      loginShell: /bin/bash
      uidNumber: 1000
      gidNumber: 1000
      homeDirectory: /home/testuser
      sn: testuser
      mail: testuser@example.com

      dn: uid=testuser1,ou=users,dc=example,dc=com
      uid: testuser1
      cn: testuser1
      objectClass: shadowAccount
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: posixAccount
      userPassword: {SSHA}5rMM/3f8Ki13IyarGTtwzieoTu7KMgwc
      shadowLastChange: 17016
      shadowMin: 0
      shadowMax: 99999
      shadowWarning: 7
      loginShell: /bin/bash
      uidNumber: 1001
      gidNumber: 1001
      homeDirectory: /home/testuser1
      sn: testuser1
      mail: testuser1@example.com
  • Groups
    创建groups.ldif
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat groups.ldif
    dn: cn=testuser,ou=groups,dc=example,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: testuser
    userPassword: {crypt}x
    gidNumber: 1000

    dn: cn=testuser1,ou=groups,dc=example,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: testuser1
    userPassword: {crypt}x
    gidNumber: 1001
  1. 使用ldapadd命令添加users和groups
    1
    2
    $ ldapadd -x -D cn=Manager,dc=example,dc=com -f users.ldif -w redhat
    $ ldapadd -x -D cn=Manager,dc=example,dc=com -f groups.ldif -w redhat
  2. 使用ldapsearch命令来验证users和groups创建是否成功
    1
    $ ldapsearch -x -D cn=Manager,dc=example,dc=com -b dc=example,dc=com -w redhat

OpenLDAP的操作

  1. 添加数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     $ cat user3.ldif
    dn: uid=testuser3,ou=users,dc=example,dc=com
    uid: testuser3
    cn: testuser3
    objectClass: shadowAccount
    objectClass: top
    objectClass: person
    objectClass: inetOrgPerson
    objectClass: posixAccount
    userPassword: {SSHA}5rMM/3f8Ki13IyarGTtwzieoTu7KMgwc
    shadowLastChange: 17016
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 1000
    gidNumber: 1000
    homeDirectory: /home/testuser
    sn: testuser3
    mail: testuser@example.com
    $ ldapadd -x -D 'cn=Manager,dc=example,dc=com' -w redhat -f user3.ldif
  2. 查询数据
    1
    2
    $ ldapsearch -x -b 'dc=example,dc=com'
    $ ldapsearch -x -b 'dc=example,dc=com' 'sn=testuser3'
  3. 修改数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 方法一:交互式
    $ ldapmodify -x -D 'cn=Manager,dc=example,dc=com' -w redhat
    dn: uid=testuser3,ou=users,dc=example,dc=com
    changetype: modify
    replace: sn
    sn: Test User 3
    -
    add: description
    description: add attribute

    # 方法二:配置文件式
    $ cat modify.ldif
    dn: uid=testuser3,ou=users,dc=example,dc=com
    changetype: modify
    replace: sn
    sn: Test User 3
    -
    delete: description
    $ ldapmodify -x -D 'cn=Manager,dc=example,dc=com' -w redhat -f modify.ldif
  4. 删除数据
    1
    $ ldapdelete -x -D 'cn=Manager,dc=example,dc=com' -w redhat uid=testuser3,ou=users,dc=example,dc=com
  5. 数据导出
    1
    2
    3
    4
    # 方法一:用查询导出
    $ ldapsearch -x -b 'dc=example,dc=com' > export.ldif
    # 方法二:导出命令
    $ slapcat -l export.ldif

打开OpenLDAP日志

  1. 更新日志级别
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat loglevel.ldif 
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: stats

    $ ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
    $ systemctl restart slapd
  2. 修改rsyslog配置文件
    1
    2
    3
    $ touch /var/log/slapd.log
    $ echo local4.* /var/log/slapd.log >> /etc/rsyslog.conf
    $ systemctl restart rsyslog
  3. 查看openldap日志
    1
    $ tail -f /var/log/slapd.log

容器化部署

1
2
$ docker run --name ldap_core -p 389:389 -p 636:636 --env LDAP_ORGANISATION="example.com" --env LDAP_DOMAIN="example.com" --env LDAP_ADMIN_PASSWORD="redhat" --detach osixia/openldap
$ docker run --name ldap_web -p 80:80 -p 443:443 --link ldap_core:ldap_core --env PHPLDAPADMIN_LDAP_HOSTS=ldap_core --detach osixia/phpldapadmin

同时还有Openshift的openldap容器openshift/openldap-2441-centos7

工具

  1. 浏览ldap目录列表的工具ldapbrowser
  2. LDAPSearch命令参数详情