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 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

原文地址:https://blog.51cto.com/13752418/2444001

时间: 2024-08-28 05:18:26

Kerberos+LDAP+NFSv4 实现单点登录(上)的相关文章

Kerberos+LDAP+NFSv4 实现单点登录(续4)--SASL/GSSAPI

前篇<Kerberos+LDAP+NFSv4 实现单点登录(续1)--dns+dhcp>的krb5 + ldap + bind9 + bind9-dyndb-ldap 全面升级到debian 10,出现bind9-dyndb-ldap的GSSAPI+krb5_keytab认证机制无法连接ldap数据库.查看日志:SASL/GSSAPI authentication startedError: Local errorAdditional info: SASL(-1): generic failu

Kerberos+LDAP+NFSv4 实现单点登录(续2)--一键安装

( 附:LDAP简单认证登录 login4ldap-ver0.0.6.zip 源代码 下载地址 http://u.163.com/NeMVmlIT 提取码: ObEubL7Y ) 上篇Kerberos+LDAP+NFSv4 实现单点登录(续1)链接地址http://lulinlin1.lofter.com/post/1cf3848f_11f58066?act=qbbloglofter_20150506_01 本篇是前两篇的总结,编写成一键安装脚本onekeysso.sh,并需名为dns.ldif

Kerberos+LDAP+NFSv4 实现单点登录

Kerberos : 身份认证LDAP : 目录信息服务NFSv4 : 网络共享 实验环境 : debian 9 三台主机:nfs服务器 : 192.168.1.103nfs客户机 : 192.168.1.102 即SSSD客户端+NFS客户端kdc服务器 : 192.168.1.101 即Kerberos+LDAP 以下 [email protected]:~# 表示以root根用户运行命令 一.安装NTP时间同步要使用Kerberos提供身份认证,各主机需时间同步 在一台主机上安装时间同步服

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也可以 [email protected]:~# apt-get install sssd sssd-krb5 sssd-l

Kerberos+LDAP+NFSv4 实现单点登录(中)

五.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-se

基于CAS实现单点登录(SSO):CAS+LDAP实现单点登录认证

[一].概述 CAS是N个系统的中心认证入口,而贯穿多个系统的用户信息是共用的,应该被单独维护,而这些信息可能属于不用的系统,不用的组织,不用的国家,从而形成了树形结构,而使用关系型数据库维护树形结构信息是它的弱点,这就是本文CAS和LDAP整合的初衷. 本来主要详细是介绍CAS和LDAP整合实现单点登录的步骤. [二].详细步骤 1.LDAP安装配置 详见: 介绍openLDAP在windows上的安装配置 安装配置,添加部分测试数据如下: 2.CAS的基础安装配置: 见SSO之CAS单点登录

ofbiz SSO 单点登录

 1.ofbiz单点登录介绍 ofbiz点单登录是集成了CAS SSO,LDAP使用的,具体的CAS与LDAP怎么应用,在这里不做介绍. 2.ofbiz点单登录文档 ofbiz 12版本中,有英文的简单的ofbiz单点登录的问题. 路径在:apache-ofbiz-12.04.01\framework\documents\SingleSignOn.xml 3.ofbiz单点登录目录 ofbiz  单点登录集成的目录在:apache-ofbiz-12.04.01\specialpurpose\

浅谈架构之路:单点登录 SSO

前言:SSO 单点登录 "半吊子"的全栈工程师又来了,技术类的文章才发表了两篇,本来想先将主攻的几个系列都开个头(Nodejs.Java.前端.架构.全栈等等),无奈博客起步太晚,写博文的时间又没有很多,只好不按顺序乱发一通,请大家见谅. 本篇文章介绍一下单点登录,不像上一篇博文介绍的前后端分离,SSO 并不能算是一种架构吧,只能说是一个解决方案.由于笔者参与过医院集成平台项目,负责其中单点登录的设计研发工作,将经验总结分享一下,也不一定是最优方案,正确与否那就"仁者见仁智者

偷懒小工具 - SSO单点登录通用类(可跨域)(上)

目的  目的很明确,就是搭建单点登录的帮助类,并且是一贯的极简风格(调用方法保持5行以内). 并且与其他类库,关联性降低.所以,不使用WebAPI或者WebService等. 思路   因为上次有朋友说,光看见一堆代码,看不见具体思路.所以,这次分享,我把思路先写出来. 懒得看实现代码的朋友,可直接查看"思路"这个子标题. 同时如果有好的想法,请修改后在github上推给我.Talk is cheap,Show me the code 思路   同域 同域需要考虑的问题比较少.只需要考