千家信息网

Kerberos+LDAP+NFSv4怎样实现单点登录

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Kerberos+LDAP+NFSv4怎样实现单点登录,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Kerberos+LDAP+NF
千家信息网最后更新 2026年11月01日Kerberos+LDAP+NFSv4怎样实现单点登录

Kerberos+LDAP+NFSv4怎样实现单点登录,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Kerberos+LDAP+NFSv4 实现单点登录

六.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.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-- 用户认证及密码修改由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 stoproot@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 krblinlinPassword: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 stoproot@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 /mntdrwxr-xr-x 2 krblinlin 4001 4096 Sep 18 09:13 /mntroot@debian:~#

可看到已获取显示ldap用户信息,krblinlin为ldap用户

在普通本地用户下
linlin@debian:~$ su krblinlin
Password:
或控制台直接登录
debian login: krblinlin
Password:

krblinlin@debian:/home/linlin$ cd /mntkrblinlin@debian:/mnt$ touch a.txtkrblinlin@debian:/mnt$ lsa.txtkrblinlin@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.h6l.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.confpwcheck_method: saslauthdroot@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.ldifdn: cn=module{0},cn=configchangetype: modifyadd: olcModuleLoadolcModuleLoad: smbk5pwdroot@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.ldifdn: olcOverlay=smbk5pwd,olcDatabase={1}mdb,cn=configchangetype: addobjectClass: olcOverlayConfigobjectClass: olcSmbK5PwdConfigolcOverlay: smbk5pwdolcSmbK5PwdEnable: krb5root@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 -SNew 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/krblinlinkrblinlin@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 treeroot@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.ldifroot@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=netolcAccess: {0}to attrs=userPassword by self write by anonymous auth by * noneolcAccess: {1}to attrs=shadowLastChange by self write by * readolcAccess: {2}to * by * readolcLastMod: TRUEolcRootDN: cn=admin,dc=ctp,dc=net

关于Kerberos+LDAP+NFSv4怎样实现单点登录问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

用户 密码 登录 属性 方法 配置 文件 客户 客户机 目录 支持 数据 数据库 方式 系统 同步 认证 服务器 服务 单点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 贷财互联网科技 无线互联网科技 顺玮阁互联网科技 深圳期待互联网科技 无锡溥仪互联网科技有限公司 互联网汽车科技小镇 济南华为互联网科技产业总部基地 哈尔滨新华互联网科技学院 中国科技互联网公司收入 湖南诚度互联网科技有限公司 宁夏科技产业互联网案例 玉溪互联网科技怎么选 注册互联网科技公司经营范围大全 米聚互联网科技南京有限公司排面 民营互联网公司国防科技 明优互联网科技有限公司 黑龙江互联网科技公司 承德科技产业互联网平台 高科技和互联网的现代国家 苏州找大状互联网科技有限公司 北京路客互联网科技有限公司 互联网与未来科技 互联网巨头投资的硬核科技 成都玖崟互联网科技有限公司乐商圈怎么样 创业天下互联网科技有限公司 互联网科技创新服务 广州有谷有贝互联网科技有限公司 西安有哪些互联网高科技企业 上海互联网科技园景观
0