Kerberos+LDAP+NFSv4 實現單點登錄(續1)--dns+dhcp

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:~$

3)
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:~$

4)
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/[email protected],ou=hdkrb5,dc=ctp,dc=net

6.2)設置LDAP ACL,允許DNS/[email protected]寫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/[email protected],ou=hdkrb5,dc=ctp,dc=net" write

即如下

olcAccess: {2}to dn.subtree="ou=dyndns,dc=ctp,dc=net" by dn="krb5PrincipalName=DNS/[email protected],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
卻提示無權限.

2)
運行
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記錄

4.
在配置初始化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)"

所以過濾條件不能用'>'、'<',要用 '>='、'<='

9.
本實驗是在公司局域網內通過代理服務器上外網安裝軟件,所以/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轉過來

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章