Kerberos+LDAP+NFSv4 实现单点登录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kerberos+LDAP+NFSv4 实现单点登录相关的知识,希望对你有一定的参考价值。
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
以下
[email protected]:~#
表示以root根用户运行命令
一.安装NTP时间同步
要使用Kerberos提供身份认证,各主机需时间同步
在一台主机上安装时间同步服务器[email protected]:~# apt-get install ntp
在其它主机上安装时间同步客户端[email protected]:~# 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
[email protected]:~# hostname -d
ctp.net
或
[email protected]:~# dnsdomainname
ctp.net
三.kdc服务器的安装
安装Kerberos和LDAP,Kerberos和LDAP在同一主机上
1.安装LDAP[email protected]:~# 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工具建证书[email protected]:~# apt-get install gnutls-bin
1.1)建根证书
[email protected]:~# certtool --generate-privkey > cakey.pem
Generating a 3072 bit RSA private key...
新建文件ca.info并编辑
[email protected]:~# cat ca.info
ca
cert_signing_key
expiration_days = -1
[email protected]:~#
说明:-1表示永不过期
进行自签名
[email protected]:~# certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
Generating a self signed certificate...
...(略)
Signing certificate...
[email protected]:~#
1.2)建服务器证书
为了简便,证书都不设置机器名
生成私钥
[email protected]:~# certtool --generate-privkey > fgkey.pem
Generating a 3072 bit RSA private key...
新建文件srv.info并编辑
[email protected]:~# cat srv.info
tls_www_server
encryption_key
signing_key
expiration_days = -1
[email protected]:~#
签发服务器证书
[email protected]:~# 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...
[email protected]:~#
新建存放私钥的目录[email protected]:~# mkdir /etc/ldap/ssl/private
复制私钥、证书
[email protected]:~# cp fgcert.pem /etc/ldap/ssl/
[email protected]:~# cp fgkey.pem /etc/ldap/ssl/private/
设置私钥属性为仅openldap用户拥有可读(因debian的openldap是以openldap用户运行)
[email protected]:~# chown openldap /etc/ldap/ssl/private/fgkey.pem
[email protected]:~# 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
[email protected]:~#
[email protected]:~# chmod o-r /etc/ldap/ssl/private/fgkey.pem
[email protected]:~# 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并编辑
[email protected]:~# 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
[email protected]:~#
openldap的配置没有使用传统的slapd.conf文件,而是操作方式犹如ldap数据库的配置数据库,在/etc/ldap/slapd.d/目录下,结构层次分明的目录及ldif文件.
安装LDAP安装后,虽已预先创建了配置数据库管理员,但没设密码,仍不可使用.但也已设置了允许root根用户通过EXTERNAL认证方式读写配置数据库,所以本实验在root根用户下运行ldap命令工具.
[email protected]:~# 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
[email protected]:~# /etc/init.d/slapd stop
[email protected]:~# /etc/init.d/slapd start
重启openldap后,root根用户便可运行类似 ldapadd -Y EXTERNAL -H ldapi:/// -f xxx.ldif 命令读写ldap数据库.
也即Kerberos进程便有权限写ldap数据库,无需绑定LDAP数据库管理员.
2.安装Kerberos[email protected]:~# 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
[email protected]:~# /etc/init.d/heimdal-kdc stop
[email protected]:~# /etc/init.d/heimdal-kdc start
3.安装schema2ldif[email protected]:~# apt-get install schema2ldif
schema2ldif : schema到ldif转换工具
LDAP模式通常同时提供schema和ldif两个文件,但heimdal-kdc只提供hdb.schema文件,没提供LDIF格式文件
openldap添加heimdal模式,模式文件在/etc/ldap/schema/hdb.schema
1)转换格式[email protected]:~# schema2ldif /etc/ldap/schema/hdb.schema >hdb.ldif
2)在线添加模式
[email protected]:~# 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并编辑
[email protected]:~# cat krb5.ldif
dn: ou=hdkrb5,dc=ctp,dc=net
krb5PrincipalName: [email protected]
ou: hdkrb5
objectClass: krb5Principal
objectClass: organizationalUnit
[email protected]:~#
[email protected]:~# 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"
[email protected]:~#
2)初始化Kerberos数据库
[email protected]:~# kadmin -l
kadmin> init CTP.NET
花了两分钟
Realm max ticket life [unlimited]:
Realm max renewable ticket life [unlimited]:
...
上面一路回车缺省
kadmin> exit
退出kadmin
3)新增Kerberos用户[email protected]:~# 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
[email protected]:~$ kpasswd krblinlin
[email protected]‘s Password: 输入正确的密码
New password for [email protected]: 重设定密码
Verify password - New password for [email protected]:
Success : Password changed
[email protected]:~$
5)为用户krblinlin添加posixAccount对象类
posixAccount对象类在nis模式中
新建文件unix.ldif并编辑
注:在用kadmin命令新增Kerberos用户,即也在ldap数据库新增了条目(含krb5Key等属性),该条目已有uid属性,所以添加posixAccount对象类不必再加uid属性
[email protected]:~# 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
[email protected]:~# 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服务器
[email protected]:~# 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可读
[email protected]:~# chown root:root /etc/krb5.keytab
[email protected]:~# chmod o-r /etc/krb5.keytab
[email protected]:~# chmod g-r /etc/krb5.keytab
7)添加nfs客户机
[email protected]:~# 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客户端的过程及配置都完全一样[email protected]:~# 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-server[email protected]:~# apt-get install nfs-kernel-server nfs-common
修改/etc/default/nfs-kernel-server文件
将
NEED_SVCGSSD=""
改为
NEED_SVCGSSD="yes"
重启nfs-kernel-server
[email protected]:~# /etc/init.d/nfs-kernel-server stop
[email protected]:~# /etc/init.d/nfs-kernel-server start
[email protected]:~# 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三个包打上安装标记,可手工将该三个包去掉安装标记,不需此三个包
[email protected]:~# 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
查看配置文件
[email protected]:~# 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
[email protected]:~#
2)libnss-ldapd
安装过程中
name services to configure 选 [*] passwd
新建测试目录[email protected]:~# mkdir /home/linlin/share
将该目录属性改为用户ID及用户组ID都为4001,即为ldap用户krblinlin的uidNumber/gidNumber,但并在nfs客/服两主机本地不存在该ID用户[email protected]:~# chown 4001:4001 /home/linlin/share
2.1)假定没选[*] passwd
[email protected]:~$ ls -ld /home/linlin/share
drwxr-xr-x 2 4001 4001 4096 9月 18 21:13 /home/linlin/share
则取不到ldap用户信息
2.2)可重设libnss-ldapd,选上[*] passwd[email protected]:~# 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 passwd[email protected]:~#
查看配置文件,可见passwd一行后添加了ldap
[email protected]:~# 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
[email protected]:~#
[email protected]:~$ 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文件
[email protected]:~# cat /etc/exports
/home/linlin/share gss/krb5(rw,sync,no_subtree_check)
[email protected]:~#
执行导出[email protected]:~# exportfs -r
查看导出
[email protected]:~# exportfs -v
/home/linlin/share
gss/krb5(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
[email protected]:~#
4.问题解决
nfs服务器没有启动rpc.idmapd,导致nfs客户机没写权限
1)
[email protected]:~# 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
[email protected]:~# 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
[email protected]:~#
手工运行rpc.idmapd仍没启动rpc.idmapd
2)
原来nfs服务器的nfs-common要重启
[email protected]:~# /etc/init.d/nfs-common stop
[email protected]:~# /etc/init.d/nfs-common start
[email protected]:~# 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
[email protected]:~#
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也可以
[email protected]:~# apt-get install sssd sssd-krb5 sssd-ldap libsasl2-modules-gssapi-heimdal
安装后的sssd.conf是空白文件,nsswitch.conf没改变
[email protected]:~# 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[email protected]:~# 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
#--^--[email protected]:~#
2)查看nsswitch.conf[email protected]:~# 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
[email protected]:~#
即将原来的compat改为files sss
3)安装sssd时自动设置/etc/pam.d/[email protected]:~$ 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
[email protected]:~$
[email protected]:~$ 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
[email protected]:~$
[email protected]:~$ 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
[email protected]:~$
[email protected]:~$ 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
[email protected]:~$
[email protected]:~$ 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[email protected]:~$
4)重启sssd
[email protected]:~# /etc/init.d/sssd stop
[email protected]:~# /etc/init.d/sssd start
5)测试[email protected]:~$ kpasswd krblinlin
[email protected]‘s Password:
New password for [email protected]:
Verify password - New password for [email protected]:
Success : Password changed
[email protected]:~$
[email protected]:~$ su krblinlin
Password:
[email protected]:/home/linlin$
[email protected]:/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 要很长时间[email protected]:/home/linlin$
登录成功,修改密码命令kpasswd、passwd都成功.注意密码是Kerberos密码,非LDAP密码
但某些环境存在一个问题,当kdc服务器重启,SSSD客户机无法登录,需手工在kdc服务器上重启守护进程heimdal-kdc,还找不到原因.而另试另外环境很正常
2.安装nfs-common[email protected]:~# apt-get install nfs-common
修改/etc/default/nfs-common文件
将
NEED_GSSD=
改为
NEED_GSSD="yes"
[email protected]:~# /etc/init.d/nfs-common stop
[email protected]:~# /etc/init.d/nfs-common start
[email protected]:~# ps -e |grep gss
1027 ? 00:00:00 rpc.gssd
1)挂载网络共享
手工挂载
[email protected]:~# mount -t nfs4 srvnf.ctp.net:/home/linlin/share /mnt -o sec=krb5
或
添加到/etc/fstab,一开机挂载网络共享[email protected]:~# 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 0[email protected]:~#
2)查看挂载信息[email protected]:~$ 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)测试写网络共享
[email protected]:~# ls -ld /mnt
drwxr-xr-x 2 krblinlin 4001 4096 Sep 18 09:13 /mnt
[email protected]:~#
可看到已获取显示ldap用户信息,krblinlin为ldap用户
在普通本地用户下[email protected]:~$ su krblinlin
Password:
或控制台直接登录
debian login: krblinlin
Password:
[email protected]:/home/linlin$ cd /mnt
[email protected]:/mnt$ touch a.txt
[email protected]:/mnt$ ls
a.txt
[email protected]:/mnt$
写成功
[email protected]:~# 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}方式,需配置如下面
[email protected]:~# cat /etc/sasl2/slapd.conf
pwcheck_method: saslauthd
[email protected]:~#
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)安装
[email protected]:~# apt-get install slapd-smbk5pwd
slapd-smbk5pwd : Keeps Samba and Kerberos passwords in sync within slapd
2)加载模块
[email protected]:~# cat smbk5pwd.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: smbk5pwd
[email protected]:~#
[email protected]:~# 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出错
[email protected]:~# chown openldap /var/lib/heimdal-kdc/m-key
5)启用同步
[email protected]:~# cat krb5.ldif
dn: olcOverlay=smbk5pwd,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSmbK5PwdConfig
olcOverlay: smbk5pwd
olcSmbK5PwdEnable: krb5
[email protected]:~#
[email protected]:~# ldapadd -Y EXTERNAL -H ldapi:/// -f krb5.ldif
6)重启openldap
通常在线配置,是立即生效,但因/var/lib/heimdal-kdc/m-key文件权限问题,所以还是重启openldap为好
7)测试
以普通本地用户登录
[email protected]:~$ 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用户密码)
[email protected]:~$
这样修改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)安装[email protected]:~# 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‘.已正常首次登录创建用户目录
[email protected]:~$
[email protected]:~$ pwd
/home/krblinlin
[email protected]:~$
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
[email protected]:~# apt-get install tree
[email protected]:~# 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
[email protected]:~#
上面是刚安装完openldap后的
如要重新创建ldap数据库
[email protected]:~# dpkg-reconfigure slapd
配置过程中假如选hdb作为后端,则相关内容是hdb
查看ldap数据库
[email protected]:~# slapcat
查看配置数据库
[email protected]:~# slapcat -b cn=config
以上是关于Kerberos+LDAP+NFSv4 实现单点登录的主要内容,如果未能解决你的问题,请参考以下文章
Kerberos+LDAP+NFSv4 实现单点登录(续2)--一键安装
Kerberos+LDAP+NFSv4 实现单点登录(续4)--SASL/GSSAPI