Zhi Wei 的个人博客
Kerberos原理与CentOS中配置SSH使用krb5认证
Kerberos原理与CentOS中配置SSH使用krb5认证

Kerberos原理与CentOS中配置SSH使用krb5认证

在学习对称密钥分配的时候,提到了一个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服务提供主体
KXX与KDC的共享密钥KXYX与Y的会话秘钥
KtgsTGS使用的密钥TGTxy包含X与Y会话秘钥的票据
IDXX的身份信息,包含时间戳等KDC包含AS和TGS的认证服务
  1. 客户端A向AS发送一个明文请求,声明自己是A,请求访问TGS。
  2. AS在收到这个请求以后,生成一个用来和TGS通讯的密钥Atgs,和TGT票据,票据中包含IDA以及Atgs,这个票据使用Ktgs加密,最后在Kerberos数据库中找到IDA的密钥,对整个数据报加密。
    • TGT= Ktgs(IDA,Atgs)。
    • 返回数据报=KA(Atgs | TGT)。
  3. A收到返回的数据包后,使用自己的KA解密,得到Atgs和TGT。然后重新生成一个IDA,将这个IDA想要进行通讯的主机IDB,使用Atgs加密,连同TGT一起发给TGS。
    • 发送数据报=Atgs(IDA,B)| TGT。
    • 第一部分=Atgs(IDA,B)。
  4. 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)。
  5. A使用Atgs解密第一份,得到KAB,使用KAB加密自己的身份信息IDA,并且附上无法解密的第二部分。发送给B。
    • 发送数据报=KAB(IDA)| KB(TGTab)。
      • 发送数据报=KAB(IDA)|KB(TGTab)。
      • 第一部分=KAB(IDA)。
  6. 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 建立安全连接的过程如下

  1. 客户端发起 SSH 连接请求:客户端使用 SSH 客户端工具(例如 OpenSSH)向 SSH 服务器发起连接请求。连接请求中包含所需的连接参数,例如目标主机名、端口号等。
  2. SSH 服务器响应连接请求:SSH 服务器接收到客户端的连接请求,并对其进行响应。服务器验证客户端的连接请求是否合法,并准备与客户端建立安全连接的环境。
  3. GSSAPI 身份验证请求:在建立 SSH 连接期间,SSH 服务器要求客户端使用 GSSAPI 进行身份验证。服务器发送 GSSAPI 身份验证请求给客户端。
  4. 客户端生成票据:客户端使用 GSSAPI 与 Kerberos KDC 进行通信,请求生成用于 SSH 身份验证的票据。客户端向 KDC 提供自己的凭据,并获取由 KDC 签名的票据。
  5. 客户端发送票据给 SSH 服务器:客户端将从 KDC 获取的票据发送给 SSH 服务器作为身份验证凭据。
  6. SSH 服务器验证票据:SSH 服务器接收到客户端发送的票据,并使用 GSSAPI 与 KDC 进行通信以验证票据的合法性。服务器将票据提供给 KDC 进行验证,以确保票据是由合法的 KDC 签名的,并且属于正确的用户。
  7. 安全连接建立:一旦 SSH 服务器验证通过客户端的票据,安全连接将被建立。双方可以进行加密和认证,以确保连接的安全性。
  8. 会话和数据传输:安全连接建立后,客户端和服务器可以开始会话,并在加密的连接上传输数据。所有的数据都经过加密,确保在网络中的安全传输。

通过以上步骤,SSH 使用 GSSAPI 和 Kerberos 提供了安全的身份验证和加密通信,保护 SSH 连接中传输的数据的机密性和完整性。

以上的步骤和KDC分配秘钥的步骤 有哪些不同的地方 和相同的地方

以上步骤描述了建立安全 SSH 连接的过程,而 KDC 分配密钥的步骤是 Kerberos 中用于生成和分发票据的过程。这两个过程在一定程度上是相关的,但也有一些不同之处。

相同之处:

  1. 使用 GSSAPI 进行身份验证:在 SSH 连接建立过程中,使用 GSSAPI 进行身份验证,客户端和服务器都需要与 KDC 进行通信,以获取有效的票据或票据验证。
  2. 使用 Kerberos 票据:SSH 连接和 KDC 分配密钥的过程都涉及使用 Kerberos 票据进行身份验证和授权。在 SSH 连接中,客户端通过 GSSAPI 从 KDC 获取票据,并将其用于与服务器进行身份验证。

不同之处:

  1. 上下文和目的:SSH 连接建立过程旨在建立安全的客户端-服务器通信通道,使双方能够安全地进行数据传输。而 KDC 分配密钥的过程是 Kerberos 系统中的一部分,目的是生成和分发用于身份验证和授权的票据。
  2. 资源和步骤:SSH 连接过程中,客户端和服务器需要访问 SSH 配置和相关的密钥、证书等资源,通过 GSSAPI 进行身份验证和建立连接。而 KDC 分配密钥的过程需要 Kerberos 预共享密钥库(KDC 数据库)和相关配置,通过密钥生成和分发算法来生成和分发票据。
  3. 应用范围: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/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注