1 主要概念
- realm:区域,类似与命名空间。
- Principal:即认证主体。通俗的可以理解为用户名。一个Principal会被定义一个realm中,该principal在其它realm中没有意义。
Principal通常包括三个部分,分别为
primary
、instance
、realm
。例如,可以定义一个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
如上配置了user
、host
、service
三种策略集,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
调试。
参考: