Kerberos原理整理

一、什么是kerberos
kerberos是一种网络身份验证协议。它设计的目的是使用对称密钥加密技术为客户端/服务器应用提供可靠的身份验证。
美国麻省理工学院提供了一种该协议的实现。kerberos已经在很多公司产品中应用。kerberos是美国麻省理工学院为了解决非安全
的网络环境中安全问题的解决方案。kerberos使用可靠的密钥使服务器能够验证客户端的身份,在不安全的网络环境中进行连接。
第一个版本是kerberos V4,后来得到广泛应用后又出了kerberos V5.

二、kerberos原理
用户只需要经过一次身份验证就可以获得票据访问多个服务,既sso(single sign on).
kerberos V4的验证过程:
整个验证过程包括三个角色、六个步骤。
三个角色分别是kerberos服务器、service(简称S)、client(简称C)。
kerberos服务器有两个部分,authentication service(验证服务,简称AS)、ticket-granting service(票据授权服务,简称TGS,TGS应该是kerberos的一部分,可以使用kerberos的数据库)。
AS给用户发放ticket-granting ticket(票据授权服务的票,简称TGT)。
TGT包含用户与TGS会话的sessionKey(SKTGS)、用户名(UID)、用户地址(UADDR)、TGS名(TGSID)、有效期(LT)、开票时间戳(TS),使用TGS密钥(KTGS)加密。
TGS给用户发放service ticket(服务票,简称ST)。
ST包含用户与service的会话sessionK(SKS)、用户名(UID)、用户地址(UADDR)、服务名(SID)、有效期(LT)、开票时间戳(TS),使用服务自己的密钥(KS)加密。
六个步骤分别是:
1.C->AS
client向kdc发送用户名,请求票据授权服务。
即便这条消息被截取,因为不知道用户密码,恶意攻击也无法完成后面的解密工作。
2.AS->C
AS查找是否存在此用户及其密码,如果在数据库中找到该用户名,AS会生成使用用户密码(KC)加密过的包。
这个包包含TGT及SKTGS。
即便这条响应消息被截取,因为包使用password加过密,恶意攻击无法解密。
3.C->TGS
client在收到kdc返回的消息后,会使用password解密加过密的包,获得SKTGS和TGT,解密成功表示用户验证成功。
client会向TGS发送验证器(Authenticator)及TGT,及SID。
验证器是使用SKTGS加过密的。包含UID、UADDR、LT、TS。验证器的LT时间很短,这个是基于恶意攻击者在这段时间内很难伪造用户名及用户地址,来保证验证器的唯一。
这里如果验证器及TGT被截取到,由于伪造用户名及地址需要花一定时间,所以恶意攻击者将截取的验证器发送到TGS后验证器也已经过期了。
4.TGS->C
TGS收到C的请求后,会先使用KTGS解密TGT,获得SKTGS,再使用SKTGS解密验证器。
TGS会进行用户身份认证:
首先,使用KTGS解密TGT,获取SKTGS及其他信息;
然后,判断票据是否过期,根据票据里的LT及TS;
接着,使用SKTGS解密验证器;
再者,判断验证器是否过期;
再接着,判断验证器里的UID及UADDR与票据里的是否一致;
以上所有验证通过后,TGS确认用户身份。然后TGS会返回给用户ST(服务票据)、SKS(C与S共享sessionKey)。
ST使用KS加密过的,里面包含SKS、UID、UADDR、SID、LT、TS。
TGS返回给C的消息是使用SKTGS加密过的一个整包。
这里即便消息被截取,因为使用SKTGS加过密,而SKTGS只有kerberos和C知道,故恶意攻击者是无法获取ST及SKS的。
5.C->S
C使用SKTGS解密响应包,获取SKS及ST。
C将验证器和ST发给S。
验证器使用SKS加密过,里面包含UID、UADDR、LT、TS。
这里由于有验证器的缘故,恶意攻击者很难使用截获的验证器及票据,以期通过S验证。
6.S->C
S收到C的请求消息,会先使用KS解密ST。S使用票据里的SKS解密验证器。
S验证C的身份:
验证票据的有效时间。
验证是否是请求的本服务。
验证验证器的有效时间。
验证验证器的UID、UADDR与票据里的是否一致。
验证通过后,S确认了C的身份。S向C返回响应信息,该信息使用SKS加密。
C收到S响应信息后使用SKS解密,解密成功后进行请求服务操作。

V5与V4原理基本相同。
三、安装

四、命令
http://web.mit.edu/kerberos/krb5-1.13/doc/user/user_commands/kdestroy.html
1.klist
列出缓存凭证中的principal和票据,或者keytab文件中的密钥。
klist [-e] [[-c] [-l] [-A] [-f] [-s] [-a [-n]]] [-C] [-k [-t] [-K]] [-V] [cache_name|keytab_name]
-e 显示会话密钥或缓存凭证中的每一个凭证的票据,或者keytab文件中每一个key的加密方式。
-I 如果缓存集合可用,列表展示集合中当前缓存的概况信息
-A 如果缓存集合可用,展示集合中所有缓存的内容
-c 列出缓存凭证中的票据。如果没有指定-c或-K参数,默认使用-c
-f 显示凭证中的当前的标签,使用缩写:
F    Forwardable
f    forwarded
P    Proxiable
p    proxy
D    postDateable
d    postdated
R    Renewable
I    Initial
i    invalid
H    Hardware authenticated
A    preAuthenticated
T    Transit policy checked
O    Okay as delegate
a    anonymous
-s 使klist不产生输出。如果缓存的凭证不可读或者过期,则klist退出并返回状态1,其它情况返回0.
-a 展示凭证中的地址列表
-n 显示数字地址,而不是反向解析地址
-C 如果klist与配置的数据冲突,显示缓存凭证存放的配置数据。默认不显示。
-k 列出keytab文件中的key
-i 结合-k使用。如果没有指定名字,则默认使用客户端的keytab。
-t 列出keytab文件中每一个keytab记录的记录时间的时间戳
-K 显示keytab文件中每一个keytab的加密密钥的值
-V 显示kerberos的版本号并退出
2.kdestroy
使用重写或删除包含该用户的缓存证书的方法来销毁用户已激活的认证票据。如果没有指定缓存的凭证,将销毁默认的凭证。
kdestroy [-A] [-q] [-c cache_name]
-A 销毁所有缓存的凭证
-q 暗地运行。一般如果kdestroy删除用户票据失败会发出告警声,-q参数可以阻止此事发生。
-c cache_name 使用cache_name作为缓存的票据凭证的名字和位置。如果没有指定此参数,则使用默认的缓存凭证的名字和位置。
3.kinit
用户获得和缓存用户初始的TGT
kinit [-V] [-l lifetime] [-s start_time] [-r renewable_life] [-p | -P] [-f | -F] [-a] [-A] [-C] [-E] [-v] [-R] [-k [-t keytab_file]] [-c cache_name] [-n] [-S service_name] [-I input_ccache] [-T armor_ccache] [-X attribute[=value]] [principal]
-V 展示冗余输出
-l lifetime 指定票据的生命周期。如果没有设置,使用默认的配置。指定的生命周期大于配置的最大生命周期,也不会覆盖配置文件。
-s start_time 指定票据延期生效时间
-r renewable_life 指定票据的刷新周期
-f 要求转发票据
-F 要求不转发票据
-p 要求代理票据
-P 要求不代理票据
-a 要求限制主机地址的票据
-A 要求不限制主机地址的票据
-C requests canonicalization of the principal name, and allows the KDC to reply with a different client principal from the one requested.
-E treats the principal name as an enterprise name (implies the -C option).
-v 要求缓存的TGT交给KDC验证。如果票据在请求的时间范围内,缓存会被验证过的票据覆盖。
-R 要求刷新TGT票据。注意过期的票据不能刷新,即使票据在刷新时间范围内。
-k [-i | -t keytab_file] 请求一张票据,从本地主机的keytab中获取密钥。
-n
-I input_ccache
-T armor_ccache
-c cache_name
-S service_name
-X attribute[=value]
X509_user_identity=value
X509_anchors=value
flag_RSA_PROTOCOL[=yes]
4.kpasswd
更改principal的密码。
kpasswd [principal]
5.krb5-config
krb5-config [--help | --all | --version | --vendor | --prefix | --exec-prefix | --defccname | --defktname | --defcktname | --cflags | --libs [libraries]]
6.ksu
有两个用途:一是安全地改变目标用户的真实有效的用户ID,二是创建新的安全环境。必须是kerberos5.
ksu [ target_user ] [ -n target_principal_name ] [ -c source_cache_name ] [ -k ] [ -r time ] [ -pf ] [ -l lifetime ] [ -z | Z ] [ -q ] [ -e command [ args ... ] ] [ -a [ args ... ] ]
7.kswitch
如果缓存集合可用,指定缓存凭证为缓存集合的第一缓存。
kswitch {-c cachename|-p principal}
8.kvno
获得一张指定principal的服务票据,并打印其key的版本号
9.kadmin & kadmin.local
kadmin和kadmin.local都是kerberos V5管理系统的命令行接口。两个命令的功能几乎一样,不同的是kadmin.local可以直接进入kdc数据库;
而kadmin需要使用kadmind执行。
kadmin提供对于principals、密码策略和keytabs的管理。
kadmin [-O|-N] [-r realm] [-p principal] [-q query] [[-c cache_name]|[-k [-t keytab]]|-n] [-w password] [-s admin_server[:port]]
kadmin.local [-r realm] [-p principal] [-q query] [-d dbname] [-e enc:salt ...] [-m] [-x db_args]
进入命令行界面:
9.1 list_principals [expression] 命令可以查看所有或者expression所指定的principals
9.2 add_principal [options] newprinc 创建一个新的principal。
options:
-expire expdate 指定该principal的截止日期
-pwexpire pwexpdate 指定密码的截止日期
-maxlife maxlife The maximum ticket life for the principal.
-maxrenewlife maxrenewlife The maximum renewable life of tickets for the principal.
-kvno kvno 最初key的版本号
-policy policy 改principal使用的密码策略。如果没有指定,如果默认设置存在使用默认设置(除非设置-clearpolicy)。
-clearpolicy 如果-policy没有设置,防止分配任何策略
{-|+}allow_postdated 是否允许该principal获取过期的票据,-表示禁止
{-|+}allow_forwardable 是否允许该principal获取转发票据,-表示禁止
{-|+}allow_renewable 是否允许该principal获取刷新票据,-表示禁止
{-|+}allow_proxiable 是否允许该principal获取代理票据,-表示禁止
{-|+}allow_dup_skey
{-|+}requires_preauth
{-|+}requires_hwauth
{-|+}ok_as_delegate
{-|+}allow_svr
{-|+}allow_tgs_req
{-|+}allow_tix
{-|+}needchange
{-|+}password_changing_service
{-|+}ok_to_auth_as_delegate
{-|+}no_auth_data_required
-randkey 为该principal设置随机key
-nokey 创建principal不使用key
-pw password 设置该principal的密码,不建议使用。
-e enc:salt,...
-x db_princ_args 指定数据库特有的参数。针对LDAP数据库的参数有:
-x dn=dn
-x linkdn=dn
-x containerdn=container_dn
-x tktpolicy=policy
9.3 modify_principal
modify_principal [options] principal
9.4 rename_principal
rename_principal [-force] old_principal new_principal
9.5 delete_principal
delete_principal [-force] principal
9.6 change_password
change_password [options] principal
options:
-randkey
-pw password
-e enc:salt,...
-keepold
9.7 purgekeys
purgekeys [-all|-keepkvno oldest_kvno_to_keep] principal
9.8 get_principal
get_principal [-terse] principal
9.9 get_strings
get_strings principal
9.10 set_string
set_string principal name value
9.11 del_string
del_string principal key
9.12 add_policy
add_policy [options] policy
9.13 modify_policy
modify_policy [options] policy
9.14 delete_policy
delete_policy [-force] policy
9.15 get_policy
get_policy [ -terse ] policy
9.16 list_policies
list_policies [expression]
9.17 ktadd
ktadd [options] principal
ktadd [options] -glob princ-exp
添加principal或者符合princ-exp的一类principals。
options:
-k[eytab] keytab 设置keytab文件,否则使用默认keytab
-e enc:salt,...
-q 展示少量的冗余信息
-norandkey 不使用随机key。这个参数只能在kadmin.local中使用。不能与-e参数一起使用
9.18 ktremove
ktremove [options] principal [kvno | all | old]
9.19 lock
9.20 unlock
9.21 list_requests
9.22 quit
9.23 xst
xst -k keytab文件存放路径 pricipal
五、常见错误
   1.GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)]
     此问题是由于kerber客户端与kdc时钟不同步导致。

你可能感兴趣的:(Kerberos原理整理)