Kerberos

介绍Kerberos相关概念,SSH免密登录案例。

Posted by Cheney.Yin on April 11, 2023

1 主要概念

  • realm:区域,类似与命名空间。
  • Principal:即认证主体。通俗的可以理解为用户名。一个Principal会被定义一个realm中,该principal在其它realm中没有意义。 Principal通常包括三个部分,分别为primaryinstancerealm。例如,可以定义一个realm为EXAMPLE.COM,在这个realm里定义一个principal,如JACK@EXAMPLE.COM。如果JACK还有admin的身份,为了区分之前的主体,可以表示为JACK/ADMIN@EXAMPLE.COM;如果JACK被特定在某个主机上,那么可以表示为JACK/x.x.x.x@EXAMPLE.COM。以上三个主体的密码、权限都是独立的。参考
  • password:主体或用户密码,即Kerberos中master_key。password存储keytab文件中,在Kerberos使用密码的场景中,需要输入keytab文件。keytab文件用于不需要人工交互和保存纯文本密码。
  • credential:凭证,证明某个人是他或某种行为存在的证据。
    • 对Principal而言,其credential是password。
    • 在Kerberos的各个认证环节中,使用的ticket也属于credential.

2 结构


KDC原理图
  • Authentication Server(AS):认证服务器,识别主体身份。为认证成功的主体发放申请准入票据的票据(Ticket Granting Ticket,TGT)。
  • Ticket Granting Server(TGS):票据授权服务器,确定主体是否有权利访问某个服务,为准入的主体发送服务票据(Service Ticket,ST)。
  • Kerberos采用对称加密机制。

3 安装

测试节点

域名
kdc.expr-net
ssh-node.expr-net
ssh-client.expr-net

Docker环境下的两个容器, 使用了expr-net网络driver.

1
2
3
docker run --name kdc --hostname kdc  --network expr-net --ip 192.168.100.22 -itd ubuntu /bin/bash
docker run --name ssh-node --hostname ssh-node.expr-net --network expr-net --ip 192.168.100.23 -itd ubuntu /bin/bash
docker run --name ssh-client --hostname ssh-client --network expr-net --ip 192.168.100.24 -itd ubuntu /bin/bash

服务端

安装

1
apt-get install -y krb5-admin-server krb5-kdc

安装过程中配置默认领域、默认领域使用的kerberos服务器主机名、默认领域使用的管理服务器主机名。

1
2
3
4
5
6
7
8
9
Default Kerberos version 5 realm: EXPR-NET

Enter the hostnames of Kerberos servers in the cheney.site Kerberos realm separated by spaces.

Kerberos servers for your realm: kdc.expr-net

Enter the hostname of the administrative (password changing) server for the cheney.site Kerberos realm.

Administrative server for your Kerberos realm: kdc.expr-net

初始化默认领域EXPR-NET的数据库,并且设置该领域的密码。

1
krb5_newrealm

启动服务

1
2
3
4
root@kdc:/# service krb5-kdc start
 * Starting krb5kdc
root@kdc:/# service krb5-admin-server start
 * Starting Kerberos administrative servers kadmind 

配置

使用kadmin.local完成一些配置。

配置策略

1
2
3
4
kadmin.local:  add_policy -minlength 6 -minclasses 2 user
kadmin.local:  add_policy -minlength 6 -minclasses 2 host
kadmin.local:  add_policy -minlength 6 -minclasses 2 service
kadmin.local:  quit

如上配置了userhostservice三种策略集,minlength表示密码最短长度,minclasses表示使用的密码元素最少类别。

配置主体

创建jack@EXPR-NET的用户主体。

1
2
3
4
kadmin.local:  add_principal -policy user jack
Enter password for principal "jack@EXPR-NET": #123abc
Re-enter password for principal "jack@EXPR-NET": #123abc
Principal "jack@EXPR-NET" created.

创建host/ssh-node.expr-net@EXPR-NET的服务主体,该主体用于ssh-node.expr-net主机的SSH服务。

1
2
3
4
5
kadmin.local:  add_principal -policy service -randkey host/ssh-node.expr-net
Principal "host/ssh-node.expr-net@EXPR-NET" created.
kadmin.local:  ktadd -k /etc/krb5.keytab -norandkey host/ssh-node.expr-net
Entry for principal host/node.cheney.site with kvno 1, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/node.cheney.site with kvno 1, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.

另外,jack@EXPR-NET也需要导入krb5.keytab。该文件需要拷贝到SSH服务主机下/etc/krb5.keytab,用于验证用户身份。

配置SSH服务

需要预先在SSH服务主机安装krb5-user。并且配置默认领域、kdc主机名、管理主机名同KDC服务端一致。

1
2
3
4
5
6
# /etc/krb5.conf
[realms]
	EXPR-NET = {
		kdc = kdc.expr-net
		admin_server = kdc.expr-net
	}

host/ssh-node.expr-net申请TGT。

1
kinit -k -t /etc/krb5.keytab host/ssh-node.expr-net@EXPR-NET

配置SSH服务,

1
2
3
4
5
6
7
8
# /etc/ssh/sshd_config

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

#调试使用
#LogLevel DEBUG3

调试命令

1
/usr/sbin/sshd -E /var/log/sshd.log

如果日志出现问题,请通过systemctl或者service重启后关停再执行。

客户端

1
apt-get install -y krb5-user

配置/etc/krb5.conf,

1
2
3
4
5
[realms]
	EXPR-NET = {
		kdc = kdc.expr-net
		admin_server = kdc.expr-net
	}

申请jack@EXPR-NET的TGT票据。

1
2
kinit jack@EXPR-NET
Password for jack@EXPR-NET:

查看票据,

1
2
3
4
5
6
7
klist -f
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: jack@EXPR-NET

Valid starting       Expires              Service principal
2023-04-12T11:53:22  2023-04-12T21:53:22  krbtgt/EXPR-NET@EXPR-NET
	renew until 2023-04-13T11:53:12, Flags: RIA

配置SSH客户端,

1
2
3
4
#/etc/ssh/ssh_config

GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

测试登录,

1
ssh jack@ssh-node.expr-net -v

整个测试过程中,经常会出现各种各样的问题。主要的问题体现在认证过程中使用的主体上。认证过程中的主体是由主机环境、网络环境决定的,十分复杂,经常出现主体不匹配的问题。最好配合dnsutils调试。

参考

参考:

1 Using Kerberos with SSH

2 Kerberos+SSH安装配置使用教程