溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kerberos+LDAP+NFSv4 實(shí)現(xiàn)單點(diǎn)登錄(上)

發(fā)布時(shí)間:2020-06-20 13:46:46 來(lái)源:網(wǎng)絡(luò) 閱讀:828 作者:lu_linlin 欄目:系統(tǒng)運(yùn)維

Kerberos+LDAP+NFSv4 實(shí)現(xiàn)單點(diǎn)登錄(上)

Kerberos : 身份認(rèn)證
LDAP : 目錄信息服務(wù)
NFSv4 : 網(wǎng)絡(luò)共享

實(shí)驗(yàn)環(huán)境 : debian 9

三臺(tái)主機(jī):
nfs服務(wù)器 : 192.168.1.103
nfs客戶機(jī) : 192.168.1.102 即SSSD客戶端+NFS客戶端
kdc服務(wù)器 : 192.168.1.101 即Kerberos+LDAP

以下

root@debian:~#
表示以root根用戶運(yùn)行命令

一.安裝NTP時(shí)間同步
要使用Kerberos提供身份認(rèn)證,各主機(jī)需時(shí)間同步

在一臺(tái)主機(jī)上安裝時(shí)間同步服務(wù)器
root@debian:~# apt-get install ntp

在其它主機(jī)上安裝時(shí)間同步客戶端
root@debian:~# apt-get install ntpdate

二.配置本地域
假定域是ctp.net
安裝Kerberos、LDAP過(guò)程都會(huì)用到域,NFSv4認(rèn)證需要到域

以上三臺(tái)主機(jī)的/etc/hosts文件內(nèi)容都配置如下:
127.0.0.1 localhost
127.0.1.1 debian.ctp.net debian
192.168.1.103 srvnf.ctp.net srvnf
192.168.1.102 clnf.ctp.net clnf

注意:127.0.1.1一定要xxx.ctp.net的格式,以確定域ctp.net

root@debian:~# hostname -d
ctp.net

root@debian:~# dnsdomainname
ctp.net

三.kdc服務(wù)器的安裝
安裝Kerberos和LDAP,Kerberos和LDAP在同一主機(jī)上

1.安裝LDAP
root@debian:~# apt-get install slapd ldap-utils

slapd : OpenLDAP服務(wù)器
ldap-utils : ldap命令工具

安裝過(guò)程中僅要求設(shè)置密碼,該密碼是ldap數(shù)據(jù)庫(kù)管理員密碼.設(shè)置LDAP的域默認(rèn)是由hostname -d獲得(即ctp.net)

安裝過(guò)程預(yù)先添加了四個(gè)模式
core.ldif
cosine.ldif
nis.ldif
inetorgperson.ldif

安裝過(guò)程初始化了配置數(shù)據(jù)庫(kù)(cn=config)和ldap數(shù)據(jù)庫(kù)(dc=ctp,dc=net)

1)配置ssl
因SSSD客戶端要求ssl連接,所以需配置LDAP啟用ssl

為了簡(jiǎn)便,建立免短語(yǔ)密碼永不過(guò)期證書(shū)

使用gnutls-bin工具建證書(shū)
root@debian:~# apt-get install gnutls-bin

1.1)建根證書(shū)

root@debian:~# certtool --generate-privkey > cakey.pem

Generating a 3072 bit RSA private key...

新建文件ca.info并編輯

root@debian:~# cat ca.info
ca
cert_signing_key
expiration_days = -1
root@debian:~#

說(shuō)明:-1表示永不過(guò)期

進(jìn)行自簽名

root@debian:~# certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem

Generating a self signed certificate...
...(略)
Signing certificate...
root@debian:~#

1.2)建服務(wù)器證書(shū)
為了簡(jiǎn)便,證書(shū)都不設(shè)置機(jī)器名

生成私鑰

root@debian:~# certtool --generate-privkey > fgkey.pem

Generating a 3072 bit RSA private key...

新建文件srv.info并編輯

root@debian:~# cat srv.info
tls_www_server
encryption_key
signing_key
expiration_days = -1
root@debian:~#

簽發(fā)服務(wù)器證書(shū)

root@debian:~# certtool --generate-certificate --load-privkey fgkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --template srv.info --outfile fgcert.pem

Generating a signed certificate...
...
Signing certificate...
root@debian:~#

新建存放私鑰的目錄
root@debian:~# mkdir /etc/ldap/ssl/private

復(fù)制私鑰、證書(shū)

root@debian:~# cp fgcert.pem /etc/ldap/ssl/
root@debian:~# cp fgkey.pem  /etc/ldap/ssl/private/

設(shè)置私鑰屬性為僅openldap用戶擁有可讀(因debian的openldap是以openldap用戶運(yùn)行)

root@debian:~# chown openldap  /etc/ldap/ssl/private/fgkey.pem
root@debian:~# ls -l  /etc/ldap/ssl/private/fgkey.pem
-rw-r--r-- 1 openldap root 8289 Oct 19 13:44 /etc/ldap/ssl/private/fgkey.pem
root@debian:~#
root@debian:~# chmod o-r  /etc/ldap/ssl/private/fgkey.pem
root@debian:~# ls -l  /etc/ldap/ssl/private/fgkey.pem
-rw-r----- 1 openldap root 8289 Oct 19 13:44 /etc/ldap/ssl/private/fgkey.pem

1.3)配置openldap啟用ssl

新建文件ssl.ldif并編輯

root@debian:~# cat ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/fgcert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/private/fgkey.pem
root@debian:~#

openldap的配置沒(méi)有使用傳統(tǒng)的slapd.conf文件,而是操作方式猶如ldap數(shù)據(jù)庫(kù)的配置數(shù)據(jù)庫(kù),在/etc/ldap/slapd.d/目錄下,結(jié)構(gòu)層次分明的目錄及l(fā)dif文件.

安裝LDAP安裝后,雖已預(yù)先創(chuàng)建了配置數(shù)據(jù)庫(kù)管理員,但沒(méi)設(shè)密碼,仍不可使用.但也已設(shè)置了允許root根用戶通過(guò)EXTERNAL認(rèn)證方式讀寫配置數(shù)據(jù)庫(kù),所以本實(shí)驗(yàn)在root根用戶下運(yùn)行l(wèi)dap命令工具.

root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

1.4)修改/etc/default/slapd文件
...

SLAPD_SERVICES="ldap:/// ldapi:///"
改為
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
...

重啟openldap

2)設(shè)置ACL訪問(wèn)控制列表
本實(shí)驗(yàn)使用ldap數(shù)據(jù)庫(kù)作為Kerberos數(shù)據(jù)庫(kù)后端,Kerberos訪問(wèn)LDAP有兩種方式:
方式1: Kerberos通過(guò)綁定ldap數(shù)據(jù)庫(kù)管理員訪問(wèn)ldap數(shù)據(jù)庫(kù).可以做到Kerberos、LDAP在各自的主機(jī)上,但Kerberos上必需存儲(chǔ)明文的ldap數(shù)據(jù)庫(kù)管理員密碼
方式2: Kerberos和LDAP在同一主機(jī)上,Kerberos通過(guò)EXTERNAL認(rèn)證方式訪問(wèn)ldap數(shù)據(jù)庫(kù),無(wú)需綁定任何ldap數(shù)據(jù)庫(kù)用戶

為避免存儲(chǔ)任何明文的密碼,所以本實(shí)驗(yàn)采用第2種方式

Kerberos進(jìn)程是以root根用戶運(yùn)行,所以必需設(shè)置openldap的ACL允許root根用戶進(jìn)程讀寫ldap數(shù)據(jù)庫(kù).

設(shè)置ACL是設(shè)置olcAccess的值,因olcAccess是多值的屬性,本人不懂得ldapmodify命令如何修改多值的屬性中的某個(gè)值.
請(qǐng)使用ldap客戶端工具(如luma)連接到配置數(shù)據(jù)庫(kù)修改條目olcDatabase={1}mdb,cn=config的olcAccess屬性

直接修改文件(雖不推薦,修改后要重啟openldap,本實(shí)驗(yàn)使用此方式)

修改/etc/ldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif文件

olcAccess: {2}to * by self write by dn="cn=admin,dc=ctp,dc=net" write by * read
改為
olcAccess: {2}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

root@debian:~# /etc/init.d/slapd stop
root@debian:~# /etc/init.d/slapd start

重啟openldap后,root根用戶便可運(yùn)行類似 ldapadd -Y EXTERNAL -H ldapi:/// -f xxx.ldif 命令讀寫ldap數(shù)據(jù)庫(kù).
也即Kerberos進(jìn)程便有權(quán)限寫ldap數(shù)據(jù)庫(kù),無(wú)需綁定LDAP數(shù)據(jù)庫(kù)管理員.

2.安裝Kerberos
root@debian:~# apt-get install heimdal-kdc heimdal-clients krb5-config

heimdal-kdc : Kerberos服務(wù)器
heimdal-clients : Kerberos客戶端

kdc服務(wù)器需Kerberos服務(wù)端和客戶端

Kerberos安裝后,修改配置文件kdc.conf、krb5.conf

1)Kerberos服務(wù)端配置/etc/heimdal-kdc/kdc.conf內(nèi)容
[logging]
kdc = FILE:/var/log/heimdal-kdc.log

[kdc]
database = {
#--v-- 指定使用ldap數(shù)據(jù)庫(kù)作為Kerberos數(shù)據(jù)庫(kù),缺省EXTERNAL認(rèn)證
dbname = ldap:ou=hdkrb5,dc=ctp,dc=net
#--^--

acl_file = /etc/heimdal-kdc/kadmind.acl

#--v-- 使用ldap數(shù)據(jù)庫(kù)作為后端時(shí),并要使用kpasswdd必需加下面兩行.
mkey_file = /var/lib/heimdal-kdc/m-key
realm = CTP.NET
#--^-- ( 如openldap啟用了slapd-smbk5pwd同步密碼,
#上面兩行也解決了同步出錯(cuò)問(wèn)題,但必需將/var/lib/heimdal-kdc/m-key改為openldap用戶擁有)
#本實(shí)驗(yàn)就不啟用slapd-smbk5pwd了,不必修改/var/lib/heimdal-kdc/m-key擁有者
}

[kadmin]

[password_quality]

2)Kerberos客戶端配置/etc/krb5.conf內(nèi)容
[libdefaults]
#--v-- 為支持NFSv4,而NFSv4只支持弱加密,kdc服務(wù)器及Kerberos客戶機(jī)都需配置下面一行
allow_weak_crypto = true
#--^--

default_realm = CTP.NET

#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

#--v--
#kdc服務(wù)器及客戶機(jī)的krb5.conf原配置啟用了下面兩行,客戶機(jī)連接到kdc服務(wù)器就出錯(cuò)
#猜測(cè)原因可能是在創(chuàng)建Principal時(shí)一路缺省,而缺省是disallow-proxiable,disallow-forwardable
#因此客戶機(jī)和kdc服務(wù)器都要注釋掉下面兩行
#forwardable = true
#proxiable = true
#--^--

#The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true

[realms]
CTP.NET = {
kdc = 127.0.0.1
admin_server = 127.0.0.1
#--v-- kdc服務(wù)器上要運(yùn)行kpasswd命令必需加下面一行
kpasswd_server = 127.0.0.1
#--^--
}

[domain_realm]

[login]
krb4_convert = true
krb4_get_tickets = false

3)重啟heimdal-kdc

root@debian:~# /etc/init.d/heimdal-kdc stop  
root@debian:~# /etc/init.d/heimdal-kdc start

3.安裝schema2ldif
root@debian:~# apt-get install schema2ldif

schema2ldif : schema到ldif轉(zhuǎn)換工具

LDAP模式通常同時(shí)提供schema和ldif兩個(gè)文件,但heimdal-kdc只提供hdb.schema文件,沒(méi)提供LDIF格式文件

openldap添加heimdal模式,模式文件在/etc/ldap/schema/hdb.schema

1)轉(zhuǎn)換格式
root@debian:~# schema2ldif /etc/ldap/schema/hdb.schema>hdb.ldif

2)在線添加模式

root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f hdb.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
...

4.添加數(shù)據(jù)庫(kù)記錄
上面完成了kdc服務(wù)器的安裝配置,下面開(kāi)始操作數(shù)據(jù)庫(kù)

1)ldap數(shù)據(jù)庫(kù)添加krb5組織條目
新建文件krb5.ldif并編輯

root@debian:~# cat krb5.ldif
dn: ou=hdkrb5,dc=ctp,dc=net
krb5PrincipalName: default@CTP.NET
ou: hdkrb5
objectClass: krb5Principal
objectClass: organizationalUnit
root@debian:~#
root@debian:~# ldapadd -x -D "cn=admin,dc=ctp,dc=net" -W -f krb5.ldif
Enter LDAP Password: 輸入ldap數(shù)據(jù)庫(kù)管理員的密碼(在安裝openldap時(shí)設(shè)置的密碼)
adding new entry "ou=hdkrb5,dc=ctp,dc=net"
root@debian:~#

2)初始化Kerberos數(shù)據(jù)庫(kù)

root@debian:~# kadmin -l
kadmin> init CTP.NET

花了兩分鐘

Realm max ticket life [unlimited]:
Realm max renewable ticket life [unlimited]:
...
上面一路回車缺省

kadmin> exit
退出kadmin

3)新增Kerberos用戶
root@debian:~# kadmin -l
kadmin> add krblinlin
名為krblinlin的用戶

Max ticket life [unlimited]:
Max renewable life [unlimited]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes [disallow-svr, disallow-proxiable, disallow-renewable, disallow-forwardable, disallow-postdated]:
Policy [default]:
上面一路回車缺省

krblinlin@CTP.NET's Password: 設(shè)定密碼
Verify password - krblinlin@CTP.NET's Password:

4)在kdc服務(wù)器上測(cè)試kpasswd修改密碼
以普通用戶登錄kdc

linlin@debian:~$ kpasswd krblinlin
krblinlin@CTP.NET's Password: 輸入正確的密碼
New password for krblinlin@CTP.NET: 重設(shè)定密碼
Verify password - New password for krblinlin@CTP.NET:
Success : Password changed
linlin@debian:~$

5)為用戶krblinlin添加posixAccount對(duì)象類
posixAccount對(duì)象類在nis模式中

新建文件unix.ldif并編輯

注:在用kadmin命令新增Kerberos用戶,即也在ldap數(shù)據(jù)庫(kù)新增了條目(含krb5Key等屬性),該條目已有uid屬性,所以添加posixAccount對(duì)象類不必再加uid屬性

root@debian:~# cat unix.ldif
dn: krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net
changetype: modify
add: objectClass
objectClass: posixAccount
-
add: cn
cn: krblinlin
-
add: gidNumber
gidNumber: 4001
-
add: homeDirectory
homeDirectory: /home/krblinlin
-
add: loginShell
loginShell: /bin/bash
-
add: uidNumber
uidNumber: 4001
-
add: userPassword
userPassword: linlin

root@debian:~# ldapmodify -x -D "cn=admin,dc=ctp,dc=net" -W -f unix.ldif
Enter LDAP Password:
modifying entry "krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net"

條目(krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net)的userPassword屬性是ldap用戶的密碼,而krb5Key屬性應(yīng)是包含Kerberos密碼信息.
所以該條目有兩套不同的密碼體系,Kerberos和LDAP

6)添加nfs服務(wù)器

root@debian:~# kadmin -l
kadmin> add -r nfs/srvnf.ctp.net

新增

Max ticket life [unlimited]:
Max renewable life [unlimited]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes [disallow-svr, disallow-proxiable, disallow-renewable, disallow-forwardable, disallow-postdated]:
Policy [default]:
上面一路回車缺省

kadmin> modify -a -disallow-svr nfs/srvnf.ctp.net
因上面缺省是disallow-svr,需刪除disallow-svr,使nfs/srvnf.ctp.net成為應(yīng)用服務(wù)器

kadmin> ext -k /home/linlin/srv/krb5.keytab nfs/srvnf.ctp.net
導(dǎo)出keytab

通過(guò)U盤將krb5.keytab復(fù)制到nfs服務(wù)器的/etc目錄下,確保krb5.keytab權(quán)限為root擁有,僅root可讀

root@debian:~# chown root:root /etc/krb5.keytab
root@debian:~# chmod o-r /etc/krb5.keytab
root@debian:~# chmod g-r /etc/krb5.keytab

7)添加nfs客戶機(jī)

root@debian:~# kadmin -l
kadmin> add -r host/clnf.ctp.net

一路回車缺省,此是客戶機(jī),不是應(yīng)用服務(wù)器,無(wú)需刪除disallow-svr

kadmin> ext -k /home/linlin/cl/krb5.keytab host/clnf.ctp.net

通過(guò)U盤將krb5.keytab復(fù)制到nfs客戶機(jī)的/etc目錄下,確保krb5.keytab權(quán)限為root擁有,僅root可讀

四.Kerberos客戶機(jī)的安裝
nfs客/服兩主機(jī)都作為Kerberos客戶機(jī),兩主機(jī)安裝Kerberos客戶端的過(guò)程及配置都完全一樣
root@debian:~# apt-get install heimdal-clients krb5-config

安裝后,修改配置文件krb5.conf

Kerberos客戶機(jī)配置/etc/krb5.conf內(nèi)容
[libdefaults]
#--v--
allow_weak_crypto = true
#--^--
default_realm = CTP.NET

#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

#The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true

[realms]
CTP.NET = {
kdc = 192.168.1.101
admin_server = 192.168.1.101

#--v-- 客戶機(jī)可不用設(shè),可注釋掉
#kpasswd_server = 192.168.1.101
#--^--
}

[domain_realm]

[login]
krb4_convert = true
krb4_get_tickets = false

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI