Kerberos+LDAP+NFSv4 實現單點登陸(下)

Kerberos+LDAP+NFSv4 實現單點登陸(下)linux

六.nfs客戶機的安裝
nfs客戶機也即SSSD客戶機,需安裝sssd和nfs-commonweb

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沒改變api

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.conf
root@debian:~# cat /etc/sssd/sssd.conf
[sssd]
config_file_version = 2session

services = nss, pam
domains = internapp

[nss]frontend

[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.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時自動設置/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 要很長時間
krblinlin@debian:/home/linlin$

登陸成功,修改密碼命令kpasswd、passwd都成功.注意密碼是Kerberos密碼,非LDAP密碼

但某些環境存在一個問題,當kdc服務器重啓,SSSD客戶機沒法登陸,需手工在kdc服務器上重啓守護進程heimdal-kdc,還找不到緣由.而另試另外環境很正常

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)掛載網絡共享
手工掛載

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
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)測試寫網絡共享

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 "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用戶的密碼同時也修改了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

八.修正
實驗時的環境是 debian 9 testing 版
第三章節第1小節的2)設置ACL訪問控制列表,那行'將'

olcAccess: {2}to * by self write by dn="cn=admin,dc=ctp,dc=net" write by * read

不記得是openldap安裝包腳本自己設定的,仍是我本身弄錯,原'改成'那行也照抄to * by self write
這是嚴重的漏洞及錯誤.'to * by self write'會容許ldap用戶修改自己條目的任何屬性,
如ldap用戶可將本身的unix 的uidNumber設爲0即根用戶,這很危險,即普通用戶能夠提權本身(雖然ldap客戶機默認配置將ldap的uidNumber值爲0映射爲非根用戶)或冒充其餘用戶.
因此,原則ldap用戶只容許修改自己及只能修改密碼屬性,其餘屬性只能由管理員設置.

所以,原'改成'那行
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
實際是需改成
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安裝後未經'改成'的原始完整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
相關文章
相關標籤/搜索