一、安装Apache

1.1、安装Apache

Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。 它的名字取自美国印第安人土著语,寓意着拥有高超的作战策略和无穷的耐性,在红帽RHEL5、6、7系统中一直作为着默认的Web服务程序而使用,并且也一直是红帽RHCSA和红帽RHCE的考试重点内容。Apache服务程序可以运行在Linux系统、Unix系统甚至是Windows系统中,支持基于IP、域名及端口号的虚拟主机功能、支持多种HTTP认证方式、集成有代理服务器模块、安全Socket层(SSL)、能够实时监视服务状态与定制日志消息,并有着各类丰富的模块支持。

Centos7 在安装部署过程中,如果选择了web服务器,是会自动安装Apache的,如果没有选择安装web服务器模式,则需要手动安装。

查看Apache软件源

yum list | grep httpd

过程如下:

安装Apache

yum install httpd -y

过程如下:

启动Apache

systemctl start httpd

开启启动Apache

systemctl enable httpd

过程如下:

1.2、Apache安装目录信息

服务目录/etc/httpd
主配置文件/etc/httpd/conf/httpd.conf
网站数据目录/var/www/html
访问日志/var/log/httpd/access_log
错误日志/var/log/httpd/error_log

1.3、配置Apache

在httpd服务程序主配置文件中最为常用的参数包括有:

ServerRoot服务目录
ServerAdmin管理员邮箱
User运行服务的用户
Group运行服务的用户组
ServerName网站服务器的域名
DocumentRoot网站数据目录
Listen监听的IP地址与端口号
DirectoryIndex默认的索引页页面
ErrorLog错误日志文件
CustomLog访问日志文件
Timeout网页超时时间,默认为300秒.
Include需要加载的其他文件

1.3.1、将“全局服务器名称”设置为“禁止语法警告”

1.3.2、调整防火墙以允许Web流量

  1. 打开HTTP和HTTPS端口80和443

    firewall-cmd --permanent --zone=public --add-service=http
    firewall-cmd --permanent --zone=public --add-service=https
    

    过程如下:

  2. 关闭防火墙(选择使用)

    systemctl disable firewall
    systemctl stop firewall
    
  3. 暂时关闭selinux(选择使用)
    setenforce 0
    
  4. 访问Apache
    开放防火墙后就可以尝试登陆Apache服务器
    登陆 http://192.168.0.2/
    
    界面如下:

1.4、Apache命令

重载配置

systemctl reload httpd

启动命令

/etc/init.d/httpd start
或
systemctl start httpd

停止命令

/etc/init.d/httpd stop
或
systemctl stop httpd

重启命令

/etc/init.d/httpd restart
或
systemctl restart httpd

查看版本

httpd -v

二、安装PHP开发环境

2.1、安装PHP

yum -y install php php-peer

过程如下:

2.2、配置PHP

2.2.1、配置index.html

修改Apache在请求目录时提供文件的方式。Apache将首先从寻找一个名为index.html文件改为寻找index.php文件。

vim /etc/httpd/conf/httpd.conf

过程如下:

<IfModule dir_module>
    DirectoryIndex index.html index.php index.html.var
</IfModule>

修改为

<IfModule dir_module>
    DirectoryIndex index.php index.html index.html.var
</IfModule>

重启Apache

2.3、安装PHP增强模块

2.3.1、查看PHP功能增强列表

 yum search php- | less

过程如下:

2.3.2、安装增强功能

经过筛选,选择安装php-ldap、php-mbstring

yum install php-ldap php-mbstring

过程如下:

2.3.3、编辑PHP配置

编辑PHP主配置文件,配置时间区域,命令如下

vim /etc/php.ini

php配置文件使用";" 注释,在全文搜索 date.timezone字符串,进行如下修改,并将“;”号去掉即可,过程如下:

修改为

保存,并重启httpd服务

service httpd restart

2.4、测试PHP服务

2.4.1、添加测试文件

/var/www/html下新建一个info.php文件,用于测试PHP是否配置成功
过程如下:

2.4.2、测试服务状态

在浏览器中输入服务器IP即可,如下图:

三、安装Kerberos

3.1、清理环境

0.1 停止服务

service krb5kdc stop
service kadmin stop

0.2 卸载程序

yum remove -y krb5-devel, krb5-workstation, krb5-server, krb5-server-ldap

yum install krb5-server-ldap -y

3.2、 安装kerberos

yum install krb5-server-ldap -y

通过安装krb5-server-ldap可以把其他依赖的软件包安装完成

过程如下:

【注意】:安装好kerberos后不要急于配置,先安装配置LDAP后在配置kerberos会比较好

3.3、安装cyrus-sasl

执行命令:

yum install cyrus-sasl-gssapi cyrus-sasl-plain cyrus-sasl cyrus-sasl-scram cyrus-sasl-lib cyrus-sasl-md5

【注意】:不要安装cyrus-sasl-ldap,否则ldap启动会出错

执行过程:

四、安装openLDAP

4.1、卸载OpenLDAP

0.1 停止服务

service slapd stop

0.2 卸载程序

yum remove -y openldap-servers openldap-devel openldap-clients compat-openldap

0.3 备份文件
如果不是第一次安装,有部分文件是需要备份的,否则在第二次安装时,将不会被安装,第二次安装时,需要将下面备份文件进行恢复

mkdir -p /etc/openldap_bak
cp -r /etc/openldap/certs/ /etc/openldap_bak
cp /etc/openldap/ldap.conf /etc/openldap_bak

0.4 删除文件

rm -rf /etc/openldap

4.1.安装openLDAP

执行命令:

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

过程如下:

4.2、查看安装的版本

4.2.1、查看kerberos

rpm -qa krb5-server-ldap

执行过程如下:

4.2.1、查看OpenLDAP

rpm -qa openldap

执行过程如下:

4.3、打开防火墙上的LDAP端口

LDAP服务器已配置并运行。 打开防火墙上的LDAP端口,以便外部客户端可以连接:

systemctl disable firewall
systemctl stop firewall

4.4、测试LDAP连接

测试与ldapwhoami的LDAP连接,该连接应该返回我们连接的用户名:

ldapwhoami -H ldap:// -x

4.5、检查安装状态

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn

过程如下:

内容说明:

cn=config全局配置
cn=module{0},cn=config一个动态加载的模块
cn=schema,cn=config包含硬编码的系统级模式
cn={0}core,cn=schema,cn=config硬编码内核模式
cn={1}cosine,cn=schema,cn=configcosine 模式
cn={2}nis,cn=schema,cn=confignis 模式
cn={3}inetorgperson,cn=schema,cn=configinetorgperson模式
olcBackend={0}mdb,cn=config后端,mdb存储数据库
olcDatabase={-1}frontend,cn=config前端数据库,默认设置为其他数据库
olcDatabase={0}config,cn=configslapd配置数据库(cn = config)
olcDatabase={1}mdb,cn=config你的数据库实例 (dc=example,dc=com)

4.6、LDAP操作(知识点,非环境搭建内容)

此时LDAP只有cn=admin,dc=example,dc=com这个用户存在(第五章节会说明),此时LDAP还没有真正能够进行使用,只是一个空的平台。所以需要进行节点、用户存储、组存储、用户等信息的创建。
该章节会针对这些进行相关说明,该内容是知识点,不是部署重要环节,如果只是部署环境,可以跳过该章节,在“第六章”会做部署整合相关的内容说明。

4.6.1、变更数据库

为了LDAP能够真正使用,还需要创建以下内容:

1用户节点People一个存储用户信息的节点,用户信息都会存储在该节点,例如:han
2组节点Groups一个存储组信息的节点,组信息都会存储在该节点,例如:LDAPGroup
3LDAPGroup创建一个LDAP的用户组
4用户han创建一个属于LDAPGroup组的用户

操作过程如下:

  • 创建一个LDIF文件,该文件用于创建上面表单中的内容,文件可以叫ldap_init.ldif

  • ldap_init.ldif文件中添加以下内容

    dn: ou=people,dc=example,dc=com
    objectClass: organizationalUnit
    ou: people
    
    dn: ou=Groups,dc=example,dc=com
    objectClass: organizationalUnit
    ou: Groups
    
    dn: cn=LDAPGroup,ou=Groups,dc=example,dc=com
    objectClass: posixGroup
    cn: LDAPGroup
    gidNumber: 5000
    
    dn: uid=han,ou=people,dc=example,dc=com
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: shadowAccount
    uid: han
    sn: zhiwei
    givenName: Han
    cn: Han ZhiWei
    displayName: Han ZhiWei
    uidNumber: 10000
    gidNumber: 5000
    userPassword: hanzhiwei
    gecos: Han ZhiWei
    loginShell: /bin/bash
    homeDirectory: /home/ldap/han
    
    【注意】:文件中的uidNumbergidNumber这2个值不能和系统中的已经存在的值冲突,所以最好采用高数值来进行区分。
    相关的值可以在/etc/passwd/etc/group文件中进行查询
  • 将用户信息加入到LDAP中
    ldapadd -x -D cn=admin,dc=example,dc=com -W -f ldap_init.ldif
    
    过程如下:

4.6.2、检查节点、组、用户是否添加正确

ldapsearch -x -LLL -b dc=example,dc=com 'uid=han' cn gidNumber

过程如下:

指令说明:

-x“简单”绑定; 不会使用默认的SASL方法
-LLL禁用打印无关信息
uid=han用于查找han用户的“过滤器”
cn gidNumber请求显示某些属性(默认为显示所有属性)

4.6.3、增加支持的模式(add schema)

默认情况下安装完LDAP是只支持 cosine、nis、inetorgperson 这3种模式,如果要新增就需要自行添加,例如:本文所要涉及的kerberos。

由于后续第6章节,需要讲述kerberos和LDAP的整合,其中会涉及到在LDAP中增加kerberos模式,所以此处就不再赘述。相关知识点,请直接查看6.1、LDAP增加kerberos模式(schema)章节

五、安装和配置phpLDAPadmin Web界面

5.1、下载安装phpLDAPadmin

5.1.1、下载phpLDAPadmin

http://sourceforge.net/projects/phpldapadmin/files/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.zip/download

5.1.2、安装phpLDAPadmin

将下载的phpldapadmin-1.2.3.zip上传到服务器,执行以下命令

unzip phpldapadmin-1.2.3.zip
mv phpldapadmin-1.2.3 /var/www/html/phpldapadmin

5.2、配置phpLDAPadmin

安装phpLDAPadmin应用程序,启用必要的Apache配置,并重新加载Apache。
Web服务器配置为提供应用程序,需要进行一些更改。 需要将phpLDAPadmin配置为使用的域,而不是自动填充LDAP登录信息。
需要修改/etc/phpldapadmin/config.php配置文件

cd /var/www/html/phpldapadmin
cp config.php.example config.php.example.bak
mv config.php.example config.php
vim /var/www/html/phpldapadmin/config/config.php
  1. 配置LDAP服务器--标识

  2. 配置LDAP服务器--IP

  3. 配置LDAP服务器--域名
    【注意】:
    该配置告诉phpLDAPadmin LDAP层次结构的根目录,这是基于重新配置slapd包时输入的值。
    前面slapd配置是example,因此在这里配置example.com
    需要将每个域组件(不是一个点)放入dc= notation中将其转换为LDAP语法
  4. 配置LDAP服务器--端口
    默认是不配置的,只需将去掉注释即可

  5. 配置LDAP服务器--其他服务器
    【注意】:
    如果只是本机使用LDAP,不使用其他服务器的话,请注释下面配置。
    到文件最后部分,找到下面内容,其后的所有参数均注释掉。

     **************************************************************************
     * If you want to configure additional LDAP servers, do so below.         *
     * Remove the commented lines and use this section as a template for all  *
     * your other LDAP servers.                                               *
     **************************************************************************
    

    注释内容如下:

    /*
    $servers->newServer('ldap_pla');
    $servers->setValue('server','name','LDAP Server');
    $servers->setValue('server','host','192.168.0.2');
    $servers->setValue('server','port',389);
    $servers->setValue('server','base',array('dc=example,dc=com'));
    $servers->setValue('login','auth_type','cookie');
    $servers->setValue('login','bind_id','');
    $servers->setValue('login','bind_pass','');
    $servers->setValue('server','tls',false);
    
    # SASL auth
    $servers->setValue('login','auth_type','sasl');
    $servers->setValue('sasl','mech','GSSAPI');
    $servers->setValue('sasl','realm','EXAMPLE.COM');
    $servers->setValue('sasl','authz_id',null);
    $servers->setValue('sasl','authz_id_regex','/^uid=([^,]+)(.+)/i');
    $servers->setValue('sasl','authz_id_replacement','$1');
    $servers->setValue('sasl','props',null);
    
    $servers->setValue('appearance','password_hash','md5');
    $servers->setValue('login','attr','dn');
    $servers->setValue('login','fallback_dn',false);
    $servers->setValue('login','class',null);
    $servers->setValue('server','read_only',false);
    $servers->setValue('appearance','show_create',true);
    
    $servers->setValue('auto_number','enable',true);
    $servers->setValue('auto_number','mechanism','search');
    $servers->setValue('auto_number','search_base',null);
    $servers->setValue('auto_number','min',array('uidNumber'=>1000,'gidNumber'=>500));
    $servers->setValue('auto_number','dn',null);
    $servers->setValue('auto_number','pass',null);
    
    $servers->setValue('login','anon_bind',true);
    $servers->setValue('custom','pages_prefix','custom_');
    $servers->setValue('unique','attrs',array('mail','uid','uidNumber'));
    $servers->setValue('unique','dn',null);
    $servers->setValue('unique','pass',null);
    
    $servers->setValue('server','visible',true);
    $servers->setValue('login','timeout',30);
    $servers->setValue('server','branch_rename',false);
    $servers->setValue('server','custom_sys_attrs',array('passwordExpirationTime','passwordAllowChangeTime'));
    $servers->setValue('server','custom_attrs',array('nsRoleDN','nsRole','nsAccountLock'));
    $servers->setValue('server','force_may',array('uidNumber','gidNumber','sambaSID'));
    */
    

5.3、登陆phpLDAPadmin

此时phpldapadmin可以访问但可能不能登录,这个和系统SELinux有关,如果SELinux关闭的话登录时候会有一个错误:

error Unable to connect to LDAP server Cloud-Lab.Com
error: Can't contact LDAP server (-1) for user
error Failed to Authenticate to server

Invalid Username or Password.

打开下面配置即可,操作过程如下:

在登录前,必须保证用户电脑和LDAP服务器同属于一个域当中,并配置hosts文件。
例子:以中兴环境为例

LDAP服务器192.168.0.2
用户电脑10.47.101.24
网关10.47.101.1

登陆地址如下:

http://duke.com/phpldapadmin

如果没有配置hosts文件,也可以直接使用IP地址进行登录:

http://192.168.0.2/phpldapadmin

登陆页面如下:

用户登录:
点击页面左侧登录按钮后,页面如下:

登录DN是您将要使用的用户名。
包含:帐户名称作为cn=部分,服务器选择的域名分为dc=部分,在安装过程中设置的默认管理员帐户称为admin ,因此在我们的示例中,我们将键入以下内容:

cn=admin,dc=example,dc=com

设置页面如下:

登录成功后页面如下:

六、kerberos和LDAP整合配置

6.1、配置LDAP的HDB库

rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
【注意】:
1、在2.4以前的版本中,OpenLDAP 使用 slapd.conf 配置文件来进行服务器的配置
2、2.4开始则使用 slapd.d 目录保存细分后的各种配置,其数据存储位置即目录 /etc/openldap/slapd.d
3、尽管数据文件是透明格式的,还是建议使用 ldapadd, ldapdelete, ldapmodify 等命令来修改,而不是直接编辑。

6.2、LDAP增加kerberos模式(schema)

存在2中添加方式

6.2.1、LDAP增加kerberos schema文件

解压kerberos.schema.gz,添加到LDAP的schema存储目录

gzip -d /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz
cp /usr/share/doc/krb5-kdc-ldap/kerberos.schema /etc/ldap/schema/

6.2.2、LDAP增加kerberos模式一(该模式是2.4版本后官方推荐方法)

  • 新建一个schema转换文件:kerberos_schema_convert.conf
    vim kerberos_schema_convert.conf
    
  • kerberos_schema_convert.conf文件中添加以下内容:
    include /etc/openldap/schema/core.schema
    include /etc/openldap/schema/collective.schema
    include /etc/openldap/schema/corba.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/kerberos.schema
    
  • 创建一个临时目录来存放LDIF文件
    mkdir -p /home/ldap/tmp
    
  • 使用slapcat来转换schema文件
    slapcat -f kerberos_schema_convert.conf -F /home/ldap/tmp -n0 -s "cn={12}kerberos,cn=schema,cn=config" > /home/ldap/tmp/cn=kerberos.ldif
    
    【注意】:cn={12}kerberos中的{12}
    指的是kerberos_schema_convert.conf文件中“include /etc/openldap/schema/kerberos.schema”信息位置的序号
    并且需要(序号-1),序号是以0为起始位

    过程如下:
  • 编辑生成的/home/ldap/tmp/cn=kerberos.ldif文件,修改其中属性,删除以下不需要的部分,这部分属性可能不会一样,每次生成的value是肯定不一样,根据情况删除
    structuralObjectClass: olcSchemaConfig
    entryUUID: 84374308-66be-1038-8430-576d5315da4e
    creatorsName: cn=config
    createTimestamp: 20181018011141Z
    entryCSN: 20181018011141.878509Z#000000#000#000000
    modifiersName: cn=config
    modifyTimestamp: 20181018011141Z
    
  • 用ldapadd加载新的schema
    ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /home/ldap/tmp/cn=kerberos.ldif
    
  • 查看是否加载成功
    ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
    
    过程如下:

6.2.2、LDAP增加kerberos模式二(该模式是2.4版本前方法,2.4之后版本也可以用)推荐

【注意】:
1、openldap在第一次安装完成后,/etc/openldap/目录会有以下文件

2、如果卸载openLDAP,并删除/etc/openldap/目录下所有内容,在第二次安装时,会少以下内容

3、需要备份certs和ldap.conf的内容,否则会导致openLDAP无法正常启动

6.2.2.1、备份相关文件

mkdir /etc/openldap/bak
cp -r /etc/openldap/certs/ /etc/openldap/bak
cp /etc/openldap/ldap.conf /etc/openldap/bak
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak

6.2.2.2、配置增加kerberos.schema

1、增加kerberos.schema配置文件到openLDAP

cp /usr/share/doc/krb5-server-ldap-1.15.1/kerberos.schema /etc/openldap/schema/

2、配置openLDAP的配置文件

touch /etc/openldap/slapd.conf

cat >> /etc/openldap/slapd.conf <<EOF
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/corba.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
include /etc/openldap/schema/kerberos.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

EOF

3、更新配置

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d

过程如下:

4、修改默认配置
需要注释ldap.conf中的TLS_CACERTDIR /etc/openldap/certs内容

vim /etc/openldap/lapd.conf

过程如下:

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

TLS_CACERTDIR  /etc/openldap/certs

# Turning this off breaks GSSAPI used with krb5 when rdns = false
SASL_NOCANON    on

修改为

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

#TLS_CACERTDIR  /etc/openldap/certs

# Turning this off breaks GSSAPI used with krb5 when rdns = false
SASL_NOCANON    on

5、启动openLDAP

service slapd start

6、检查启动状态

ps aux | grep slapd | grep -v grep
netstat -tunlp  | grep :389

执行过程如下:

6.2.3、启动失败解决方案

1、启动失败问题1
执行过程:

问题在于下面2个关键处

_sasl_plugin_load failed on sasl_canonuser_init for plugin: ldapdb
ldapdb_canonuser_plug_init() failed in sasl_canonuser_add_plugin(): invalid parameter supplied

是由于安装了cyrus-sasl-ldap包,导致,实际过程中是不需要该包的,删除该包即可,命令如下:

rpm -e cyrus-sasl-ldap-2.1.26-23.el7.x86_64

2、启动失败问题2
如果通过journalctl -xe查看到有很多以下内容,则表示权限不对:

tlsmc_get_pin: INFO: Please note the extracted key file will not be protected with a PIN any more, however it will be still protected at least by file per

执行以下操作:

chown -R ldap:ldap /etc/openldap
chown -R ldap:ldap /var/run/openldap
chown -R ldap:ldap /var/lib/ldap

3、启动失败问题3
如果通过slapd -h ldap://127.0.0.1 -d 481查看到有下内容,则表示缺少/etc/openldap/certs目录中的文件,需要将之前备份的certsldap.conf恢复:

TLSMC: MozNSS compatibility interception begins.
tlsmc_intercept_initialization: INFO: entry options follow:
tlsmc_intercept_initialization: INFO: cacertdir = `/etc/openldap/certs'
tlsmc_intercept_initialization: INFO: certfile = `OpenLDAP Server'
tlsmc_intercept_initialization: INFO: keyfile = `/etc/openldap/certs/password'
tlsmc_convert: INFO: trying to open NSS DB with CACertDir = `/etc/openldap/certs'.
tlsmc_open_nssdb: INFO: trying to initialize moznss using security dir `/etc/openldap` prefix `certs`.
tlsmc_open_nssdb: WARN: could not initialize MozNSS context - error -8015.
tlsmc_convert: INFO: cannot open the NSS DB, expecting PEM configuration is present.
tlsmc_intercept_initialization: INFO: altered options follow:
tlsmc_intercept_initialization: INFO: cacertdir = `/etc/openldap'
tlsmc_intercept_initialization: INFO: certfile = `OpenLDAP Server'
tlsmc_intercept_initialization: INFO: keyfile = `/etc/openldap/certs/password'
tlsmc_intercept_initialization: INFO: successfully intercepted TLS initialization. Continuing with OpenSSL only.
TLSMC: MozNSS compatibility interception ends.
TLS: could not use certificate `OpenLDAP Server'.
TLS: error:02001002:system library:fopen:No such file or directory bss_file.c:402
TLS: error:20074002:BIO routines:FILE_CTRL:system lib bss_file.c:404
TLS: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib ssl_rsa.c:468
5bd16a2e main: TLS init def ctx failed: -1
5bd16a2e slapd destroy: freeing system resources.
5bd16a2e slapd stopped.
5bd16a2e connections_destroy: nothing to destroy.

6.3、配置kerberos

6.3.1、设置/etc/krb5.conf文件

vim /etc/krb5.conf

1、设置libdefaults属性
找到[libdefaults]行,进行以下修改

[libdefaults]
        default_realm = EXAMPLE.COM

# The following krb5.conf variables are only for MIT Kerberos.
        krb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

修改为

[libdefaults]
        renew_lifetime = 7d
              forwardable = true
              default_realm = EXAMPLE.COM
              ticket_lifetime = 24h
              dns_lookup_realm = false
              dns_lookup_kdc = false
              default_ccache_name = /tmp/krb5cc_%{uid}

2、设置realms属性
找到[realms]行,进行以下修改

[realms]
        EXAMPLE.COM = {
                kdc = 192.168.0.2
                admin_server = 192.168.0.2
        }

修改为

[realms]
        EXAMPLE.COM = {
                admin_server = 192.168.0.2
                kdc = 192.168.0.2
                max_renewable_life = 30m
                            database_module = openldap_ldapconf
                            supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
        }

3、设置domain_realm属性
找到[domain_realm]行,进行以下修改

[domain_realm]
        .mit.edu = ATHENA.MIT.EDU
        mit.edu = ATHENA.MIT.EDU
        .media.mit.edu = MEDIA-LAB.MIT.EDU
        media.mit.edu = MEDIA-LAB.MIT.EDU
        .csail.mit.edu = CSAIL.MIT.EDU
        csail.mit.edu = CSAIL.MIT.EDU
        .whoi.edu = ATHENA.MIT.EDU
        whoi.edu = ATHENA.MIT.EDU
        .stanford.edu = stanford.edu
        .slac.stanford.edu = SLAC.STANFORD.EDU
        .toronto.edu = UTORONTO.CA
        .utoronto.ca = UTORONTO.CA

修改为

[domain_realm]
        .example.com = EXAMPLE.COM
              example.com = EXAMPLE.COM
              kdc.example.com = EXAMPLE.COM
              client.example.com = EXAMPLE.COM

4、添加以下属性

[logging]
  default = FILE:/home/ldap/log/krb5libs.log
  kdc = FILE:/home/ldap/log/krb5kdc.log
  admin_server = FILE:/home/ldap/log/kadmind.log

[dbdefaults]
  ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com

[dbmodules]
    openldap_ldapconf = {
        db_library = kldap
        ldap_servers = ldapi://
        ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com
        ldap_kdc_dn = cn=root,dc=example,dc=com
        ldap_kadmind_dn = cn=root,dc=example,dc=com
        ldap_service_password_file = /etc/krb5.ldap
        ldap_conns_per_server = 5
    }
【注意】
1、ldap_kdc_dn 对应 Kerberos 访问 LDAP 数据库时的服务帐号,需要有读权限
2、ldap_kadmind_dn 对应 Kerberos 访问 LDAP 数据库时的管理帐号,需要有读写权限
3、此处为了简单方便,统一用cn=root,dc=example,dc=com一个进行管理
4、ldap_kerberos_container_dn 必须以 'cn'开头

6.2.1、设置/var/kerberos/krb5kdc/kdc.conf文件

在默认情况下supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包推荐不使用。所以需要针对aes256-cts进行修改。

vim /var/kerberos/krb5kdc/kdc.conf

将下面内:

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EXAMPLE.COM = {
master_key_type = aes256-cts
  master_key_type = des-hmac-sha1
  default_principal_flags = +preauth
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

注释:master_key_type = aes256-cts
删除:aes256-cts:normal

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EXAMPLE.COM = {
#master_key_type = aes256-cts
  master_key_type = des-hmac-sha1
  default_principal_flags = +preauth
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

6.3、LDAP增加kerberos用户

6.3.1、创建LDAP数据库(用于后续整合)

1、查看相关默认配置
由于安装LDAP时,使用的是HDB数据库,所以在/etc/openldap/slapd.d/cn=config目录查看olcDatabase={2}hdb.ldif文件中的一些相关默认配置

cat /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif

未执行4.6.1、变更数据库)内容如下:

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 e34ca519
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 9d13466a-6c7c-1038-94b9-edef98ed6f69
creatorsName: cn=config
createTimestamp: 20181025083503Z
entryCSN: 20181025083503.782735Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20181025083503Z

未执行4.6.1、变更数据库)其中以下内容是下面步骤所需要的关键:

olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com

执行4.6.1、变更数据库是以下内容)其中以下内容是下面步骤所需要的关键:

olcSuffix: dc=example,dc=com
olcRootDN: uid=admin,ou=people,dc=example,dc=com

需要改为,但是不能直接改此处文件,根据后续步骤进行修改

olcSuffix: dc=example,dc=com
olcRootDN: uid=ldapadmin,ou=people,dc=example,dc=com

olcSuffix: dc=example,dc=com
olcRootDN: uid=admin,ou=people,dc=example,dc=com

2、创建数据库信息
创建数据库信息文件modify.ldif

vim /home/ldap/modify.ldif

文件内容如下:

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: 12345678

dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=example,dc=com" by dn="cn=root,dc=example,dc=com" write by * read

3、载入数据库配置信息

ldapmodify -Y EXTERNAL -H ldapi:/// -f /home/ldap/modify.ldif

过程如下:

在执行过程中报错,密码不能够被配置,配置文件编写不对。修改方法如下:
将modify.ldif文件中的下面内容:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: 12345678

修改为

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: 12345678

再次执行,过程如下:

注明:cn=root,dc=example,dc=com授权,以便整合Kerberos使用

6.3.2、创建数据库数据

数据库配置完成,但是没有数据,需要添加数据。
可以手动编写 ldif 文件来导入一些用户和组。
也可以使用 migrationtools 工具来生成 ldif 模板。
此处采用ldif文件配置方法来新增数据。
1、setup.ldif文件

vim /home/ldap/setup.ldif

添加内容如下:

dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: example com
dc: example

dn: ou=people,dc=example,dc=com
objectclass: organizationalUnit
ou: people
description: Users

dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups

dn: uid=ldapadmin,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 10001
gidNumber: 5000
homeDirectory: /home/ldap/ldapadmin
loginShell: /bin/bash

2、载入数据

ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /home/ldap/setup.ldif

如果执行过程中报以下错误,是因为在按文档操作过程中,已经按照4.6.1章节创建了数据库数据信息,导致部分数据已经存在,所以无法创建成功。没有按照4.6.1章节操作,直接按照本章节操作是可以成功的。

为了解决上面问题,setup.ldif文件修改为以下内容:

dn: ou=people,dc=example,dc=com
objectclass: organizationalUnit
ou: people
description: Users

dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups

dn: uid=ldapadmin,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 10001
gidNumber: 5000
homeDirectory: /home/ldap/ldapadmin
loginShell: /bin/bash

再次执行过程如下:

【注意】:-w 12345678 表示的是设置密码为12345678,此处的密码没有在配置文件中设置,用的是命令输入方式,这样可以避免密码泄露

3、验证数据
http://192.168.0.2/phpldapadmin页面使用uid=ldapadmin,ou=people,dc=example,dc=com用户进行登录,如果登录成功即表示数据库数据添加成功。如下页面:



6.3.3、导入linux系统用户

若要将 /etc/passwd, /etc/shadow, /etc/groups 中生成 ldif 更新 ldap 数据库,就需要用到 migrationtools 工具。
1、安装migrationtools

apt-get install migrationtools

过程如下:

2、修改默认配置
利用迁移工具生成模板,但是需要先修改默认的配置:

vim /usr/share/migrationtools/migrate_common.ph

将下面内容

\# Default DNS domain
$DEFAULT_MAIL_DOMAIN =  "padl.com";

\# Default base
$DEFAULT_BASE =  "dc=padl,dc=com";

修改为

\# Default DNS domain
$DEFAULT_MAIL_DOMAIN =  "example.com";

\# Default base
$DEFAULT_BASE =  "dc=example,dc=com";

3、生成文件模板

/usr/share/migrationtools/migrate_base.pl > /home/ldap/base.ldif

4、导入命令
根据需求更改上面文件内容,然后执行下面语句,即可把linux用户导入到LDAP中

ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /home/ldap/base.ldif

当然你可能会遇到下面错误,这是因为生成的base.ldif文件中,有已经存在于LDAP的用户信息,所以导无法加载成功。

修改方法如下,删除已经存在的用户信息即可,原始内容如下:

dn: dc=example,dc=com
dc: example
objectClass: top
objectClass: domain

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

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

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

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

dn: nisMapName=netgroup.byuser,dc=example,dc=com
nismapname: netgroup.byuser
objectClass: top
objectClass: nisMap

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

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

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

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

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

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

dn: nisMapName=netgroup.byhost,dc=example,dc=com
nismapname: netgroup.byhost
objectClass: top
objectClass: nisMap

修改为

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

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

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

dn: nisMapName=netgroup.byuser,dc=example,dc=com
nismapname: netgroup.byuser
objectClass: top
objectClass: nisMap

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

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

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

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

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

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

dn: nisMapName=netgroup.byhost,dc=example,dc=com
nismapname: netgroup.byhost
objectClass: top
objectClass: nisMap

执行过程如下:

导入后页面展示结果如下:

5、导入指定的用户
可以进行批量导入用户,也可以指定导入用户,操作如下:
①、创建系统用户test并设置密码为test

useradd test

②、查看用户是否创建成功,并导入到指定文件

grep -E "test" /etc/passwd >/home/ldap/test_userinfo.txt

③、转换test信息为ldif文件

/usr/share/migrationtools/migrate_passwd.pl /home/ldap/test_userinfo.txt /home/ldap/test_userinfo.ldif

④、导入系统

ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /home/ldap/test_userinfo.ldif

过程如下:

⑤、将用户组导入到指定文件

grep -E "test" /etc/group >/home/ldap/test_groupinfo.txt

⑥、转换组信息为ldif文件

/usr/share/migrationtools/migrate_group.pl /home/ldap/test_groupinfo.txt /home/ldap/test_groupinfo.ldif

⑦、导入到系统

ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /home/ldap/test_groupinfo.ldif

过程如下:

6.3.4、LDAP操作指令(知识点,配合6.3.2章节新建的test用户操作

1、查询
查询新添加的 test 用户:

ldapsearch -LLL -x -D 'uid=ldapadmin,ou=people,dc=example,dc=com' -w 12345678 -b 'dc=example,dc=com' 'uid=test'

过程如下:

2、修改
用户添加好以后,需要给其设定初始密码,运行命令如下:

ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=example,dc=com' -w 12345678 "uid=test,ou=people,dc=example,dc=com" -S

过程如下:

页面查看如下:



使用test用户登录页面查看如下:
登录密码是12345678

3、删除知识点
不要执行删除test用户,第7章节会用到
删除用户:

ldapdelete -x -w 12345678 -D'uid=ldapadmin,ou=people,dc=example,dc=com' "uid=test,ou=people,dc=example,dc=com"

删除用户组:

ldapdelete -x -w 12345678 -D'uid=ldapadmin,ou=people,dc=example,dc=com' "cn=test,ou=group,dc=example,dc=com"

6.3.5、创建kerberos用户

1、新建user.ldif文件

vim /home/ldap/user.ldif

该文件用户ldap配置kerberos所要用到的用户信息,文件内容如下:

dn: cn=kerberos,dc=example,dc=com
cn: kerberos
objectClass: organizationalRole

dn: cn=root,dc=example,dc=com
cn: root
userPassword:: e1NTSEF9dnJmZXBqQ0lmUHowL1ppL0ZRU2s2RlI3R3VyTWRZeFUK
objectClass: simpleSecurityObject
objectClass: organizationalRole
【注意】:
上面userPassword:: e1NTSEF9dnJmZXBqQ0lmUHowL1ppL0ZRU2s2RlI3R3VyTWRZeFUK 中的密码生成是通过下面指令获得
1、-s后面的是密码
2、| base64后面的是密码编码格式
3、不同机器上的密码必须重新生成一次
4、每次加密密码只能使用一次
slappasswd -s 12345678 | base64

执行过程如下

2、载入用户信息

ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /home/ldap/user.ldif

执行过程如下:

3、管理员修改普通用户的密码
cn=root,dc=example,dc=com用户密码修改为:root

ldappasswd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 "cn=root,dc=example,dc=com" -s root

6.3.5、生成kerberos访问ldap的服务密码文件

因为Kerberos 需要有 ldap_kdc_dnldap_kadmind_dn密码才能访问 LDAP数据库,执行以下命令:

kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com -w 12345678 stashsrvpw -f /etc/krb5.ldap cn=root,dc=example,dc=com
cat /etc/krb5.ldap

过程如下:

6.3.6、创建kerberos数据库

 kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com -w 12345678 -H ldapi:// create -r EXAMPLE.COM -s

过程如下

6.3.7、重启Kerberos

service krb5-kdc restart
service krb5-admin-server restart

6.3.8、测试kerberos和ldap是否整合成功(非必要操作,可以不做

1、添加用户

kadmin.local

添加一个test用户
过程如下:

2、检查是否添加成功

slapcat |grep "test"

过程如下:

3、检查ldap页面是否添加成功

4、删除用户
此处不删除,会影响后面章节操作
过程如下:

7、Kerberos+LDAP认证整合

确保Kerberos和LDAP已经配置,即完成前6章的内容

7.1、采用该 LDAP作为用户认证。

1、先按照6.3.3章节第5小点进行操作,添加test用户

2、只需要对用户 uid=test,ou=people,dc=example,dc=com 添加 userPassword成员即可。
如果通过 命令行添加,需要先准备test.ldif文件(userPassword对应的密码为12345678),内容如下:

dn: uid=test,ou=people,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword:: e1NTSEF9ZmtrZzNrOUUrY08rTS9CejFza0FhVk9TV3dZVlZ6akkK

然后执行命令

ldapmodify -x -D 'cn=root,dc=example,dc=com' -w root -h 192.168.0.2 -f /home/ldap/test.ldif

执行过程如下:

3、确认是否成功

ldapsearch -x -D 'uid=test,ou=people,dc=example,dc=com' -w 123456 192.168.0.2 -b 'ou=people,dc=example,dc=com'

执行过程如下

7.2、使用 Kerberos 认证。

需要将用户的密码域做如下修改:

1、userPassword 对应的密码生成:

echo -n "{SASL}test@EXAMPLE.COM" | base64

过程如下:

2、编写修改test用户的密码的test2.ldif文件

dn: uid=test,ou=people,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword:: e1NBU0x9dGVzdEBFWEFNUExFLkNPTQ==

过程如下:

3、执行应用该修改

ldapmodify -x -D 'cn=root,dc=example,dc=com' -w root -h 192.168.0.2 -f /home/ldap/test2.ldif

过程如下:

7.3、修改saslauthd配置

1、修改配置文件

vim /etc/sysconfig/saslauthd

\# Directory in which to place saslauthd's listening socket, pid file, and so
\# on.  This directory must already exist.
SOCKETDIR=/run/saslauthd

\# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
\# of which mechanism your installation was compiled with the ablity to use.
MECH=pam

\# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
\# for the list of accepted flags.
FLAGS=

修改为

\# Directory in which to place saslauthd's listening socket, pid file, and so
\# on.  This directory must already exist.
SOCKETDIR=/run/saslauthd

\# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
\# of which mechanism your installation was compiled with the ablity to use.
MECH=kerberos5

\# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
\# for the list of accepted flags.
FLAGS=

2、重启saslauthd

service saslauthd restart

3、创建ldap配置文件

vim /etc/sasl2/slapd.conf文件

内容:

pwcheck_method: saslauthd

过程如下

4、重启ldap

service slapd restart

5、查看saslauthd是否报错

service saslauthd status -l

执行过程如下:

7.4、增加kerberos的用户配置

执行如下操作:

kadmin.local -q "ank -clearpolicy -randkey host/test216"
kadmin.local -q "ktadd host/test216"
service saslauthd restart
ps -aux | grep saslauthd
kadmin.local -q 'ank -pw 12345678 test'
【注意】
1、host/test216中的test216,是服务器名称,不能写成IP
2、ankadd_principal简写,表示增加
3、-q表示静默,不进入kadmin.local的对话模式
4、-pw 表示设置test密码为12345678

7.5、测试Kerberos+OpenLDAP整合认证是否成功

1、测试kerberos认证

testsaslauthd -u test -p 12345678

执行过程如下:

至此, Kerberos 认证测试成功。

2、测试OpenLDAP认证

ldapsearch -x -D 'uid=test,ou=people,dc=example,dc=com' -w 12345678 -h 192.168.0.2 -b 'ou=people,dc=example,dc=com'

执行过程如下:

使用 test的密码12345678phpLDAPadmin进行登录认证

至此, OpenLDAP 认证测试成功。

3、测试Kerveros+OpenLDAP互通

  • 修改test密码
    过程如下:
  • Kerveros认证
    过程如下:
  • OpenLDAP认证

  • 使用 test的密码12345678phpLDAPadmin进行登录认证

至此, Apache+PHP+Kerberos+LDAP+phpLDAPadmin整合互通认证测试成功。

参考

[kadmin用法]
http://manpages.ubuntu.com/manpages/xenial/en/man1/kadmin.1.html

[openldap搭建说明]
https://help.ubuntu.com/community/OpenLDAPServer

[sldap配置文件说明]
http://manpages.ubuntu.com/manpages/xenial/en/man5/slapd-config.5.html

12-30 17:55
查看更多