共計(jì) 10531 個(gè)字符,預(yù)計(jì)需要花費(fèi) 27 分鐘才能閱讀完成。
Kerberos+LDAP+NFSv4 怎樣實(shí)現(xiàn)單點(diǎn)登錄,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
Kerberos+LDAP+NFSv4 實(shí)現(xiàn)單點(diǎn)登錄
六.nfs 客戶機(jī)的安裝
nfs 客戶機(jī)也即 SSSD 客戶機(jī), 需安裝 sssd 和 nfs-common
1. 安裝 sssd
會(huì)自動(dòng)安裝 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 根用戶可讀寫, 否則無法啟動(dòng) sssd)
修改配置文件 sssd.conf、nsswitch.conf
1)查看 sssd.conf
root@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– 用戶認(rèn)證及密碼修改由 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– 有的環(huán)境不設(shè)總無法認(rèn)證, 應(yīng)該密碼認(rèn)證要很長時(shí)間, 需設(shè)超時(shí)時(shí)間大一點(diǎn)
krb5_auth_timeout = 60
#–^–
root@debian:~#
2)查看 nsswitch.conf
root@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 時(shí)自動(dòng)設(shè)置 /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.so
linlin@debian:~$
4)重啟 sssd
root@debian:~# /etc/init.d/sssd stop
root@debian:~# /etc/init.d/sssd start
5)測試
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:~$
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 要很長時(shí)間
krblinlin@debian:/home/linlin$
登錄成功, 修改密碼命令 kpasswd、passwd 都成功. 注意密碼是 Kerberos 密碼, 非 LDAP 密碼
但某些環(huán)境存在一個(gè)問題, 當(dāng) kdc 服務(wù)器重啟,SSSD 客戶機(jī)無法登錄, 需手工在 kdc 服務(wù)器上重啟守護(hù)進(jìn)程 heimdal-kdc, 還找不到原因. 而另試另外環(huán)境很正常
2. 安裝 nfs-common
root@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)掛載網(wǎng)絡(luò)共享
手工掛載
root@debian:~# mount -t nfs4 srvnf.ctp.net:/home/linlin/share /mnt -o sec=krb5
或
添加到 /etc/fstab, 一開機(jī)掛載網(wǎng)絡(luò)共享
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
# 添加網(wǎng)絡(luò)共享
srvnf.ctp.net:/home/linlin/share /mnt nfs4 rw,sec=krb5
root@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)測試寫網(wǎng)絡(luò)共享
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:
或控制臺(tái)直接登錄
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 作為存儲(chǔ)用戶信息, 以 Kerberos 作為身份認(rèn)證,SSSD 客戶機(jī)已成功訪問讀寫 NFSv4 服務(wù)器網(wǎng)絡(luò)共享
七. 后記
本文的目的是要打造一個(gè)類似 FreeIPA、AD 活動(dòng)目錄, 而完善的 Kerberos 系統(tǒng)還需 DNS、DHCP 配合, 所以本文也僅僅實(shí)驗(yàn)而已.
實(shí)現(xiàn)單點(diǎn)登錄的方案多種多樣.LDAP 同時(shí)也提供簡單用戶認(rèn)證, 如果不需應(yīng)用 NFSv4 或 NFSv4 采用弱的系統(tǒng)認(rèn)證, 無需搭建 Kerberos, 僅 LDAP 就可滿足單點(diǎn)登錄; 而 samba4 可輕松打造一個(gè) linux 下的活動(dòng)目錄.
1.
Kerberos 系統(tǒng)最初由麻省理工開發(fā), 即 MIT Kerberos 項(xiàng)目 (http://web.mit.edu/kerberos/), 當(dāng)前很活躍
另一 Kerberos 系統(tǒng)即本文的 Heimdal Kerberos 項(xiàng)目(http://www.h6l.org/).
為何本文選 Heimdal 而不選 MIT, 前文已講過, 一是使用 LDAP 作為 Kerberos 后端, 二是避免存儲(chǔ)明文的 ldap 數(shù)據(jù)庫管理員密碼.
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 有關(guān) LDAP_OPT_X_SASL_AUTHZID, 雖 MIT 源碼有 ldap_get_option, 但里邊是幾個(gè)寫死的 LDAP_OPT_xxxx, 與認(rèn)證無關(guān), 也沒找到和 SASL 相關(guān)
2)Heimdal 內(nèi)置支持 LDAP 作為后端, 缺省支持 EXTERNAL, 查看源碼簡單明了
rc = ldap_sasl_bind_s(HDB2LDAP(db), NULL, EXTERNAL , bv,NULL, NULL, NULL);
3)openldap 的同步密碼插件只支持 Heimdal
2.openldap 同步密碼
當(dāng)有時(shí)以 Kerberos 登錄, 有時(shí)要以 LDAP 登錄, 要維護(hù)記住兩套密碼是麻煩的事情. 有 3 種方法可只使用一個(gè)密碼
方法 1:
使用 {SASL} 方式, 需配置如下面
root@debian:~# cat /etc/sasl2/slapd.conf
pwcheck_method: saslauthd
root@debian:~#
userPassword 屬性填上固定值 {SASL}
此方法是搜索網(wǎng)上的方法, 本人未試過.
方法 2 和方法 3: 安裝 openldap 的同步密碼插件 slapd-smbk5pwd
方法 2:
userPassword 屬性填上固定值 {K5KEY}
方法 2 和方法 1 都要注意不要改動(dòng)到 userPassword 屬性的值, 并且修改密碼只能用 Kerberos 方式
方法 3:
修改密碼只能用 LDAP 方式, 且只能用類似 ldappasswd 命令的方式, 同時(shí)修改了 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 一擴(kuò)展操作, 詳細(xì)請(qǐng)參考 RFC 3062.
我對(duì) ldappasswd 的理解應(yīng)該是發(fā)送未經(jīng)散列的明文密碼到 LDAP 服務(wù)器, 由 LDAP 服務(wù)器自己散列成密文存儲(chǔ)到 ldap 數(shù)據(jù)庫.
而普通 ldap 修改密碼是要自己在客戶端將明文密碼散列成密文,LDAP 服務(wù)器不再變換而存儲(chǔ)到 ldap 數(shù)據(jù)庫, 也就是說本來 LDAP 的密碼屬性和其它屬性沒什么區(qū)別, 普通 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 原權(quán)限是 root 擁有, 僅 root 讀寫. 而 openldap 是以 openldap 用戶啟動(dòng).
如不先改 m -key 權(quán)限, 而先執(zhí)行步驟 5), 則會(huì)因無權(quán)限而 ldapadd 出錯(cuò)
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 文件權(quán)限問題, 所以還是重啟 openldap 為好
7)測試
以普通本地用戶登錄
linlin@debian:~$ ldappasswd -h 192.168.1.101 -D krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net -W -S
New password:
Re-enter new password:
Enter LDAP Password: 老密碼(LDAP 用戶的密碼, 不是指 Kerberos 用戶密碼)
linlin@debian:~$
這樣修改 LDAP 用戶的密碼同時(shí)也修改了 Kerberos 用戶密碼, 用 Kerberos 用戶密碼登錄也正常
注意 /var/lib/heimdal-kdc/m-key 文件權(quán)限要確保正確(否則雖 ldappasswd 提示成功, 但實(shí)際 krb5Key 屬性的值是破損的, 無法以 Kerberos 用戶密碼登錄)
3. 因 LDAP 安裝過程自動(dòng)設(shè)置了可匿名讀取除 userPassword 外的其它屬性, 而 krb5Key 屬性應(yīng)是包含 Kerberos 密碼信息, 是否需設(shè)置非本 Kerberos 用戶禁止讀取 krb5Key ?
本人不才, 未見有相關(guān)資料有明確設(shè)置禁止, 是不是即使 krb5Key 被非法獲取, 沒有 /var/lib/heimdal-kdc/m-key 也無法破解密碼嗎?
4. 設(shè)置非本地用戶 SSSD 登錄自動(dòng)創(chuàng)建用戶目錄
上面的實(shí)驗(yàn) krblinlin 登錄到客戶機(jī), 該客戶機(jī)不存在 krblinlin 的用戶目錄.
可使用 pam_mkhomedir.so 來自動(dòng)創(chuàng)建用戶目錄,pam_mkhomedir.so 在 libpam-modules 包中
1)安裝
root@debian:~# apt-get install libpam-modules
2)到 /etc/pam.d/common-session 中增加一行 pam_mkhomedir.so, 內(nèi)容大致如下
…
session required pam_unix.so
#–v– 新增一行, 自動(dòng)創(chuàng)建用戶目錄
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 . 已正常首次登錄創(chuàng)建用戶目錄
krblinlin@debian:~$
krblinlin@debian:~$ pwd
/home/krblinlin
krblinlin@debian:~$
5. 文件系統(tǒng)的 ACL(訪問控制列表)
雖說 NFSv4 的是 NFSv4 acl, 但本實(shí)驗(yàn)仍是 posix acl, 猜測 NFSv4 acl 可能需本地文件系統(tǒng)支持吧, 好象只有 zfs 本地文件系統(tǒng)才支持 NFSv4 acl
6. 域
LDAP 域和 Kerberos 域可以不同
即 Kerberos 的 realm 是 CTP.NET
LDAP 的基本 DN 可以是 dc=oled,dc=com
7. 其它
debian 9 安裝 openldap 過程是使用 mdb 作為 LDAP 的后端, 而 LDAP 還可選 hdb 等其它作為后端. 選不同的后端, 其配置目錄、文件名稱及配置數(shù)據(jù)庫條目內(nèi)容按后端名稱
如本實(shí)驗(yàn)是 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 后的
如要重新創(chuàng)建 ldap 數(shù)據(jù)庫
root@debian:~# dpkg-reconfigure slapd
配置過程中假如選 hdb 作為后端, 則相關(guān)內(nèi)容是 hdb
查看 ldap 數(shù)據(jù)庫
root@debian:~# slapcat
查看配置數(shù)據(jù)庫
root@debian:~# slapcat -b cn=config
八. 修正
實(shí)驗(yàn)時(shí)的環(huán)境是 debian 9 testing 版
第三章節(jié)第 1 小節(jié)的 2)設(shè)置 ACL 訪問控制列表, 那行 將
olcAccess: {2}to * by self write by dn= cn=admin,dc=ctp,dc=net write by * read
不記得是 openldap 安裝包腳本本身設(shè)定的, 還是我自己弄錯(cuò), 原 改為 那行也照抄 to * by self write
這是嚴(yán)重的漏洞及錯(cuò)誤. to * by self write 會(huì)允許 ldap 用戶修改本身?xiàng)l目的任何屬性,
如 ldap 用戶可將自己的 unix 的 uidNumber 設(shè)為 0 即根用戶, 這很危險(xiǎn), 即普通用戶可以提權(quán)自己 (雖然 ldap 客戶機(jī)默認(rèn)配置將 ldap 的 uidNumber 值為 0 映射為非根用戶) 或冒充其他用戶.
所以, 原則 ldap 用戶只允許修改本身及只能修改密碼屬性, 其他屬性只能由管理員設(shè)置.
因此, 原 改為 那行
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
實(shí)際是需改為
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
本文已作了修正
附 debian 10 testing 版 openldap 安裝后未經(jīng) 改為 的原始完整 olcAccess 配置
olcSuffix: dc=ctp,dc=net
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=ctp,dc=net
關(guān)于 Kerberos+LDAP+NFSv4 怎樣實(shí)現(xiàn)單點(diǎn)登錄問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識(shí)。