Kerberos+LDAP+NFSv4 實現單點登錄
Kerberos : 身份認證
LDAP : 目錄信息服務
NFSv4 : 網絡共享
實驗環境 : debian 9
三臺主機:
nfs服務器 : 192.168.1.103
nfs客戶機 : 192.168.1.102 即SSSD客戶端+NFS客戶端
kdc服務器 : 192.168.1.101 即Kerberos+LDAP
以下
root@debian:~#
表示以root根用戶運行命令
一.安裝NTP時間同步
要使用Kerberos提供身份認證,各主機需時間同步
在一臺主機上安裝時間同步服務器root@debian:~# apt-get install ntp
在其它主機上安裝時間同步客戶端root@debian:~# apt-get install ntpdate
二.配置本地域
假定域是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 clnf
註意: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 self write 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: [email protected]
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]:
上面一路回車缺省
[email protected]‘s Password: 設定密碼
Verify password - [email protected]‘s Password:
4)在kdc服務器上測試kpasswd修改密碼
以普通用戶登錄kdc
linlin@debian:~$ kpasswd krblinlin
[email protected]‘s Password: 輸入正確的密碼
New password for [email protected]: 重設定密碼
Verify password - New password for [email protected]:
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: [email protected],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 "[email protected],ou=hdkrb5,dc=ctp,dc=net"
條目([email protected],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 = true
krb4_get_tickets = false
五.nfs服務器的安裝
1.安裝nfs-kernel-serverroot@debian:~# apt-get install nfs-kernel-server nfs-common
修改/etc/default/nfs-kernel-server文件
將
NEED_SVCGSSD=""
改為
NEED_SVCGSSD="yes"
重啟nfs-kernel-server
root@debian:~# /etc/init.d/nfs-kernel-server stop
root@debian:~# /etc/init.d/nfs-kernel-server start
root@debian:~# ps -e |grep gss
10275 ? 00:00:00 rpc.svcgssd
2.安裝libnss-ldapd、nslcd
為了獲取ldap用戶信息,要安裝libnss-ldapd、nslcd
在新立得選上libnss-ldapd、nslcd會自動將libpam-ldapd、nscd、nslcd-utils三個包打上安裝標記,可手工將該三個包去掉安裝標記,不需此三個包
root@debian:~# apt-get install libnss-ldapd nslcd
註意安裝nslcd配置過程中,提示輸入LDAP服務器地址的輸入框默認了uri ldapi:/// ,一定要將 ldapi 改為 ldap ,因為ldapi:///表示用在unix域
1)nslcd
安裝過程中
ldap server uri 填 ldap://192.168.1.101/
ldap服務器搜索起點 填 dc=ctp,dc=net
查看配置文件
root@debian:~# cat /etc/nslcd.conf
#The user and group nslcd should run as.
uid nslcd
gid nslcd
#The location at which the LDAP server(s) should be reachable.
#填LDAP服務器地址,即kdc服務器地址
uri ldap://192.168.1.101/
#The search base that will be used for all queries.
base dc=ctp,dc=net
root@debian:~#
2)libnss-ldapd
安裝過程中
name services to configure 選 [*] passwd
新建測試目錄root@debian:~# mkdir /home/linlin/share
將該目錄屬性改為用戶ID及用戶組ID都為4001,即為ldap用戶krblinlin的uidNumber/gidNumber,但並在nfs客/服兩主機本地不存在該ID用戶root@debian:~# chown 4001:4001 /home/linlin/share
2.1)假定沒選[*] passwd
linlin@debian:~$ ls -ld /home/linlin/share
drwxr-xr-x 2 4001 4001 4096 9月 18 21:13 /home/linlin/share
則取不到ldap用戶信息
2.2)可重設libnss-ldapd,選上[*] passwdroot@debian:~# dpkg-reconfigure libnss-ldapd
...
┌───────────┤ 正在設定 libnss-ldapd ├──────────────────────────┐
│ For this package to work, you need to modify the /etc/nsswitch.conf file to use the ldap datasource. │
│ You can select the services that should have LDAP lookups enabled. The new LDAP lookups will be added│
│as the last datasource. Be sure to review these changes. │
│ Name services to configure: │
│ [ ] hosts │
│ [ ] netgroup │
│ [ ] networks │
│ [*] passwd │
│ [ ] protocols
...
/etc/nsswitch.conf: enable LDAP lookups for passwdroot@debian:~#
查看配置文件,可見passwd一行後添加了ldap
root@debian:~# cat /etc/nsswitch.conf
passwd: compat ldap
group: compat
shadow: compat
gshadow: files
hosts: files mdns4_minimal [NOTFOUND=return] dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
root@debian:~#
linlin@debian:~$ ls -ld /home/linlin/share
drwxr-xr-x 2 krblinlin 4001 4096 9月 18 21:13 /home/linlin/share
則已獲取顯示ldap用戶信息,krblinlin為ldap用戶,同時也是Kerberos用戶
獲取用戶信息很重要,因為nfs客/服兩端的認證用戶信息要匹配,即兩邊的域+用戶名要一致
註:本實驗只獲取ldap用戶的用戶名,無法獲取ldap用戶的所屬用戶組名(如上仍顯示用戶組ID 4001),但不影響實驗效果
3.網絡共享
本實驗目的NFSv4認證采用安全性強的gss/krb5認證(Kerberos),而不是弱的系統認證(AUTH_SYS)
編輯/etc/exports文件
root@debian:~# cat /etc/exports
/home/linlin/share gss/krb5(rw,sync,no_subtree_check)
root@debian:~#
執行導出root@debian:~# exportfs -r
查看導出
root@debian:~# exportfs -v
/home/linlin/share
gss/krb5(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
root@debian:~#
4.問題解決
nfs服務器沒有啟動rpc.idmapd,導致nfs客戶機沒寫權限
1)
root@debian:~# rpc.idmapd
rpc.idmapd: libnfsidmap: using (default) domain: ctp.net
rpc.idmapd: libnfsidmap: Realms list: ‘CTP.NET‘
rpc.idmapd: libnfsidmap: loaded plugin /lib/x86_64-linux-gnu/libnfsidmap/nsswitch.so for method nsswitch
root@debian:~# ps -e|grep rpc
634 ? 00:00:00 rpciod
757 ? 00:00:00 rpcbind
1188 ? 00:00:00 rpc.svcgssd
1261 ? 00:00:00 rpc.mountd
root@debian:~#
手工運行rpc.idmapd仍沒啟動rpc.idmapd
2)
原來nfs服務器的nfs-common要重啟
root@debian:~# /etc/init.d/nfs-common stop
root@debian:~# /etc/init.d/nfs-common start
root@debian:~# ps -e|grep rpc
634 ? 00:00:00 rpciod
757 ? 00:00:00 rpcbind
14256 ? 00:00:00 rpc.svcgssd
14258 ? 00:00:00 rpc.mountd
15023 ? 00:00:00 rpc.statd
15041 ? 00:00:00 rpc.idmapd
root@debian:~#
nfs客戶機已可寫權限了
六.nfs客戶機的安裝
nfs客戶機也即SSSD客戶機,需安裝sssd和nfs-common
1.安裝sssd
會自動安裝libsasl2-modules-gssapi-mit(非依賴)
libsasl2-modules-gssapi-mit和libsasl2-modules-gssapi-heimdal兩者沖突,安裝libsasl2-modules-gssapi-heimdal也可以
root@debian:~# apt-get install sssd sssd-krb5 sssd-ldap libsasl2-modules-gssapi-heimdal
安裝後的sssd.conf是空白文件,nsswitch.conf沒改變
root@debian:~# ls -l /etc/sssd/sssd.conf
-rw------- 1 root root 1938 Jun 10 11:18 /etc/sssd/sssd.conf
僅擁有者可讀(SSSD文檔要求sssd.conf僅root根用戶可讀寫,否則無法啟動sssd)
修改配置文件sssd.conf、nsswitch.conf
1)查看sssd.confroot@debian:~# cat /etc/sssd/sssd.conf
[sssd]
config_file_version = 2
services = nss, pam
domains = intern
[nss]
[pam]
[domain/intern]
#--v-- unix用戶信息由LDAP提供
id_provider = ldap
#--^--
#--v-- 用戶認證及密碼修改由Kerberos提供
auth_provider = krb5
chpass_provider = krb5
#--^--
ldap_uri = ldap://192.168.1.101
ldap_search_base = ou=hdkrb5,dc=ctp,dc=net
ldap_tls_reqcert = allow
krb5_server = 192.168.1.101
krb5_realm = CTP.NET
#--v-- 有的環境不設總無法認證,應該密碼認證要很長時間,需設超時時間大一點
krb5_auth_timeout = 60
#--^--root@debian:~#
2)查看nsswitch.confroot@debian:~# cat /etc/nsswitch.conf
passwd: files sss
group: files sss
shadow: files sss
gshadow: files
hosts: files mdns4_minimal [NOTFOUND=return] dns
networks: files
protocols: db files
services: db files sss
ethers: db files
rpc: db files
netgroup: nis sss
sudoers: files sss
root@debian:~#
即將原來的compat改為files sss
3)安裝sssd時自動設置/etc/pam.d/linlin@debian:~$ cat /etc/pam.d/common-session-noninteractive
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session required pam_unix.so
session optional pam_umask.so umask=002
linlin@debian:~$
linlin@debian:~$ cat /etc/pam.d/common-session
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session required pam_unix.so
session optional pam_sss.so
session optional pam_systemd.so
session optional pam_umask.so umask=002
linlin@debian:~$
linlin@debian:~$ cat /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3
password [success=2 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512
password sufficient pam_sss.so use_authtok
password requisite pam_deny.so
password required pam_permit.so
password optional pam_gnome_keyring.so
linlin@debian:~$
linlin@debian:~$ cat /etc/pam.d/common-auth
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_sss.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_group.so
linlin@debian:~$
linlin@debian:~$ cat /etc/pam.d/common-account
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
account sufficient pam_localuser.so
account [default=bad success=ok user_unknown=ignore] pam_sss.solinlin@debian:~$
4)重啟sssd
root@debian:~# /etc/init.d/sssd stop
root@debian:~# /etc/init.d/sssd start
5)測試linlin@debian:~$ kpasswd krblinlin
[email protected]‘s Password:
New password for [email protected]:
Verify password - New password for [email protected]:
Success : Password changed
linlin@debian:~$
linlin@debian:~$ su krblinlin
Password:
krblinlin@debian:/home/linlin$
krblinlin@debian:/home/linlin$ passwd
Current Password:
New password:
BAD PASSWORD: The password is shorter than 8 characters
New password:
Retype new password:
passwd: password updated successfully 要很長時間krblinlin@debian:/home/linlin$
登錄成功,修改密碼命令kpasswd、passwd都成功.註意密碼是Kerberos密碼,非LDAP密碼
但某些環境存在一個問題,當kdc服務器重啟,SSSD客戶機無法登錄,需手工在kdc服務器上重啟守護進程heimdal-kdc,還找不到原因.而另試另外環境很正常
2.安裝nfs-commonroot@debian:~# apt-get install nfs-common
修改/etc/default/nfs-common文件
將
NEED_GSSD=
改為
NEED_GSSD="yes"
root@debian:~# /etc/init.d/nfs-common stop
root@debian:~# /etc/init.d/nfs-common start
root@debian:~# ps -e |grep gss
1027 ? 00:00:00 rpc.gssd
1)掛載網絡共享
手工掛載
root@debian:~# mount -t nfs4 srvnf.ctp.net:/home/linlin/share /mnt -o sec=krb5
或
添加到/etc/fstab,一開機掛載網絡共享root@debian:~# cat /etc/fstab
UUID=c992cbf5-3eca-4434-baf9-b5a3180acdbb / ext4 errors=remount-ro 0 1
#swap was on /dev/sda5 during installation
UUID=854aa36b-6ce5-436d-91fa-50aa10e8338c none swap sw 0 0
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
#添加網絡共享
srvnf.ctp.net:/home/linlin/share /mnt nfs4 rw,sec=krb5 0 0root@debian:~#
2)查看掛載信息linlin@debian:~$ mount|grep nfs
srvnf.ctp.net:/home/linlin/share on /mnt type nfs4 (rw,relatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=krb5,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.103)
3)測試寫網絡共享
root@debian:~# ls -ld /mnt
drwxr-xr-x 2 krblinlin 4001 4096 Sep 18 09:13 /mnt
root@debian:~#
可看到已獲取顯示ldap用戶信息,krblinlin為ldap用戶
在普通本地用戶下linlin@debian:~$ su krblinlin
Password:
或控制臺直接登錄
debian login: krblinlin
Password:
krblinlin@debian:/home/linlin$ cd /mnt
krblinlin@debian:/mnt$ touch a.txt
krblinlin@debian:/mnt$ ls
a.txt
krblinlin@debian:/mnt$
寫成功
root@debian:~# ps -e |grep idmapd
533 ? 00:00:00 rpc.idmapd
至此,以LDAP作為存儲用戶信息,以Kerberos作為身份認證,SSSD客戶機已成功訪問讀寫NFSv4服務器網絡共享
七.後記
本文的目的是要打造一個類似FreeIPA、AD活動目錄,而完善的Kerberos系統還需DNS、DHCP配合,所以本文也僅僅實驗而已.
實現單點登錄的方案多種多樣.LDAP同時也提供簡單用戶認證,如果不需應用NFSv4或NFSv4采用弱的系統認證,無需搭建Kerberos,僅LDAP就可滿足單點登錄;而samba4可輕松打造一個linux下的活動目錄.
1.
Kerberos系統最初由麻省理工開發,即MIT Kerberos項目 ( http://web.mit.edu/kerberos/ ),當前很活躍
另一Kerberos系統即本文的Heimdal Kerberos項目( http://www.h5l.org/ ).
為何本文選Heimdal而不選MIT,前文已講過,一是使用LDAP作為Kerberos後端,二是避免存儲明文的ldap數據庫管理員密碼.
1)MIT通過插件支持LDAP作為後端,文檔也說明支持EXTERNAL,但我搞不掂配置怎支持EXTERNAL,查看源碼也看不出頭緒
st = ldap_sasl_interactive_bind_s(server->ldap_handle, NULL,ctx->sasl_mech, NULL, NULL,LDAP_SASL_QUIET, interact, ctx);
通過配置文件將"EXTERNAL"傳遞到ctx->sasl_mech
查找了資料好象ldap_sasl_interactive_bind_s 使用 EXTERNAL 之前要先ldap_get_option有關LDAP_OPT_X_SASL_AUTHZID,雖MIT源碼有ldap_get_option,但裏邊是幾個寫死的LDAP_OPT_xxxx,與認證無關,也沒找到和SASL相關
2)Heimdal內置支持LDAP作為後端,缺省支持EXTERNAL,查看源碼簡單明了
rc = ldap_sasl_bind_s(HDB2LDAP(db), NULL, "EXTERNAL", &bv,NULL, NULL, NULL);
3)openldap的同步密碼插件只支持Heimdal
2.openldap同步密碼
當有時以Kerberos登錄,有時要以LDAP登錄,要維護記住兩套密碼是麻煩的事情.有3種方法可只使用一個密碼
方法1:
使用{SASL}方式,需配置如下面
root@debian:~# cat /etc/sasl2/slapd.conf
pwcheck_method: saslauthd
root@debian:~#
userPassword屬性填上固定值{SASL}
此方法是搜索網上的方法,本人未試過.
方法2和方法3:安裝openldap的同步密碼插件slapd-smbk5pwd
方法2:
userPassword屬性填上固定值{K5KEY}
方法2和方法1都要註意不要改動到userPassword屬性的值,並且修改密碼只能用Kerberos方式
方法3:
修改密碼只能用LDAP方式,且只能用類似ldappasswd命令的方式,同時修改了userPassword、krb5Key .
ldappasswd is a tool to set the password of an LDAP user. ldappasswd uses the LDAPv3 Password Modify (RFC 3062) extended operation.
註意ldappasswd是LDAP一擴展操作,詳細請參考RFC 3062.
我對ldappasswd的理解應該是發送未經散列的明文密碼到LDAP服務器,由LDAP服務器自己散列成密文存儲到ldap數據庫.
而普通ldap修改密碼是要自己在客戶端將明文密碼散列成密文,LDAP服務器不再變換而存儲到ldap數據庫,也就是說本來LDAP的密碼屬性和其它屬性沒什麽區別,普通ldap修改密碼的方式就是如同修改其它屬性值.
方法3可做到Kerberos、LDAP、samba三套密碼同步
本文采用方式2或方式3
1)安裝
root@debian:~# apt-get install slapd-smbk5pwd
slapd-smbk5pwd : Keeps Samba and Kerberos passwords in sync within slapd
2)加載模塊
root@debian:~# cat smbk5pwd.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: smbk5pwd
root@debian:~#
root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f smbk5pwd.ldif
3)前面已安裝了heimdal-kdc,並LDAP已添加加了heimdal模式,因本文目的只要同步Heimdal,不同步samba,所以無需添加samba模式
4)將/var/lib/heimdal-kdc/m-key改為openldap用戶擁有
m-key原權限是root擁有,僅root讀寫.而openldap是以openldap用戶啟動.
如不先改m-key權限,而先執行步驟5),則會因無權限而ldapadd出錯
root@debian:~# chown openldap /var/lib/heimdal-kdc/m-key
5)啟用同步
root@debian:~# cat krb5.ldif
dn: olcOverlay=smbk5pwd,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSmbK5PwdConfig
olcOverlay: smbk5pwd
olcSmbK5PwdEnable: krb5
root@debian:~#
root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f krb5.ldif
6)重啟openldap
通常在線配置,是立即生效,但因/var/lib/heimdal-kdc/m-key文件權限問題,所以還是重啟openldap為好
7)測試
以普通本地用戶登錄
linlin@debian:~$ ldappasswd -h 192.168.1.101 -D "[email protected],ou=hdkrb5,dc=ctp,dc=net" -W -S
New password:
Re-enter new password:
Enter LDAP Password: 老密碼(LDAP用戶的密碼,不是指Kerberos用戶密碼)
linlin@debian:~$
這樣修改LDAP用戶的密碼同時也修改了Kerberos用戶密碼,用Kerberos用戶密碼登錄也正常
註意/var/lib/heimdal-kdc/m-key文件權限要確保正確(否則雖ldappasswd提示成功,但實際krb5Key屬性的值是破損的,無法以Kerberos用戶密碼登錄)
3.因LDAP安裝過程自動設置了可匿名讀取除userPassword外的其它屬性,而krb5Key屬性應是包含Kerberos密碼信息,是否需設置非本Kerberos用戶禁止讀取krb5Key ?
本人不才,未見有相關資料有明確設置禁止,是不是即使krb5Key被非法獲取,沒有/var/lib/heimdal-kdc/m-key也無法暴力破解密碼嗎?
4.設置非本地用戶SSSD登錄自動創建用戶目錄
上面的實驗krblinlin登錄到客戶機,該客戶機不存在krblinlin的用戶目錄.
可使用pam_mkhomedir.so來自動創建用戶目錄,pam_mkhomedir.so在libpam-modules包中
1)安裝root@debian:~# apt-get install libpam-modules
2)到/etc/pam.d/common-session中增加一行pam_mkhomedir.so,內容大致如下
...
session required pam_unix.so
#--v-- 新增一行,自動創建用戶目錄
session required pam_mkhomedir.so umask=0077
#--^--
session [success=ok default=ignore] pam_ldap.so minimum_uid=1000
...
3)登錄
debian login: krblinlin
Password:
Creating directory ‘/home/krblinlin‘.已正常首次登錄創建用戶目錄
krblinlin@debian:~$
krblinlin@debian:~$ pwd
/home/krblinlin
krblinlin@debian:~$
5.文件系統的ACL(訪問控制列表)
雖說NFSv4的是 NFSv4 acl,但本實驗仍是posix acl,猜測NFSv4 acl可能需本地文件系統支持吧,好象只有zfs本地文件系統才支持NFSv4 acl
6.域
LDAP域和Kerberos域可以不同
即Kerberos的realm是CTP.NET
LDAP的基本DN 可以是dc=oled,dc=com
7.其它
debian 9安裝openldap過程是使用mdb作為LDAP的後端,而LDAP還可選hdb等其它作為後端.選不同的後端,其配置目錄、文件名稱及配置數據庫條目內容按後端名稱
如本實驗是mdb
root@debian:~# apt-get install tree
root@debian:~# tree /etc/ldap/slapd.d
/etc/ldap/slapd.d
|-- cn=config
| |-- cn=module{0}.ldif
| |-- cn=schema
| | |-- cn={0}core.ldif
| | |-- cn={1}cosine.ldif
| | |-- cn={2}nis.ldif
| | |-- cn={3}inetorgperson.ldif
| |-- cn=schema.ldif
| |-- olcBackend={0}mdb.ldif
| |-- olcDatabase={-1}frontend.ldif
| |-- olcDatabase={0}config.ldif
| |-- olcDatabase={1}mdb.ldif
|-- cn=config.ldif
root@debian:~#
上面是剛安裝完openldap後的
如要重新創建ldap數據庫
root@debian:~# dpkg-reconfigure slapd
配置過程中假如選hdb作為後端,則相關內容是hdb
查看ldap數據庫
root@debian:~# slapcat
查看配置數據庫
root@debian:~# slapcat -b cn=config
Kerberos+LDAP+NFSv4 實現單點登錄