Kerberos+LDAP+NFSv4 實現單點登陸(上)數據庫
Kerberos : 身份認證
LDAP : 目錄信息服務
NFSv4 : 網絡共享後端
實驗環境 : debian 9api
三臺主機:
nfs服務器 : 192.168.1.103
nfs客戶機 : 192.168.1.102 即SSSD客戶端+NFS客戶端
kdc服務器 : 192.168.1.101 即Kerberos+LDAPbash
如下服務器
root@debian:~# 表示以root根用戶運行命令
一.安裝NTP時間同步
要使用Kerberos提供身份認證,各主機需時間同步網絡
在一臺主機上安裝時間同步服務器root@debian:~# apt-get install ntp
dom
在其它主機上安裝時間同步客戶端root@debian:~# apt-get install ntpdate
ide
二.配置本地域
假定域是ctp.net
安裝Kerberos、LDAP過程都會用到域,NFSv4認證須要到域工具
以上三臺主機的/etc/hosts文件內容都配置以下:
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 clnfpost
注意:127.0.1.1必定要xxx.ctp.net的格式,以肯定域ctp.net
root@debian:~# hostname -d ctp.net
或
root@debian:~# dnsdomainname ctp.net
三.kdc服務器的安裝
安裝Kerberos和LDAP,Kerberos和LDAP在同一主機上
1.安裝LDAProot@debian:~# apt-get install slapd ldap-utils
slapd : OpenLDAP服務器
ldap-utils : ldap命令工具
安裝過程當中僅要求設置密碼,該密碼是ldap數據庫管理員密碼.設置LDAP的域默認是由hostname -d得到(即ctp.net)
安裝過程預先添加了四個模式
core.ldif
cosine.ldif
nis.ldif
inetorgperson.ldif
安裝過程初始化了配置數據庫(cn=config)和ldap數據庫(dc=ctp,dc=net)
1)配置ssl
因SSSD客戶端要求ssl鏈接,因此需配置LDAP啓用ssl
爲了簡便,創建免短語密碼永不過時證書
使用gnutls-bin工具建證書root@debian:~# apt-get install gnutls-bin
1.1)建根證書
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:~#
說明:-1表示永不過時
進行自簽名
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)建服務器證書
爲了簡便,證書都不設置機器名
生成私鑰
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:~#
簽發服務器證書
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
複製私鑰、證書
root@debian:~# cp fgcert.pem /etc/ldap/ssl/ root@debian:~# cp fgkey.pem /etc/ldap/ssl/private/
設置私鑰屬性爲僅openldap用戶擁有可讀(因debian的openldap是以openldap用戶運行)
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的配置沒有使用傳統的slapd.conf文件,而是操做方式猶如ldap數據庫的配置數據庫,在/etc/ldap/slapd.d/目錄下,結構井井有條的目錄及ldif文件.
安裝LDAP安裝後,雖已預先建立了配置數據庫管理員,但沒設密碼,仍不可以使用.但也已設置了容許root根用戶經過EXTERNAL認證方式讀寫配置數據庫,因此本實驗在root根用戶下運行ldap命令工具.
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)設置ACL訪問控制列表
本實驗使用ldap數據庫做爲Kerberos數據庫後端,Kerberos訪問LDAP有兩種方式:
方式1: Kerberos經過綁定ldap數據庫管理員訪問ldap數據庫.能夠作到Kerberos、LDAP在各自的主機上,但Kerberos上必需存儲明文的ldap數據庫管理員密碼
方式2: Kerberos和LDAP在同一主機上,Kerberos經過EXTERNAL認證方式訪問ldap數據庫,無需綁定任何ldap數據庫用戶
爲避免存儲任何明文的密碼,因此本實驗採用第2種方式
Kerberos進程是以root根用戶運行,因此必需設置openldap的ACL容許root根用戶進程讀寫ldap數據庫.
設置ACL是設置olcAccess的值,因olcAccess是多值的屬性,本人不懂得ldapmodify命令如何修改多值的屬性中的某個值.
請使用ldap客戶端工具(如luma)鏈接到配置數據庫修改條目olcDatabase={1}mdb,cn=config的olcAccess屬性
或
直接修改文件(雖不推薦,修改後要重啓openldap,本實驗使用此方式)
修改/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根用戶即可運行相似 ldapadd -Y EXTERNAL -H ldapi:/// -f xxx.ldif 命令讀寫ldap數據庫.
也即Kerberos進程便有權限寫ldap數據庫,無需綁定LDAP數據庫管理員.
2.安裝Kerberosroot@debian:~# apt-get install heimdal-kdc heimdal-clients krb5-config
heimdal-kdc : Kerberos服務器
heimdal-clients : Kerberos客戶端
kdc服務器需Kerberos服務端和客戶端
Kerberos安裝後,修改配置文件kdc.conf、krb5.conf
1)Kerberos服務端配置/etc/heimdal-kdc/kdc.conf內容
[logging]
kdc = FILE:/var/log/heimdal-kdc.log
[kdc]
database = {
#--v-- 指定使用ldap數據庫做爲Kerberos數據庫,缺省EXTERNAL認證
dbname = ldap:ou=hdkrb5,dc=ctp,dc=net
#--^--
acl_file = /etc/heimdal-kdc/kadmind.acl
#--v-- 使用ldap數據庫做爲後端時,並要使用kpasswdd必需加下面兩行.
mkey_file = /var/lib/heimdal-kdc/m-key
realm = CTP.NET
#--^-- ( 如openldap啓用了slapd-smbk5pwd同步密碼,
#上面兩行也解決了同步出錯問題,但必需將/var/lib/heimdal-kdc/m-key改成openldap用戶擁有)
#本實驗就不啓用slapd-smbk5pwd了,沒必要修改/var/lib/heimdal-kdc/m-key擁有者
}
[kadmin]
[password_quality]
2)Kerberos客戶端配置/etc/krb5.conf內容
[libdefaults]
#--v-- 爲支持NFSv4,而NFSv4只支持弱加密,kdc服務器及Kerberos客戶機都需配置下面一行
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服務器及客戶機的krb5.conf原配置啓用了下面兩行,客戶機鏈接到kdc服務器就出錯
#猜想緣由多是在建立Principal時一路缺省,而缺省是disallow-proxiable,disallow-forwardable
#所以客戶機和kdc服務器都要註釋掉下面兩行
#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服務器上要運行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.安裝schema2ldifroot@debian:~# apt-get install schema2ldif
schema2ldif : schema到ldif轉換工具
LDAP模式一般同時提供schema和ldif兩個文件,但heimdal-kdc只提供hdb.schema文件,沒提供LDIF格式文件
openldap添加heimdal模式,模式文件在/etc/ldap/schema/hdb.schema
1)轉換格式
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.添加數據庫記錄
上面完成了kdc服務器的安裝配置,下面開始操做數據庫
1)ldap數據庫添加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數據庫管理員的密碼(在安裝openldap時設置的密碼) adding new entry "ou=hdkrb5,dc=ctp,dc=net" root@debian:~#
2)初始化Kerberos數據庫
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: 設定密碼
Verify password - krblinlin@CTP.NET's Password:
4)在kdc服務器上測試kpasswd修改密碼
以普通用戶登陸kdc
linlin@debian:~$ kpasswd krblinlin krblinlin@CTP.NET's Password: 輸入正確的密碼 New password for krblinlin@CTP.NET: 重設定密碼 Verify password - New password for krblinlin@CTP.NET: Success : Password changed linlin@debian:~$
5)爲用戶krblinlin添加posixAccount對象類
posixAccount對象類在nis模式中
新建文件unix.ldif並編輯
注:在用kadmin命令新增Kerberos用戶,即也在ldap數據庫新增了條目(含krb5Key等屬性),該條目已有uid屬性,因此添加posixAccount對象類沒必要再加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屬性應是包含Kerberos密碼信息.
因此該條目有兩套不一樣的密碼體系,Kerberos和LDAP
6)添加nfs服務器
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成爲應用服務器
kadmin> ext -k /home/linlin/srv/krb5.keytab nfs/srvnf.ctp.net
導出keytab
經過U盤將krb5.keytab複製到nfs服務器的/etc目錄下,確保krb5.keytab權限爲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客戶機
root@debian:~# kadmin -l kadmin> add -r host/clnf.ctp.net
一路回車缺省,此是客戶機,不是應用服務器,無需刪除disallow-svr
kadmin> ext -k /home/linlin/cl/krb5.keytab host/clnf.ctp.net
經過U盤將krb5.keytab複製到nfs客戶機的/etc目錄下,確保krb5.keytab權限爲root擁有,僅root可讀
四.Kerberos客戶機的安裝
nfs客/服兩主機都做爲Kerberos客戶機,兩主機安裝Kerberos客戶端的過程及配置都徹底同樣root@debian:~# apt-get install heimdal-clients krb5-config
安裝後,修改配置文件krb5.conf
Kerberos客戶機配置/etc/krb5.conf內容
[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-- 客戶機可不用設,可註釋掉
#kpasswd_server = 192.168.1.101
#--^--
}
[domain_realm]
[login]krb4_convert = truekrb4_get_tickets = false