千家信息网

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

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,Kerberos+LDAP+NFSv4 实现单点登录(上)Kerberos : 身份认证LDAP : 目录信息服务NFSv4 : 网络共享实验环境 : debian 9三台主机:nfs服务器 : 19
千家信息网最后更新 2024年11月23日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

以下

root@debian:~#表示以root根用户运行命令

一.安装NTP时间同步
要使用Kerberos提供身份认证,各主机需时间同步

在一台主机上安装时间同步服务器
root@debian:~# apt-get install ntp

在其它主机上安装时间同步客户端
root@debian:~# 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

root@debian:~# hostname -dctp.net

root@debian:~# dnsdomainnamectp.net

三.kdc服务器的安装
安装Kerberos和LDAP,Kerberos和LDAP在同一主机上

1.安装LDAP
root@debian:~# 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工具建证书
root@debian:~# apt-get install gnutls-bin

1.1)建根证书

root@debian:~# certtool --generate-privkey > cakey.pemGenerating a 3072 bit RSA private key...

新建文件ca.info并编辑

root@debian:~# cat ca.infocacert_signing_keyexpiration_days = -1root@debian:~#

说明:-1表示永不过期

进行自签名

root@debian:~# certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pemGenerating a self signed certificate......(略)Signing certificate...root@debian:~#

1.2)建服务器证书
为了简便,证书都不设置机器名

生成私钥

root@debian:~# certtool --generate-privkey > fgkey.pemGenerating a 3072 bit RSA private key...

新建文件srv.info并编辑

root@debian:~# cat srv.infotls_www_serverencryption_keysigning_keyexpiration_days = -1root@debian:~#

签发服务器证书

root@debian:~# certtool --generate-certificate --load-privkey fgkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --template srv.info --outfile fgcert.pemGenerating a signed certificate......Signing certificate...root@debian:~#

新建存放私钥的目录
root@debian:~# mkdir /etc/ldap/ssl/private

复制私钥、证书

root@debian:~# cp fgcert.pem /etc/ldap/ssl/root@debian:~# cp fgkey.pem  /etc/ldap/ssl/private/

设置私钥属性为仅openldap用户拥有可读(因debian的openldap是以openldap用户运行)

root@debian:~# chown openldap  /etc/ldap/ssl/private/fgkey.pemroot@debian:~# ls -l  /etc/ldap/ssl/private/fgkey.pem-rw-r--r-- 1 openldap root 8289 Oct 19 13:44 /etc/ldap/ssl/private/fgkey.pemroot@debian:~#root@debian:~# chmod o-r  /etc/ldap/ssl/private/fgkey.pemroot@debian:~# 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并编辑

root@debian:~# cat ssl.ldifdn: cn=configchangetype: modifyadd: olcTLSCertificateFileolcTLSCertificateFile: /etc/ldap/ssl/fgcert.pem-add: olcTLSCertificateKeyFileolcTLSCertificateKeyFile: /etc/ldap/ssl/private/fgkey.pemroot@debian:~#

openldap的配置没有使用传统的slapd.conf文件,而是操作方式犹如ldap数据库的配置数据库,在/etc/ldap/slapd.d/目录下,结构层次分明的目录及ldif文件.

安装LDAP安装后,虽已预先创建了配置数据库管理员,但没设密码,仍不可使用.但也已设置了允许root根用户通过EXTERNAL认证方式读写配置数据库,所以本实验在root根用户下运行ldap命令工具.

root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f ssl.ldifSASL/EXTERNAL authentication startedSASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=authSASL SSF: 0modifying 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

root@debian:~# /etc/init.d/slapd stoproot@debian:~# /etc/init.d/slapd start

重启openldap后,root根用户便可运行类似 ldapadd -Y EXTERNAL -H ldapi:/// -f xxx.ldif 命令读写ldap数据库.
也即Kerberos进程便有权限写ldap数据库,无需绑定LDAP数据库管理员.

2.安装Kerberos
root@debian:~# 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

root@debian:~# /etc/init.d/heimdal-kdc stop  root@debian:~# /etc/init.d/heimdal-kdc start

3.安装schema2ldif
root@debian:~# apt-get install schema2ldif

schema2ldif : schema到ldif转换工具

LDAP模式通常同时提供schema和ldif两个文件,但heimdal-kdc只提供hdb.schema文件,没提供LDIF格式文件

openldap添加heimdal模式,模式文件在/etc/ldap/schema/hdb.schema

1)转换格式
root@debian:~# schema2ldif /etc/ldap/schema/hdb.schema>hdb.ldif

2)在线添加模式

root@debian:~# ldapadd -Y EXTERNAL -H ldapi:/// -f hdb.ldifSASL/EXTERNAL authentication startedSASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth...

4.添加数据库记录
上面完成了kdc服务器的安装配置,下面开始操作数据库

1)ldap数据库添加krb5组织条目
新建文件krb5.ldif并编辑

root@debian:~# cat krb5.ldifdn: ou=hdkrb5,dc=ctp,dc=netkrb5PrincipalName: default@CTP.NETou: hdkrb5objectClass: krb5PrincipalobjectClass: organizationalUnitroot@debian:~#root@debian:~# ldapadd -x -D "cn=admin,dc=ctp,dc=net" -W -f krb5.ldifEnter LDAP Password: 输入ldap数据库管理员的密码(在安装openldap时设置的密码)adding new entry "ou=hdkrb5,dc=ctp,dc=net"root@debian:~#

2)初始化Kerberos数据库

root@debian:~# kadmin -lkadmin> init CTP.NET

花了两分钟

Realm max ticket life [unlimited]:
Realm max renewable ticket life [unlimited]:
...
上面一路回车缺省

kadmin> exit
退出kadmin

3)新增Kerberos用户
root@debian:~# 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]:
上面一路回车缺省

krblinlin@CTP.NET's Password: 设定密码
Verify password - krblinlin@CTP.NET's Password:

4)在kdc服务器上测试kpasswd修改密码
以普通用户登录kdc

linlin@debian:~$ kpasswd krblinlinkrblinlin@CTP.NET's Password: 输入正确的密码New password for krblinlin@CTP.NET: 重设定密码Verify password - New password for krblinlin@CTP.NET:Success : Password changedlinlin@debian:~$

5)为用户krblinlin添加posixAccount对象类
posixAccount对象类在nis模式中

新建文件unix.ldif并编辑

注:在用kadmin命令新增Kerberos用户,即也在ldap数据库新增了条目(含krb5Key等属性),该条目已有uid属性,所以添加posixAccount对象类不必再加uid属性

root@debian:~# cat unix.ldifdn: krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=netchangetype: modifyadd: objectClassobjectClass: posixAccount-add: cncn: krblinlin-add: gidNumbergidNumber: 4001-add: homeDirectoryhomeDirectory: /home/krblinlin-add: loginShellloginShell: /bin/bash-add: uidNumberuidNumber: 4001-add: userPassworduserPassword: linlinroot@debian:~# ldapmodify -x -D "cn=admin,dc=ctp,dc=net" -W -f unix.ldifEnter LDAP Password:modifying entry "krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net"

条目(krb5PrincipalName=krblinlin@CTP.NET,ou=hdkrb5,dc=ctp,dc=net)的userPassword属性是ldap用户的密码,而krb5Key属性应是包含Kerberos密码信息.
所以该条目有两套不同的密码体系,Kerberos和LDAP

6)添加nfs服务器

root@debian:~# kadmin -lkadmin> 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可读

root@debian:~# chown root:root /etc/krb5.keytabroot@debian:~# chmod o-r /etc/krb5.keytabroot@debian:~# chmod g-r /etc/krb5.keytab

7)添加nfs客户机

root@debian:~# kadmin -lkadmin> 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客户端的过程及配置都完全一样
root@debian:~# 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

数据 数据库 服务 客户 服务器 配置 密码 文件 用户 客户机 主机 属性 客户端 方式 命令 证书 条目 模式 目录 管理员 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 万得宏观数据库提取量限制 软件开发可以办退税吗 北纬科技移动互联网产业园 网络安全组织机构百度文库 微信电话显示服务器异常 郑州大森互联网科技有限公司 指纹打卡 连不上数据库 福州电商小程序软件开发 高通 相机软件开发 广州数字化管理软件开发商 sam数据库在哪里 马鞍山视觉测量系统软件开发 隆尧天气预报软件开发 计算机网络技术域名计算 安徽电脑服务器机箱怎么用云空间 手游脚本软件开发 中软国际是做软件开发培训吗 闵行区信息网络技术推荐咨询 steam怎么加入官方服务器 达梦杯数据库比赛 北纬科技移动互联网产业园 数据库技术的内涵和外延 英文meta分析用哪几个数据库 网络安全工程师证认证 网络安全龙头股2017 山东省网络技术安全大赛 软件开发商如何做生产 手游脚本软件开发 通讯录java数据库 干软件开发工程师怎样创业
0