kinit什么意思_kerberos入坑指南

本文介绍了Kerberos的身份认证原理,包括principal、realm和credential等核心概念。通过搭建KDC服务器,详细阐述了在Ubuntu 16.04上配置Kerberos的步骤,包括安装软件、配置文件设置、创建数据库和principal。最后讨论了将Kerberos认证集成到项目中时,如何使用GSSAPI和SASL接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理介绍

kerberos主要是用来做网络通信时候的身份认证,最主要的特点就是“复杂”。所以在入坑kerberos之前,最好先熟悉一下其原理。这里推荐一些别人写的文章内容来进行简单汇总:

几个概念的补充

principal

认证的主体,简单来说就是"用户名"

realm

realm有点像编程语言中的namespace。在编程语言中,变量名只有在某个"namespace"里才有意义。同样的,一个principal只有在某个realm下才有意义。

所以realm可以看成是principal的一个"容器"或者"空间"。相对应的,principal的命名规则是"what_name_you_like@realm"。

在kerberos, 大家都约定成俗用大写来命名realm, 比如"EXAMPLE.COM"

password

某个用户的密码,对应于kerberos中的master_key。password可以存在一个keytab文件中。所以kerberos中需要使用密码的场景都可以用一个keytab作为输入。

credential

credential是“证明某个人确定是他自己/某一种行为的确可以发生”的凭据。在不同的使用场景下, credential的具体含义也略有不同:

对于某个principal个体而言,他的credential就是他的password。

在kerberos认证的环节中,credential就意味着各种各样的ticket。

搭建一个KDC的环境

想要理解Kerberos,最好的方式是自己搭建一个KDC server。同时,这对于开发过程中进行测试也是非常有帮助的。

这里用ubuntu 16.04为例,简单搭一个kdc server

安装下载

apt-get install krb5-admin-server krb5-kdc krb5-user krb5-config

其中,这几个软件包的作用分别是:

krb5-admin-server: kdc管理员程序,可以让使用者远程管理kdc数据库。

krb5-kdc:kdc主程序

krb5-user: kerberos的一些客户端命令,用来获取、查看、销毁ticket等等。

配置

/etc/krb5.conf

[logging]

default = FILE:/var/log/krb5libs.log

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmind.log

[libdefaults]

default_realm = EXAMPLE.COM

dns_lookup_realm = false

dns_lookup_kdc = false

ticket_lifetime = 400

renew_lifetime = 600

forwardable = true

udp_preference_limit = 1

[realms]

EXAMPLE.COM = {

kdc = 127.0.0.1:88

admin_server = 127.0.0.1

}

这个配置kdc,kerberos客户端,以及调用kerberos api时都会使用到。

几个重要的配置项目包括:

ticket_lifetime和renew_lifetime:指定了kdc授权ticket的过期时长,和允许更新现有ticket的时长。

realms的section:指定了kdc和admin_server的路径

/etc/krb5kdc/kdc.conf

[kdcdefaults]

kdc_ports = 750,88

[realms]

EXAMPLE.COM = {

database_name = /etc/krb5kdc/example/principal

admin_keytab = FILE:/etc/krb5kdc/example/kadm5.keytab

acl_file = /etc/krb5kdc/example/kadm5.acl

key_stash_file = /etc/krb5kdc/example/stash

kdc_ports = 750,88

max_life = 10h 0m 0s

max_renewable_life = 7d 0h 0m 0s

master_key_type = des3-hmac-sha1

supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3

default_principal_flags = +preauth

}

这是kdc的专属配置,可以根据自己的需求修改下kdc数据库的存放目录。我都统一放/etc/krb5kdc/example目录下了。对于这个目录,自己需要提前建立好。

创建数据库和principal

使用kdb5_util创建数据库,从而可以存放principal相关的信息

kdb5_util create -r EXAMPLE.COM -s

使用kadmin.local来添加principal

root@weijiesun-kubuntu:/etc/krb5kdc# kadmin.local

Authenticating as principal root/admin@EXAMPLE.COM with password.

kadmin.local: add_principal test-server/myhost@EXAMPLE.COM

WARNING: no policy specified for test-server/myhost@EXAMPLE.COM; defaulting to no policy

Enter password for principal "test-server/myhost@EXAMPLE.COM":

Re-enter password for principal "test-server/myhost@EXAMPLE.COM":

Principal "test-server/myhost@EXAMPLE.COM" created.

kadmin.local: add_principal test-client/myhost@EXAMPLE.COM

WARNING: no policy specified for test-client/myhost@EXAMPLE.COM; defaulting to no policy

Enter password for principal "test-client/myhost@EXAMPLE.COM":

Re-enter password for principal "test-client/myhost@EXAMPLE.COM":

Principal "test-client/myhost@EXAMPLE.COM" created.

kadmin.local: ktadd -k /etc/krb5.keytab test-server/myhost@EXAMPLE.COM

Entry for principal test-server/myhost@EXAMPLE.COM with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-server/myhost@EXAMPLE.COM with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-server/myhost@EXAMPLE.COM with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-server/myhost@EXAMPLE.COM with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/etc/krb5.keytab.

kadmin.local: ktadd -k /etc/krb5.keytab test-client/myhost@EXAMPLE.COM

Entry for principal test-client/myhost@EXAMPLE.COM with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-client/myhost@EXAMPLE.COM with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-client/myhost@EXAMPLE.COM with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab.

Entry for principal test-client/myhost@EXAMPLE.COM with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/etc/krb5.keytab.

kadmin.local: q

root@weijiesun-kubuntu:/etc/krb5kdc#

这里,我们创建了两个新的用户:test-server/myhost@EXAMPLE.COM和test-client/myhost@EXAMPLE.COM。并且把他们的密钥放到/etc/krb5.keytab这一keytab文件下。

启动kdc

root@weijiesun-kubuntu:/etc/krb5kdc# service krb5-kdc start

* Starting Kerberos KDC krb5kdc [ OK ]

root@weijiesun-kubuntu:/etc/krb5kdc# service krb5-admin-server start

* Starting Kerberos administrative servers kadmind [ OK ]

当然,对于不同发行版,这一步执行的命令可能会不太一样。

用kinit验证KDC是否启动成功

kinit -k -t /etc/krb5.keytab test-client/myhost@EXAMPLE.COM

kinit对应的是向kdc获取TGT的步骤。它会向/etc/krb5.conf中指定的kdc server来发送请求。

如果TGT请求成功,你就可以用klist看到它。

weijiesun@weijiesun-kubuntu ~ $ klist

Ticket cache: FILE:/tmp/krb5cc_1000

Default principal: test-client/myhost@EXAMPLE.COM

Valid starting Expires Service principal

2018-08-17T13:50:25 2018-08-17T13:57:05 krbtgt/EXAMPLE.COM@EXAMPLE.COM

renew until 2018-08-17T14:00:25

把kerberos认证流程嵌到项目中

在真正使用kerberos进行身份认证时,我们一般不直接使用kerberos的接口。而是会使用诸如GSSAPI或者SASL等更通用的一些标准接口。之所以这么做,是因为:

kerberos的接口更琐碎

SASL和GSSAPI都是IETF标准,他们对身份认证这一行为做了更宏观的抽象。从而可以灵活的接入不同的认证方案。

GSSAPI

GSSAPI的其流程基本和kerberos类似。在现实应用中,你基本可以假设GSSAPI就是kerberos本身。在我们最常使用的kerberos实现MIT kerberos中,GSSAPI的接口也已经是一个内置项了。

比较推荐MIT官方给出的一个gssapi的sample,是学习kerberos完整认证过程一个非常好的例子。里面也有详细的文档教大家如何使用:

MIT kerberos项目内置的gss-sample也可以拿来学习kerberos的认证过程:

SASL

SASL是一个更加通用的身份认证接口,其接口在设计上可以兼容很多主流的认证方案。很多项目在做身份认证的时候,也是采用的SASL接口和流程。

SASL本身也有很多的实现,我在做小米的Pegasus项目时,采用的是cyrus-sasl。

想把sasl集成到项目中,并且使用gssapi作为其中的认证方案,其实不是特别的容易。这里给出一些要点:

从设计上而言,SASL上是一个client/server之间进行认证的接口。对于向KDC获取TGT这一行为,SASL没有预留接口。事实上,SASL在做第一步认证时,就假设用户已经获取到TGT了。所以这里需要我们自己实现获取TGT的代码,也就是kinit的过程。

SASL的用户名和kerberos的principal命名风格不是完全相同的。在kerberos的标准中,principal的命名方式为name1/name2/name3/.../nameN@realm; 而在SASL中,用户名的命名方式为username/FQDN。因而,在使用SASL的时候,一定要把username和FQDN分开传给sasl的认证接口,从而构造成kerberos的principal。

认真学习cyrus-sasl的认证示例,并参考这篇文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值