在学习对称密钥分配的时候,提到了一个KDC的模型概念,为了更好的理解这个概念,我准备搭建一个krb5的服务器,并配置一台服务器的SSH服务支持krb5身份识别,最后配置一台客户端登录该服务器,以验证实验结果。
cpclient获取用户票据,可通过SSH免密访问krb、web-server和mysql-server。(类似单点登录)
web-server可通过票据免密访问mysql-server。
身份识别和密钥分发工作交由krb处理。
Kerberos身份认证协议
在互联网中,很多情景都需要验证访问者的身份,在一个信息系统中部署了Kerberos后,可以一定程度上提高系统的安全性,krb5同时提GSSAPI接口,对接krb5可以为实现更高的安全级别提供便利。
Krb5的工作逻辑
Kerberos包含三个部分:KDC、提供服务主体、客户端。其中Kerberos中的KDC由AS(Authentication Service 认证服务)、与TGS(Ticket Granting Service 票据服务)组成,只有通过了TGS,才会获取到会话密钥,再凭据会话密钥与服务主体通讯。
下面是一个典型的Kerberos的工作模型:
A | 客户端 | B | 服务提供主体 |
KX | X与KDC的共享密钥 | KXY | X与Y的会话秘钥 |
Ktgs | TGS使用的密钥 | TGTxy | 包含X与Y会话秘钥的票据 |
IDX | X的身份信息,包含时间戳等 | KDC | 包含AS和TGS的认证服务 |
- 客户端A向AS发送一个明文请求,声明自己是A,请求访问TGS。
- AS在收到这个请求以后,生成一个用来和TGS通讯的密钥Atgs,和TGT票据,票据中包含IDA以及Atgs,这个票据使用Ktgs加密,最后在Kerberos数据库中找到IDA的密钥,对整个数据报加密。
- TGT= Ktgs(IDA,Atgs)。
- 返回数据报=KA(Atgs | TGT)。
- A收到返回的数据包后,使用自己的KA解密,得到Atgs和TGT。然后重新生成一个IDA,将这个IDA想要进行通讯的主机IDB,使用Atgs加密,连同TGT一起发给TGS。
- 发送数据报=Atgs(IDA,B)| TGT。
- 第一部分=Atgs(IDA,B)。
- TGS进行验证和返回数据报
- TGS首先使用ktgs解密TGT,因为TGS并没有Atgs,无法解密步骤2中数据报的第一部分,获取Atgs并解密第一部分以后,验证TGT中的IDA和第一部分的IDA是否一致,以及时间戳(抵御重放攻击)。
- 验证通过以后,TGS知道A需要访问B,生成票据TGTab,票据中包含IDA,IDB,票据有效期以及KAB。分别对TGTab使用Atgs和KB加密。
- 返回数据报=Atgs(TGTab)| KB (TGTab)。
- TGTab≈IDA,IDB, KAB,票据有效期以及其他重要信息。
- 第一部分= Atgs(TGTab)。
- 第二部分= KB (TGTab)。
- A使用Atgs解密第一份,得到KAB,使用KAB加密自己的身份信息IDA,并且附上无法解密的第二部分。发送给B。
- 发送数据报=KAB(IDA)| KB(TGTab)。
- 发送数据报=KAB(IDA)|KB(TGTab)。
- 第一部分=KAB(IDA)。
- 发送数据报=KAB(IDA)| KB(TGTab)。
- B收到以后,使用自己的KB解密获得TGTab,然后使用TGTab中的KAB解密步骤5中的第一部分,并且验证TGTab中的ID信息以及时间戳和票据TGTab是否有效。确定票据以及身份信息有效后,使用KAB与B建立安全连接。
其他依赖
以上可以看出,kerberos校验身份信息一定程度上依赖于时间,所以需要网络中存在NTP服务器。
即使采用了krb进行密钥分配,依然不能确保系统安全,网络安全的可靠性主要依靠密钥强度和协议严谨性,Kerberos中存在三种密钥,一种是长期密钥,另两种是短期密钥和长期密钥的派生密钥。
Kerberos认为被长期密钥加密的数据不能在网络中传输,因为一旦这些被长期密钥加密的数据包被网络监听者截获,在理想条件下,只要时间充足,是可以通过计算获得该密钥的。所以需要定期更新主密钥即KX。
安装配置
在本次实验中,我将使用三台CentoOS 8,分别作为krb服务器,ssh服务端,ssh客户端。因为我本地已经存在DNS服务器,可以配置好了解析,如果没有本地DNS服务器,可以配置/etc/host文件,加入对应的域名解析。
涉及到的名词概念
下列表格中列出了安装配置过程中,涉及到的名词解释:
领域(realm) | Kerberos负责的密钥分发的范围,一般情况下可以套用域的概念。领域中的主体应该存在域名服务器中。比如我的blog的域名DRXCLOUD.CLUB |
主体(principal) | 领域中的实体,可以是具体的设备,或者服务,或者用户。为主体命名的时候可以采用“主名/实例@领域”的格式。一个完整的主体名可以表示为: krb-server.drxcloud.club@DRXCLOUD.CLUB(表示域中Krb服务器) user/krb-server.drxcloud.club@DRXCLOUD.CLUB(表示krb服务器上名称为user的用户) host/web-server.drxcloud.club@DRXCLOUD.CLUB(表示web-server服务器本机) |
票据(ticket) | 参考上文中 的TGT,包含ip地址,主体信息等一些关键信息 |
会话密钥(SessionKey) | 短暂的一次性密钥,参考上文中的KAB |
配置Kerberos
安装配置Krb5服务器
Krb5服务器承担了整个域中的密钥分配工作,在设计信息系统的时候应该优先考虑KDC本身的安全问题,采用合适的方法提高服务器的安全等级。在本次实验中,默认关闭Firewall与SElinux。
操作系统 | CentOS Stream 8 |
主机名 | krb.pve.home |
IP地址 | 192.168.5.100 |
依赖包 | krb5-server、krb5-workstation |
基础环境配置完成以后,开始配置/etc/krb5.conf,这个配置文件定义了krb5负责分配密钥的领域,/var/kerberos/krb5kdc/kdc.conf配置中可以配置krb5的端口和一些细节设置。
[root@krb ~]# cat /etc/krb5.conf
# To opt out of the system crypto-policies configuration of krb5, remove the
# symlink at /etc/krb5.conf.d/crypto-policies which will not be recreated.
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
spake_preauth_groups = edwards25519
default_realm = PVE.HOME
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
PVE.HOME = {
kdc = krb.pve.home
admin_server = krb.pve.home
}
[domain_realm]
.pve.home = PVE.HOME
pve.home = PVE.HOME
[root@krb ~]# cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
spake_preauth_kdc_challenge = edwards25519
[realms]
PVE.HOME = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal
}
创建krb数据库,并设置数据库密码。修改管理员访问控制表/var/kerberos/krb5kdc/kadmin5.acl。
[root@krb krb5kdc]# kdb5_util create -r PVE.HOME -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'PVE.HOME',
master key name 'K/M@PVE.HOME'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:
[root@krb krb5kdc]# cat /var/kerberos/krb4kdc/kadm5.acl
*/admin@PVE.HOME *
使用kadmin.local添加管理员drx,设置密码为:pwdrx;并且添加两台主机host/web-server.pve.home、host/mysql-server.pve.home。
[root@krb ~]# kadmin.local
Authenticating as principal root/admin@PVE.HOME with password.
kadmin.local: addprinc -randkey web-server.pve.home
No policy specified for web-server.pve.home@PVE.HOME; defaulting to no policy
Principal "web-server.pve.home@PVE.HOME" created.
kadmin.local: addprinc drx/admin
No policy specified for drx/admin@PVE.HOME; defaulting to no policy
Enter password for principal "drx/admin@PVE.HOME":
Re-enter password for principal "drx/admin@PVE.HOME":
Principal "drx/admin@PVE.HOME" created.
kadmin.local: addprinc -randkey host/web-server.pve.home
No policy specified for host/web-server.pve.home@PVE.HOME; defaulting to no policy
Principal "host/web-server.pve.home@PVE.HOME" created.
kadmin.local: addprinc -randkey host/mysql-server.pve.home
No policy specified for host/mysql-server.pve.home@PVE.HOME; defaulting to no policy
Principal "host/mysql-server.pve.home@PVE.HOME" created.
[root@krb ~]# kadmin.local
Authenticating as principal root/admin@PVE.HOME with password.
kadmin.local: list_principals
K/M@PVE.HOME
drx/admin@PVE.HOME
host/mysql-server.pve.home@PVE.HOME
host/web-server.pve.home@PVE.HOME
kadmin/admin@PVE.HOME
kadmin/changepw@PVE.HOME
kadmin/krb.pve.home@PVE.HOME
kiprop/krb.pve.home@PVE.HOME
krbtgt/PVE.HOME@PVE.HOME
开始启动KDC和Kadmin服务,启动并添加开机启动。
[root@krb ~]# systemctl enable krb5kdc
Created symlink /etc/systemd/system/multi-user.target.wants/krb5kdc.service → /usr/lib/systemd/system/krb5kdc.service.
[root@krb ~]# systemctl enable kadmin
Created symlink /etc/systemd/system/multi-user.target.wants/kadmin.service → /usr/lib/systemd/system/kadmin.service.
[root@krb ~]# systemctl start krb5kdc
[root@krb ~]# systemctl start kadmin
[root@krb ~]# systemctl status krb5kdc kadmin
● krb5kdc.service - Kerberos 5 KDC
Loaded: loaded (/usr/lib/systemd/system/krb5kdc.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-07-03 20:27:04 CST; 19s ago
Process: 1458 ExecStart=/usr/sbin/krb5kdc -P /var/run/krb5kdc.pid $KRB5KDC_ARGS (code=exited, status=0/SUCCESS)
Main PID: 1459 (krb5kdc)
Tasks: 1 (limit: 10904)
Memory: 1.9M
CGroup: /system.slice/krb5kdc.service
└─1459 /usr/sbin/krb5kdc -P /var/run/krb5kdc.pid
Jul 03 20:27:04 krb.pve.home systemd[1]: Starting Kerberos 5 KDC...
Jul 03 20:27:04 krb.pve.home systemd[1]: Started Kerberos 5 KDC.
● kadmin.service - Kerberos 5 Password-changing and Administration
Loaded: loaded (/usr/lib/systemd/system/kadmin.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-07-03 20:27:07 CST; 16s ago
Process: 1462 ExecStart=/usr/sbin/kadmind -P /var/run/kadmind.pid $KADMIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 1463 (kadmind)
Tasks: 1 (limit: 10904)
Memory: 14.1M
CGroup: /system.slice/kadmin.service
└─1463 /usr/sbin/kadmind -P /var/run/kadmind.pid
Jul 03 20:27:07 krb.pve.home systemd[1]: Starting Kerberos 5 Password-changing and Administration...
Jul 03 20:27:07 krb.pve.home systemd[1]: Started Kerberos 5 Password-changing and Administration.
配置客户端
假设,我已经编写了一套C/S架构的软件,并且采用了GSSAPI接口实现身份鉴别,则需要在将服务端与客户端与KDC共享一个秘钥。这里我选择使用SSH来代替,因为SSH原生支持GSSAPI。接下来我们将在以下两台服务器上安装KDC主密钥。
客户端 web-server.pve.home
操作系统 | CentOS Stream 8 |
主机名 | web-server.pve.home |
IP地址 | 192.168.6.100 |
依赖包 | krb5-workstation |
客户端 mysql-server.pve.home
操作系统 | CentOS Stream 8 |
主机名 | mysql-server.pve.home |
IP地址 | 192.168.6.101 |
依赖包 | krb5-workstation |
首先完成基础环境的设置,包括主机名,krb5客户端等。然后从KDC服务器上复制配置文件/etc/krb5.conf到客户端,也可以自己改一下。两台机器的安装方法类似,使用kadmin命令登录KDC,然后使用ktadd命令安装主密钥到本机。
[root@web-server ~]# hostname
web-server.pve.home
[root@web-server ~]# kadmin -p drx/admin
Authenticating as principal drx/admin with password.
Password for drx/admin@PVE.HOME:
kadmin: ktadd host/web-server.pve.home
Entry for principal host/web-server.pve.home with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/web-server.pve.home with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/web-server.pve.home with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/web-server.pve.home with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/web-server.pve.home with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
kadmin: quit
获取票据
密钥安装至本机后,就可以向KDC发送请求,获取TGT票据。使用kinit命令获取,klist命令查看。
[root@web-server ~]# kinit -k host/web-server.pve.home
[root@web-server ~]# klist
Ticket cache: KCM:0
Default principal: host/web-server.pve.home@PVE.HOME
Valid starting Expires Service principal
07/04/2023 10:20:58 07/05/2023 10:20:58 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 10:20:58
[root@web-server ~]#
[root@mysql-server ~]# kinit -k host/mysql-server.pve.home
[root@mysql-server ~]# klist
Ticket cache: KCM:0
Default principal: host/mysql-server.pve.home@PVE.HOME
Valid starting Expires Service principal
07/04/2023 14:35:00 07/05/2023 14:35:00 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 14:35:00
[root@mysql-server ~]#
配置SSH
KDC主密钥安装完成,并且成功获得了与TGS通讯的票据后,假设web服务器需要访问mysql服务器,则我们将web设置为SSH客户端,mysql设置为服务端,使用SSH协议用来模拟C/S架构的信息系统进行通讯。
修改SSH配置文件
配置mysql服务器上的/etc/ssh/sshd_config,并且重启ssh服务。这里需要注意的是,在SSHv2中,只需要开启GSSAPI相关的选项即可。Kerberos选项仅仅支持SSHv1。
参考:http://www.novell.com/documentation/opensuse103/opensuse103_reference/data/sec_kerbadmin_sshd.htm
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no #需要密码登录,验证是否通过kdc验证身份
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes #会话结束后销毁会话密钥
GSSAPIStrictAcceptorCheck no #是否严格验证主体与系统用户名
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
如果将GSSAPIStrictAcceptorCheck参数设置为yes,需要将系统用户名与krb主体名一致,假设有lenovo.pve.home@PVE.HOME,那这个主体只能登录mysql服务器上用户名为lenovo的账户。参考:https://man.openbsd.org/sshd_config
在mysql服务器上的用户根目录下建立并编辑~/.k5login文件,这个文件作用是访问控制,只有krb主体添加到文件中,才能登陆这个账户,这里我使用的是root账户,仅在实验中展示,如果使用root账户,会增加很多安全风险。
[root@mysql-server ~]# cat ~/.k5login
host/web-server.pve.home@PVE.HOME
[root@mysql-server ~]#
配置web服务器上的ssh客户端配置,将下列命令添加到/etc/ssh/ssh_config文件末尾,以启用GSSAPI。
# This system is following system-wide crypto policy.
# To modify the system-wide ssh configuration, create a *.conf file under
# /etc/ssh/ssh_config.d/ which will be automatically included below
Include /etc/ssh/ssh_config.d/*.conf
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
开始实验
完成以上配置以后,在web服务器上使用ssh命令登录mysql服务器。
使用密码登录
前面的配置中我们已经关闭了密码登录,如果krb5kdc和GSSAPI接口工作正常,那应该可以免密登录mysql服务器的root账户。在krb服务器上使用ssh命令登录来验证。
[root@krb ~]# ssh root@mysql-server.pve.home
The authenticity of host 'mysql-server.pve.home (192.168.6.101)' can't be established.
ECDSA key fingerprint is SHA256:1iqIdthS7/bEMKIhlzoZZeolxCWcJDTz8s5iRDdstRs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'mysql-server.pve.home,192.168.6.101' (ECDSA) to the list of known hosts.
root@mysql-server.pve.home: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[root@krb ~]#
可以看到SSH服务端工作正常,但是拒绝登录,并且列出了错误原因。接下来我们使用web服务器,运行同样的命令进行尝试。
使用票据登录
[root@web-server ~]# ssh root@mysql-server.pve.home
The authenticity of host 'mysql-server.pve.home (192.168.6.101)' can't be established.
ECDSA key fingerprint is SHA256:1iqIdthS7/bEMKIhlzoZZeolxCWcJDTz8s5iRDdstRs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'mysql-server.pve.home,192.168.6.101' (ECDSA) to the list of known hosts.
Last login: Tue Jul 4 14:37:44 2023 from 192.168.6.100
[root@mysql-server ~]# hostname
mysql-server.pve.home
[root@mysql-server ~]# exit
logout
Connection to mysql-server.pve.home closed.
[root@web-server ~]#
免密登录成功,现在我们查看两台机器的票据信息。可以看到web和mysql都成功的通过TGS拿到了票据。虽然SSH调用GSSAPI和上文提到krb5kdc的工作方式存在一定差异,但是核心都是通过票据实现身份验证。
[root@web-server ~]# klist
Ticket cache: KCM:0
Default principal: host/web-server.pve.home@PVE.HOME
Valid starting Expires Service principal
07/04/2023 14:18:36 07/05/2023 14:18:36 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 14:18:36
07/04/2023 14:18:44 07/05/2023 14:18:36 host/mysql-server.pve.home@PVE.HOME
renew until 07/04/2023 14:18:36
[root@web-server ~]#
[root@mysql-server ~]# klist
Ticket cache: KCM:0:31551
Default principal: host/web-server.pve.home@PVE.HOME
Valid starting Expires Service principal
07/04/2023 17:32:01 07/05/2023 14:18:36 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 14:18:36
[root@mysql-server ~]#
便利性试验
假设现在有用户tea,需要同时访问mysql与web服务器,在密钥分配的时候,需要将两台服务器的密钥全部告诉tea。假设这两个密钥并不相同,就会导致效率低下;如果密钥相同,则不符合安全需要。如果通过KDC进行密钥分配,则可能兼顾二者。
首先添加一个krb主体root@PVE.HOME,设置密码为root123。在krb、mysql与web服务器上打开SSH服务的GSSAPI选项,并且添加主体到每台服务器的~/.k5login文件中,我们在一台全新的服务器上配置好krb5,并且获取票据。尝试登录这三台服务器。这次试验,我们将打开GSSAPIStrictAcceptorCheck选项。
[root@cpclient ~]# hostname
cpclient.pve.home
[root@cpclient ~]# kinit -p root
Password for root@PVE.HOME:
[root@cpclient ~]# klist
Ticket cache: KCM:0
Default principal: root@PVE.HOME
Valid starting Expires Service principal
07/04/2023 20:21:47 07/05/2023 20:21:47 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 20:21:47
[root@cpclient ~]# ssh root@mysql-server
The authenticity of host 'mysql-server (192.168.6.101)' can't be established.
ECDSA key fingerprint is SHA256:1iqIdthS7/bEMKIhlzoZZeolxCWcJDTz8s5iRDdstRs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'mysql-server,192.168.6.101' (ECDSA) to the list of known hosts.
Last login: Tue Jul 4 17:32:01 2023 from 192.168.6.100
[root@mysql-server ~]# hostname
mysql-server.pve.home
[root@mysql-server ~]# exit
logout
Connection to mysql-server closed.
[root@cpclient ~]# ssh root@mweb-server
ssh: Could not resolve hostname mweb-server: Name or service not known
[root@cpclient ~]# ssh root@web-server
The authenticity of host 'web-server (192.168.6.100)' can't be established.
ECDSA key fingerprint is SHA256:1iqIdthS7/bEMKIhlzoZZeolxCWcJDTz8s5iRDdstRs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'web-server,192.168.6.100' (ECDSA) to the list of known hosts.
Last login: Tue Jul 4 10:10:30 2023 from 192.168.10.5
[root@web-server ~]# hostname
web-server.pve.home
[root@web-server ~]# exit
logout
Connection to web-server closed.
[root@cpclient ~]# ssh root@krb
Last login: Tue Jul 4 20:15:04 2023 from 192.168.6.1
[root@krb ~]# hostname
krb.pve.home
[root@krb ~]# exit
logout
Connection to krb closed.
[root@cpclient ~]# klist
Ticket cache: KCM:0
Default principal: root@PVE.HOME
Valid starting Expires Service principal
07/04/2023 20:22:24 07/05/2023 20:21:47 host/web-server.pve.home@PVE.HOME
renew until 07/04/2023 20:21:47
07/04/2023 20:21:47 07/05/2023 20:21:47 krbtgt/PVE.HOME@PVE.HOME
renew until 07/04/2023 20:21:47
07/04/2023 20:22:04 07/05/2023 20:21:47 host/mysql-server.pve.home@PVE.HOME
renew until 07/04/2023 20:21:47
07/04/2023 20:22:36 07/05/2023 20:21:47 host/krb.pve.home@PVE.HOME
renew until 07/04/2023 20:21:47
实验结果证明了,只要通过通过KDC认证身份并且获得票据,这可以获得登录权限。在信息系统设计时,考虑在网络中部署KDC服务器,是一个不错的选择,在确保了安全性的同时增加了效率。
总结
GSSAPI和Krb5kdc
以下内容来自ChatGPT。
在配置了 GSSAPI 登录和 krb5kdc 后,SSH 建立安全连接的过程如下:
- 客户端发起 SSH 连接请求:客户端使用 SSH 客户端工具(例如 OpenSSH)向 SSH 服务器发起连接请求。连接请求中包含所需的连接参数,例如目标主机名、端口号等。
- SSH 服务器响应连接请求:SSH 服务器接收到客户端的连接请求,并对其进行响应。服务器验证客户端的连接请求是否合法,并准备与客户端建立安全连接的环境。
- GSSAPI 身份验证请求:在建立 SSH 连接期间,SSH 服务器要求客户端使用 GSSAPI 进行身份验证。服务器发送 GSSAPI 身份验证请求给客户端。
- 客户端生成票据:客户端使用 GSSAPI 与 Kerberos KDC 进行通信,请求生成用于 SSH 身份验证的票据。客户端向 KDC 提供自己的凭据,并获取由 KDC 签名的票据。
- 客户端发送票据给 SSH 服务器:客户端将从 KDC 获取的票据发送给 SSH 服务器作为身份验证凭据。
- SSH 服务器验证票据:SSH 服务器接收到客户端发送的票据,并使用 GSSAPI 与 KDC 进行通信以验证票据的合法性。服务器将票据提供给 KDC 进行验证,以确保票据是由合法的 KDC 签名的,并且属于正确的用户。
- 安全连接建立:一旦 SSH 服务器验证通过客户端的票据,安全连接将被建立。双方可以进行加密和认证,以确保连接的安全性。
- 会话和数据传输:安全连接建立后,客户端和服务器可以开始会话,并在加密的连接上传输数据。所有的数据都经过加密,确保在网络中的安全传输。
通过以上步骤,SSH 使用 GSSAPI 和 Kerberos 提供了安全的身份验证和加密通信,保护 SSH 连接中传输的数据的机密性和完整性。
以上的步骤和KDC分配秘钥的步骤 有哪些不同的地方 和相同的地方
以上步骤描述了建立安全 SSH 连接的过程,而 KDC 分配密钥的步骤是 Kerberos 中用于生成和分发票据的过程。这两个过程在一定程度上是相关的,但也有一些不同之处。
相同之处:
- 使用 GSSAPI 进行身份验证:在 SSH 连接建立过程中,使用 GSSAPI 进行身份验证,客户端和服务器都需要与 KDC 进行通信,以获取有效的票据或票据验证。
- 使用 Kerberos 票据:SSH 连接和 KDC 分配密钥的过程都涉及使用 Kerberos 票据进行身份验证和授权。在 SSH 连接中,客户端通过 GSSAPI 从 KDC 获取票据,并将其用于与服务器进行身份验证。
不同之处:
- 上下文和目的:SSH 连接建立过程旨在建立安全的客户端-服务器通信通道,使双方能够安全地进行数据传输。而 KDC 分配密钥的过程是 Kerberos 系统中的一部分,目的是生成和分发用于身份验证和授权的票据。
- 资源和步骤:SSH 连接过程中,客户端和服务器需要访问 SSH 配置和相关的密钥、证书等资源,通过 GSSAPI 进行身份验证和建立连接。而 KDC 分配密钥的过程需要 Kerberos 预共享密钥库(KDC 数据库)和相关配置,通过密钥生成和分发算法来生成和分发票据。
- 应用范围:SSH 是一种用于远程访问和安全传输数据的协议,可用于各种网络服务。KDC 分配密钥的过程主要用于 Kerberos 系统,用于集中式身份验证和授权管理。
需要注意的是,SSH 和 Kerberos 是不同的技术和协议,尽管它们可以结合使用以提供更强大的身份验证和安全通信。SSH 使用 GSSAPI 进行身份验证,其中的 Kerberos 是其中一个可选的身份验证机制。KDC 分配密钥的过程是 Kerberos 系统中的一部分,与 SSH 相关,但不完全相同。
参考资料:
[1] 计算机网络 https://www.bilibili.com/video/BV1XW4y1s77Y/
[2] Kerberos实验系统设计与分析(禹水琴,电脑知识与技术第11卷第24期 )Kerberos实验系统设计与分析.pdf
[3] MIT Kerberos Documentation https://web.mit.edu/kerberos/krb5-latest/doc/index.htm
[4] Configuring OpenSSH to use Kerberos Authentication – Kevin’s Blog https://kevrocks67.github.io/blog/configuring-openssh-to-use-kerberos-authentication.html
[5] ChatGPT https://chat.openai.com/