Kerberos+LDAP+NFSv4 实现单点登录(续1)--dns+dhcp

本文是<Kerberos+LDAP+NFSv4 实现单点登录>的续篇 上篇链接地址https://blog.51cto.com/13752418/2135225

1.架设dhcp 为客户机自动分配IP地址、默认域、DNS服务器等网络参数,简化了网络配置.

2.架设dns 为客户机提供将主机域名解析为IP地址; 并通过SRV(服务器)资源记录为客户机提供服务器定位. SRV记录为某些应用服务(kerberos、ldap)指定服务器(主机域名、端口).这些应用的客户端只需指定从SRV记录查询,而不需指定服务器(主机域名或IP地址),从而简化客户端配置.

三台主机:

              IP地址                 主机名
------------------------------------------------------------------------------------------
nfs服务器 : 自动分配                  srvnf   即krb5客户机
nfs客户机 : 自动分配                  clnf    即krb5客户机,也即SSSD客户端+NFS客户端
kdc服务器 : 静态分配 192.168.1.101    mykdc   即krb5服务器,也即Kerberos+LDAP,也即dns+dhcp

一.配置主机 配置三台主机的/etc/hostname,查看如下: 1)nfs服务器 linlin@srvnf:~$ cat /etc/hostname srvnf

2)nfs客户机 linlin@clnf:~$ cat /etc/hostname clnf.ctp.net

3)kdc服务器 linlin@mykdc:~$ cat /etc/hostname mykdc

以上三台主机的/etc/hosts文件内容都配置如下(仅一行即可): 127.0.0.1 localhost

二.安装网络管理 在所有主机都安装network-manager # apt-get install network-manager

在kdc服务器设置静态地址 # nmtui

在其它主机设置自动分配地址(默认)

主机启动后,network-manager从dhcp获取默认域、DNS服务器,并自动设置/etc/resolv.conf的内容,如下: 1)nfs服务器 linlin@srvnf:~$ cat /etc/resolv.conf domain ctp.net search ctp.net nameserver 192.168.1.101

2)nfs客户机 linlin@clnf:~$ cat /etc/resolv.conf nameserver 192.168.1.101 search ctp.net

3)kdc服务器 linlin@mykdc:~$ cat /etc/resolv.conf linlin@mykdc:~$ (为空)

如果没安装network-manager或使用其它的网络管理程序,请手工编辑或确保/etc/resolv.conf的内容如上述.

说明:以上是手工设置或是dhcp建成后自动设置.通常/etc/resolv.conf的内容nameserver项还需增加设置外网电信互联网服务商的DNS IP地址,以便安装软件.

三.修改配置 在上篇<Kerberos+LDAP+NFSv4 实现单点登录>的基础上修改配置

1.krb5服务器 1)kdc.conf linlin@mykdc:~$ cat /etc/heimdal-kdc/kdc.conf [logging] kdc = FILE:/var/log/heimdal-kdc.log

[kdc] database = { dbname = ldap:ou=hdkrb5,dc=ctp,dc=net acl_file = /etc/heimdal-kdc/kadmind.acl mkey_file = /var/lib/heimdal-kdc/m-key realm = CTP.NET }

#--v-- 增加,在任意地址监听 addresses = 0.0.0.0 #--^--

[kadmin]

[password_quality]

linlin@mykdc:~$

2)krb5.conf 本文实验了两种不同的dns+dhcp方式,其krb5服务器的/etc/krb5.conf有细小差别,详见第四章节.

2.krb5客户机 所有krb5客户机按下面修改

1)krb5.conf 使用DNS SRV资源记录,[realms]一节可留空 使用TXT记录,default_realm一行可删

$ cat /etc/krb5.conf [libdefaults] allow_weak_crypto=true

#--v-- 增加,使用DNS SRV资源记录 dns_lookup_kdc=true dns_lookup_realm=true #--^--

#The following krb5.conf variables are only for MIT Kerberos. kdc_timesync = 1 ccache_type = 4

#The following libdefaults parameters are only for Heimdal Kerberos. fcc-mit-ticketflags = true

[realms]

[domain_realm]

2)nsswitch.conf 主机名搜索顺序要设dns优先,将/etc/nsswitch.conf中 hosts: files mdns4_minimal [NOTFOUND=return] dns 一行改为 hosts: dns files mdns4_minimal [NOTFOUND=return]

3.nfs主机 所有nfs主机(包括客/服)按下面修改

1)idmapd.conf NFSv4名称映射

$ cat /etc/idmapd.conf [General]

Verbosity = 0 Pipefs-Directory = /run/rpc_pipefs

#--v-- 增加 Domain = ctp.net #--^--

[Mapping]

Nobody-User = nobody Nobody-Group = nogroup

4.nfs服务器 1)nslcd.conf root@srvnf:~# cat /etc/nslcd.conf uid nslcd gid nslcd

#--v-- 填LDAP服务器(即kdc服务器)主机名,nslcd应不支持DNS SRV资源记录 uri ldap://mykdc.ctp.net/ #--^--

base dc=ctp,dc=net

root@srvnf:~#

5.sssd客户机 1)sssd.conf 删除掉有关ldap_uri、krb5_server行,默认使用DNS SRV资源记录

root@clnf:~# cat /etc/sssd/sssd.conf [sssd] config_file_version = 2

services = nss, pam domains = intern

[nss]

[pam]

[domain/intern]

id_provider = ldap auth_provider = krb5 chpass_provider = krb5

ldap_search_base = ou=hdkrb5,dc=ctp,dc=net ldap_tls_reqcert = allow

#--v-- 必须保留 krb5_realm = CTP.NET #--^--

krb5_auth_timeout = 60

root@clnf:~#

四.安装dns+dhcp 到kdc服务器上安装dns+dhcp(即Kerberos+LDAP+dns+dhcp为一体),有两种方式: 1)dnsmasq 此方式简单易用

2)bind9+isc-dhcp-server 此方式复杂灵活

一)方式1: dnsmasq dnsmasq同时具备dns+dhcp功能,默认dhcp动态更新dns

1.安装dnsmasq root@mykdc:~# apt-get install dnsmasq

2.修改krb5服务器/etc/krb5.conf linlin@mykdc:~$ cat /etc/krb5.conf [libdefaults] allow_weak_crypto = true

#--v-- krb5服务器必需保留此项 default_realm = CTP.NET #--^--

dns_lookup_kdc=true dns_lookup_realm=true

#The following krb5.conf variables are only for MIT Kerberos. kdc_timesync = 1 ccache_type = 4

#The following libdefaults parameters are only for Heimdal Kerberos. fcc-mit-ticketflags = true

[realms]

[domain_realm]

linlin@mykdc:~$

3.配置dnsmasq.conf linlin@mykdc:~$ cat /etc/dnsmasq.conf #域 domain=ctp.net

#debian8服务器需此行 listen-address=192.168.1.101,127.0.0.1

dhcp-range=192.168.1.150,192.168.1.200,255.255.255.0,12h

#--v-- SRV资源记录 srv-host=_kerberos._udp.ctp.net,"mykdc.ctp.net",88 srv-host=_kerberos._tcp.ctp.net,"mykdc.ctp.net",88 srv-host=_kpasswd._udp.ctp.net,"mykdc.ctp.net",464

#for ldap、for sssd srv-host=_ldap._tcp.ctp.net,"mykdc.ctp.net",389 #--^--

#NFSv4需反向解析kdc服务器 ptr-record=101.1.168.192.in-addr.arpa.,"mykdc.ctp.net"

address=/mykdc.ctp.net/192.168.1.101

txt-record=_kerberos.ctp.net,"CTP.NET"

linlin@mykdc:~$

二)方式2: bind9+isc-dhcp-server 此方式较为复杂 本文为实现LDAP的集中统一管理,摒弃dhcp、dns传统的文本数据库,使用LDAP作为bind9、isc-dhcp-server后端,使其实现起来更为复杂.

方案: 1)dhcp动态更新dns 因本实验的dhcp和dns的共享密钥任何人可见,所以需设只kdc服务器本机可更新dns

2)LDAP作为后端数据库 dhcp需isc-dhcp-server-ldap dns需bind9-dyndb-ldap

3)免密码连接LDAP dhcp只是做到参数配置和固定地址分配存储到ldap数据库中,而动态分配的地址记录仍是传统的文本文件,isc-dhcp-server-ldap只需读LDAP,所以匿名连接即可.

dns要求能动态更新,并且DNS记录存储到LDAP,就必须有写ldap数据库的权限. bind9-dyndb-ldap可以提供简单认证连接LDAP,但必须在配置文件中提供明文密码; bind9-dyndb-ldap不支持EXTERNAL认证(免密码); bind9-dyndb-ldap提供了GSSAPI机制,同样可以做到免密码,避免明文密码出现在配置文件中

4)GSSAPI机制 需要Kerberos的支持,需libsasl2-modules-gssapi-heimdal 本文的Kerberos又是将LDAP作为后端数据库,而要使用GSSAPI机制,LDAP服务器又必须作为Kerberos的应用服务器(如NFS应用服务器)

5)启用DNS的SRV资源记录 为尽量减少配置工作量,使用DNS的SRV资源记录自动获取krb5服务器、LDAP服务器地址

终上述,很容易造成各服务的循环依赖,好在本实验一切正常.

1.安装相关软件 root@mykdc:~# apt-get install bind9 bind9-dyndb-ldap isc-dhcp-server isc-dhcp-server-ldap libsasl2-modules-gssapi-heimdal

2.修改krb5服务器/etc/krb5.conf linlin@mykdc:~$ cat /etc/krb5.conf [libdefaults] allow_weak_crypto = true default_realm = CTP.NET dns_lookup_kdc = true
dns_lookup_realm = true

#The following krb5.conf variables are only for MIT Kerberos. kdc_timesync = 1 ccache_type = 4

#The following libdefaults parameters are only for Heimdal Kerberos. fcc-mit-ticketflags = true

[realms] #--v-- 用于sasl,此为kdc服务器上的dns要通过sasl认证连接LDAP,必须指定kdc,若不用sasl,可删掉[realms]此节 CTP.NET = { kdc = 127.0.0.1 } #--^--

[domain_realm]

linlin@mykdc:~$

3.添加dns、dhcp模式 1)dns 下载bind-dyndb-ldap的模式文件(https://pagure.io/bind-dyndb-ldap) 该软件包的schema仅提供ldif格式,且是用于389 DS,而本文是使用openldap,需按其说明手工修改以适用于openldap

修改内容: 将下面一行 dn: cn=schema 删除掉,这个是用于389 DS

将下面两行 #dn: cn=dns,cn=schema,cn=config
#objectClass: olcSchemaConfig
去掉注释,这个是用于openldap,即如下 dn: cn=dns,cn=schema,cn=config
objectClass: olcSchemaConfig

删除有关COSINE 从aRecord到cNAMERecord删除掉,即删类似0.9.2342.19200300.100.1.xxxx,这些属性已在COSINE定义了

所有attributeTypes替换为olcAttributeTypes 所有objectClasses替换为olcObjectClasses

修改后的内容如下:(注意括号里的行尾有空格符)

dn: cn=dns,cn=schema,cn=config
objectClass: olcSchemaConfig
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.0.0 
 NAME 'dNSTTL' 
 DESC 'An integer denoting time to live' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 
 EQUALITY integerMatch )

。。。略

在线添加模式 root@mykdc:~# ldapadd -Y EXTERNAL -H ldapi:/// -f dns.ldif

2)dhcp isc-dhcp-server-ldap的模式文件在/usr/share/doc/isc-dhcp-server-ldap/dhcp.schema.gz

安装p7zip-full解压软件 root@mykdc:~# apt-get install p7zip-full

解压出dhcp.schema linlin@mykdc:~$ 7z e /usr/share/doc/isc-dhcp-server-ldap/dhcp.schema.gz

转换格式 root@mykdc:~# schema2ldif /home/linlin/dhcp.schema >dhcp.ldif

在线添加模式 root@mykdc:~# ldapadd -Y EXTERNAL -H ldapi:/// -f dhcp.ldif

4.用ddns-confgen生成密钥 linlin@mykdc:~$ /usr/sbin/ddns-confgen #To activate this key, place the following in named.conf, and #in a separate keyfile on the system or systems from which nsupdate #will be run: key "ddns-key" { algorithm hmac-sha256; secret "EQdIMR3a34SaPyc0pIOm4e3gsonl2fosMAxvqU4AkK4="; };

#Then, in the "zone" statement for each zone you wish to dynamically #update, place an "update-policy" statement granting update permission #to this key. For example, the following statement grants this key #permission to update any name within the zone: update-policy { grant ddns-key zonesub ANY; };

#After the keyfile has been placed, the following command will #execute nsupdate using this key: nsupdate -k <keyfile> linlin@mykdc:~$ 记下"EQdIMR3a34SaPyc0pIOm4e3gsonl2fosMAxvqU4AkK4="这串共享密钥,dhcp、dns将用到

5.配置isc-dhcp-server

1)参照dhcpd.conf传统样式,转换为存储到ldap数据库 通常包括三部分:参数(ddns-update-style等)、声明(subnet等) 、选项(domain-name等)

新建文件dhcpconf.ldif并编辑

root@mykdc:~# cat dhcpconf.ldif dn: cn=mykdc, dc=ctp, dc=net objectClass: top objectClass: dhcpServer cn: mykdc dhcpServiceDN: cn=DHCP Service Config, dc=ctp, dc=net

#Here is the config tree that mykdc.ctp.net points to. dn: cn=DHCP Service Config, dc=ctp, dc=net cn: DHCP Service Config objectClass: top objectClass: dhcpService dhcpPrimaryDN: cn=mykdc, dc=ctp, dc=net #动态更新DNS,要标准模式 dhcpStatements: ddns-update-style standard dhcpStatements: allow client-updates #动态更新DNS的密钥,同DNS,即上面ddns-confgen生成的密钥 dhcpStatements: key "ddns-key" { algorithm hmac-sha256; secret "EQdIMR3a34SaPyc0pIOm4e3gsonl2fosMAxvqU4AkK4="; } dhcpStatements: zone ctp.net { primary 127.0.0.1; key ddns-key; } dhcpStatements: default-lease-time 600 dhcpStatements: max-lease-time 7200

#Set up a subnet declaration with a pool statement. Also note that we have a dhcpOptions object with this entry dn: cn=192.168.1.0, cn=DHCP Service Config, dc=ctp, dc=net cn: 192.168.1.0 objectClass: top objectClass: dhcpSubnet objectClass: dhcpOptions dhcpOption: domain-name "ctp.net" dhcpOption: domain-name-servers 192.168.1.101 dhcpOption: routers 192.168.1.1 dhcpOption: subnet-mask 255.255.255.0 dhcpOption: broadcast-address 192.168.1.255 dhcpNetMask: 24

#Set up a pool for this subnet. Only known hosts will get these IPs dn: cn=Known Pool, cn=192.168.1.0, cn=DHCP Service Config, dc=ctp, dc=net cn: Known Pool objectClass: top objectClass: dhcpPool dhcpRange: 192.168.1.150 192.168.1.200

root@mykdc:~#

导入到ldap数据库 root@mykdc:~# ldapadd -Y EXTERNAL -H ldapi:/// -f dhcpconf.ldif

2)修改缺省配置 将/etc/default/isc-dhcp-server中的 INTERFACESv4="" 改为 INTERFACESv4="enp0s3"

接口名请根据实际情况填上,如eth0等,本文是enp0s3

3)修改dhcpd.conf 传统上各项参数、子网定义、地址池范围、租约期等等都在dhcpd.conf配置,现在改为仅仅连接LDAP,而各项配置存储在ldap数据库

linlin@mykdc:~$ cat /etc/dhcp/dhcpd.conf ldap-server "127.0.0.1"; ldap-base-dn "dc=ctp,dc=net"; ldap-method dynamic; linlin@mykdc:~$

6.配置bind9

1)定义正、反向区域存储到ldap数据库 root@mykdc:~# cat dnsconf.ldif #Top container dn: ou=dyndns,dc=ctp,dc=net objectClass: organizationalUnit ou: dyndns

#Zone ctp.net dn: idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: top objectClass: idnsZone objectClass: idnsRecord idnsName: ctp.net #动态更新策略,ddns-key见named.conf.local定义 idnsUpdatePolicy: grant ddns-key zonesub ANY; idnsZoneActive: TRUE idnsSOAmName: mykdc idnsSOArName: root.mykdc idnsSOAserial: 1 idnsSOArefresh: 10800 idnsSOAretry: 900 idnsSOAexpire: 604800 idnsSOAminimum: 86400 #域名服务器记录 NSRecord: ctp.net. ARecord: 192.168.1.101

#别名 dn: idnsName=mykdc, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: mykdc CNAMERecord: ctp.net.

#DNS records for zone ctp.net #--v-- SRV资源记录 dn: idnsName=_kerberos._udp, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: _kerberos._udp SRVRecord: 0 100 88 mykdc

dn: idnsName=_kerberos._tcp, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: _kerberos._tcp SRVRecord: 0 100 88 mykdc

dn: idnsName=_kpasswd._udp, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: _kpasswd._udp SRVRecord: 0 100 464 mykdc

dn: idnsName=_ldap._tcp, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: _ldap._tcp SRVRecord: 0 100 389 mykdc

dn: idnsName=_ntp._udp, idnsName=ctp.net, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: _ntp._udp SRVRecord: 0 100 123 mykdc #--^--

#--v-- 反向解析 dn: idnsName=1.168.192.in-addr.arpa, ou=dyndns, dc=ctp, dc=net objectClass: top objectClass: idnsZone objectClass: idnsRecord idnsName: 1.168.192.in-addr.arpa idnsUpdatePolicy: grant ddns-key zonesub ANY; idnsZoneActive: TRUE idnsSOAmName: mykdc.ctp.net. idnsSOArName: root.mykdc.ctp.net. idnsSOAserial: 1 idnsSOArefresh: 10800 idnsSOAretry: 900 idnsSOAexpire: 604800 idnsSOAminimum: 86400 NSRecord: mykdc.ctp.net.

#必须配置kdc服务器地址的反向解析 dn: idnsName=101, idnsName=1.168.192.in-addr.arpa, ou=dyndns, dc=ctp, dc=net objectClass: idnsRecord objectClass: top idnsName: 101 PTRRecord: mykdc.ctp.net. #--^-- root@mykdc:~#

导入到ldap数据库 root@mykdc:~# ldapadd -Y EXTERNAL -H ldapi:/// -f dnsconf.ldif

2)修改named.conf.local 传统上区域定义在named.conf.local配置,现在改为仅仅连接LDAP,而区域定义及动态更新DNS记录都存储在ldap数据库 linlin@mykdc:~$ cat /etc/bind/named.conf.local logging { channel default_debug { file "named.run"; severity debug; }; };

key "ddns-key" { algorithm hmac-sha256; //动态更新DNS的密钥,同dhcp,即上面ddns-confgen生成的密钥 secret "EQdIMR3a34SaPyc0pIOm4e3gsonl2fosMAxvqU4AkK4="; };

controls { //仅仅允许本机更新,即只允许来自本机dhcp的更新 inet 127.0.0.1 allow { 127.0.0.1; } keys { ddns-key; }; };

dynamic-db "my_db_name" { library "ldap.so"; arg "uri ldap://127.0.0.1"; arg "base ou=dyndns, dc=ctp, dc=net";

//认证机制 arg "auth_method sasl"; arg "sasl_mech GSSAPI"; //--v-- 见小节5)添加krb5主体 arg "sasl_auth_name DNS/mykdc"; arg "krb5_keytab FILE:/etc/bind/krb5.keytab"; //--^--

//动态更新 arg "dyn_update yes";

//同步反向解析 arg "sync_ptr yes"; };

linlin@mykdc:~$

linlin@mykdc:~$ cat /etc/bind/named.conf
include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local";

//注释掉 //include "/etc/bind/named.conf.default-zones"; linlin@mykdc:~$

linlin@mykdc:~$ cat /etc/bind/named.conf.options options { directory "/var/cache/bind";

//注释掉 /* dnssec-validation auto;

auth-nxdomain no;    # conform to RFC1035
listen-on-v6 { any; };

*/

//作为局域网,禁止递归查询互联网的根服务器 allow-recursion { none; };

}; linlin@mykdc:~$

5)添加krb5主体

5.1) root@mykdc:~# kadmin -l kadmin> add -r ldap/mykdc 新增

一路回车缺省

kadmin> modify -a -disallow-svr ldap/mykdc 使ldap/mykdc成为应用服务器

kadmin> ext -k /etc/ldap/krb5.keytab ldap/mykdc 导出keytab

krb5.keytab拥有者改为openldap,并只openldap用户可读 root@mykdc:~# chown openldap:openldap /etc/ldap/krb5.keytab root@mykdc:~# chmod o-r /etc/ldap/krb5.keytab root@mykdc:~# chmod g-r /etc/ldap/krb5.keytab

在/etc/default/slapd里增加一行 export KRB5_KTNAME=/etc/ldap/krb5.keytab

5.2) root@mykdc:~# kadmin -l kadmin> add -r DNS/mykdc 一路回车缺省

kadmin> ext -k /etc/bind/krb5.keytab DNS/mykdc 导出keytab

krb5.keytab拥有者改为bind,并只bind用户可读 root@mykdc:~# chown bind:bind /etc/bind/krb5.keytab root@mykdc:~# chmod o-r /etc/bind/krb5.keytab root@mykdc:~# chmod g-r /etc/bind/krb5.keytab

6)修改LDAP配置数据库 直接修改文件(虽不推荐,修改后要重启openldap)

6.1)将krb5用户主体映射到ldap用户 修改/etc/ldap/slapd.d/cn=config.ldif文件,增加一行 olcAuthzRegexp: {0}uid=dns/mykdc,cn=gssapi,cn=auth krb5PrincipalName=DNS/mykdc@CTP.NET,ou=hdkrb5,dc=ctp,dc=net

6.2)设置LDAP ACL,允许DNS/mykdc@CTP.NET写ldap数据库 修改/etc/ldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif文件

将原olcAccess: {2} 一行的2改为3 ,并在该行前插入一行 olcAccess: {2}to dn.subtree="ou=dyndns,dc=ctp,dc=net" by dn="krb5PrincipalName=DNS/mykdc@CTP.NET,ou=hdkrb5,dc=ctp,dc=net" write

即如下

olcAccess: {2}to dn.subtree="ou=dyndns,dc=ctp,dc=net" by dn="krb5PrincipalName=DNS/mykdc@CTP.NET,ou=hdkrb5,dc=ctp,dc=net" write
olcAccess: {3}to * by dn="cn=admin,dc=ctp,dc=net" write by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * read

7.重启kdc服务器 一切正常,能自动分配地址,自动添加DNS记录

四.后记 1.添加模式 debian9的bind9-dyndb-ldap模式文件在/usr/share/doc/bind9-dyndb-ldap/schema.ldif.gz 但该文件错漏百出,在线添加模式时,出现"topAUXILIARY"之类的错误,正确是"top AUXILIARY" 这是因为LDIF语法如

SUP top
AUXILIARY 

" AUXILIARY"前面的空格是表示续上行的,假如上行" SUP top"后面没留空格,续下行变成" SUP topAUXILIARY" 而我们是需要" SUP top AUXILIARY",所以" SUP top"需改为" SUP top ",后面留空格. 或者将两行就写为一行" SUP top AUXILIARY"也可以.

查看了debian9的bind9-dyndb-ldap模式文件,好几处都是在续行上遗漏加上空格,更甚者遗漏了属性idnsTemplateAttribute定义

到https://pagure.io/bind-dyndb-ldap下载最新的源码,见../doc/schema.ldif

2.导出keytab 本来要将ldap/mykdc、DNS/mykdc都导出到/etc/krb5.keytab,两者合并在同一/etc/krb5.keytab文件. 但openldap、bind9不是以root根用户运行,而是以各自用户运行.为确保/etc/krb5.keytab不为任何人读取,所以在/etc/krb5.keytab文件权限设置上会冲突. 因此将各自的krb5.keytab分开目录存放.

3.添加DNS记录 在设置LDAP ACL后,要手工添加DNS记录到"ou=dyndns,dc=ctp,dc=net"下 1) 在root下运行 ldapadd -Y EXTERNAL -H ldapi:/// -f xxxx.ldif 却提示无权限.

运行 ldapadd -x -D "cn=admin,dc=ctp,dc=net" -W -f xxxx.ldif 虽有权限. 但要先停止bind9,才能正常添加; 而在bind9运行状态,却导致整个openldap崩溃,需重启kdc服务器才恢复正常.

不知何原因.

因此,在架设bind9+isc-dhcp-server时,先初始化DNS记录,再设LDAP ACL权限,后面正常自动添加DNS记录

在配置初始化DNS记录时,如前面的配置反向解析 PTRRecord: mykdc.ctp.net. 注意最后一个点号,应是表示根域 即要设为"mykdc.ctp.net.",不要设为"mykdc.ctp.net" 设为"mykdc.ctp.net"会反向解析为mykdc.ctp.net.1.168.192.in-addr.arpa

5.LDAP ACL 我不太懂LDAP ACL的规则,但规则顺序也很重要. 如我一开始是在原olcAccess: {2}to * 下再增加olcAccess: {3},实验是无效果. 可能要把olcAccess: {x}to * 置在最后吧

6.sudo模式 debian9的软件包sudo-ldap的sudo模式见/usr/share/doc/sudo-ldap/schema.OpenLDAP 该模式文件有错漏,其

attributeTypes ( 1.3.6.1.4.1.15953.9.1.10
    NAME 'sudoOrder'

的attributeTypes应为attributetype

该错漏如同bind9-dyndb-ldap模式文件的错漏,都是在软件包所在的帮助文档,不属源代码.可能包维护人员不重视文档的查漏.

7.缺省搜索 修改/etc/ldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif文件,增加一行 olcDefaultSearchBase: dc=ctp,dc=net

搜索时基本DN指定为""空白,不需指定为"dc=ctp,dc=net" linlin@mykdc:~$ ldapsearch -x -h 127.0.0.1 -b ""

8.过滤条件 如要搜索uidNumber数值大于、等于某值时

用'='正确

但用'>'出错 linlin@mykdc:~$ ldapsearch -x -b "dc=ctp,dc=net" "(uidNumber>2000)" ldap_search_ext: Bad search filter (-7) 错误的搜索过滤

需用'>='才正确 linlin@mykdc:~$ ldapsearch -x -b "dc=ctp,dc=net" "(uidNumber>=2000)"

所以过滤条件不能用'>'、'<',要用 '>='、'<='

本实验是在公司局域网内通过代理服务器上外网安装软件,所以/etc/resolv.conf不需设置外网DNS. 如在家庭里通过路由器(除非三台主机debian软件源镜像地址用IP地址),三台主机需设置外网电信互联网服务商的DNS IP地址或谷歌的8.8.8.8 如: nameserver 8.8.8.8

三台主机安装设置完毕,自组网实验

五.附录

( 附:LXC容器图形前端 fglxc-ver0.0.9.zip 源代码 下载地址 http://u.163.com/xtfcsdnT 提取码: lAPs2V9m )

本篇从原网易http://lulinlin1.lofter.com/post/1cf3848f_11f58066?act=qbbloglofter_20150506_01转过来