最新的 Kerberos 版本 5 没有定义它所支持的加密算法。这使得该协议灵活并易于扩展,但也使其不同实现之间的互操作问题非常突出。为了使基于不同 Kerberos 实现的客户端、应用程序和认证服务器之间实现互操作,它们必须至少有一个共同支持的加密算法。本文描述了在一个常见场景中如何确定并配置多方共同支持的 Kerberos 加密算法。该场景中,基于 Web Service security 的 WebSphere 应用程序运行在 z/OS 和 Windows 两个互信的 KDC 域中。最后给出一些关于 Kerberos 加密算法的调试方法。
介绍
在 WebSphere Application Server 版本 7 的安全方面,加入了对 Kerberos 身份认证机制的支持。Kerberos 是一个成熟、灵活、开放并且非常安全的网络认证协议。它使用私钥加密技术为客户 / 服务器端应用提供了强大的认证功能。
在认证过程中,Kerberos 需要对传递于不同参与者之间的令牌(ticket 和 authenticator)进行加密和解密。Kerberos 版本 5 没有对它所支持的加密算法的个数或种类进行预定义。虽然这使得该协议灵活并且易于扩展,但也使 Kerberos 5 的不同实现之间的互操作问题非常突出。为了使基于不同 Kerberos 实现的客户端、应用程序和认证服务器之间实现互操作,它们必须至少有一个共同支持的加密算法。
本文描述了在一个非常常见的客户场景中,如何 确定并配置多方共同支持的 Kerberos 加密算法。在这个场景中,使用了 Web Service security 的 WebSphere 应用程序运行在 z/OS 和 Windows 两个互相信任的 KDC 域中。在文章的最后,给出了一些关于 Kerberos 加密算法的调试方法。
场景概述
图 1. 场景概述
在 这个场景中,配置了两个 KDC。一个是基于 Windows 平台的 Windows KDC,另一个是基于 z/OS 平台的 z/OS KDC。实现了 Web Service security 的应用程序由客户端和服务器端两个部分组成,客户端部署在 Windows 平台的 WebSphere Application Server 上,服务器端部署在 z/OS 平台的 WebSphere Application Server 上。Windows 平台处于 Windows KDC 域中,z/OS 平台处于 z/OS KDC 域中。尽管在本场景中单向的信任(z/OS KDC 信任 Windows KDC)就足够了,但是本文还是介绍了如何配置双向的信任关系。因此,该场景会达到这样的效果:Windows KDC 域中的用户(客户端用户)如果通过了 Windows KDC 的认证,并且在服务器端通过了授权验证,就可以通过 Web Service 客户端程序访问服务器端的 Web Service。
如果您想了解如何配置跨 z/OS KDC 和 Windows KDC 领域信任,请参考这篇文章“Implementing SPNEGO TAI single sign-on for WebSphere applications with z/OS and Windows Kerberos trusted realms”。
表 1 中列出了本文中所用到的一些系统参数值,需要替换为您实际场景中的真实值。
表 1. 本文用到的系统参数值
参数名 | 参数值 |
---|---|
Windows KDC 主机名 | Winserver2008-1.pdl.pok.ibm.com |
Windows Web Service 客户端主机名 | boss61a.pdl.pok.ibm.com |
Windows KDC 域 | WIN2008KDC.PDL.POK.IBM.COM |
z/OS KDC 主机名 | webwb5.pdl.pok.ibm.com |
z/OS WebSphere 主机名 | ztestb0.pdl.pok.ibm.com |
z/OS KDC 域 | ZOSKDC.PDL.POK.IBM.COM |
不同平台 /Feature 支持的加密算法
由于 Kerberos 版本 5 没有预定义它所支持的加密算法的类型或个数,每个特定的 Kerberos 实现支持的加密算法不尽相同。选择使用哪种加密算法时,需要认真考虑各算法的加密能力,以及需要互操作的各平台及产品所支持的加密算法类型。
本 文中场景所涉及到的平台包括 z/OS KDC 和 Window KDC,我们需要考虑这两种 KDC 所支持的加密算法。由于场景中涉及的应用程序是运行于 WebSphere Application Server 的 Web Service security 应用,我们还需要考虑 WebSphere Application Server 以及 Web Service security 所支持的加密算法。
下面将介绍不同平台 /feature 所支持的 Kerberos 加密算法。
z/OS KDC
z/OS 上的 Kerberos 实现叫做“Network Authentication Service”,它所支持的 Kerberos 加密算法从 z/OS 1.9 开始相对于 z/OS 1.8 有所改变。
z/OS 1.8 上的 Network Authentication Service 支持以下几种加密算法:
- DES - 56-bit DES
- DESD - 带 key derivation 的 56-bit DES
- DES3 - 168-bit DES
z/OS 1.9 上的 Network Authentication Service 除了支持上面提到的 DES,DESD 和 DES3 以外,还支持以下两种加密算法:
- AES128 - 128-bit AES
- AES256 - 256-bit AES
Windows KDC
Windows Server 2003 支持 RC4-HMAC,DES-CBC-CRC 和 DES-CBC-MD5. Windows Server 2008 除了这三个加密算法外,还支持 -CTS-HMAC-SHA1-96 和 AES128-CTS-HMAC-SHA1-96。RC4-HMAC 是 Microsoft Windows 缺省使用的加密算法。
目前的 IBM JDK
WebSphere Application Server 使用内嵌的 IBM JDK,所以 IBM JDK 所支持的 Kerberos 加密算法也是需要考虑的方面。IBM JDK 中的 Java™ Cryptography Extension(JCE) 缺省的配置限制它的加密能力。如果需要使用 192-bit 和 256-bit Advanced Encryption Standard (AES),必须要使用无限制的 policy 文件。
为了简化我们的场景,本文的配置将不选择 192-bit 或者 256-bit AES。
WebSphere WS-security XML
由于 XML 规范不支持 DES,所以 WebSphere 中的 Web Service 功能也不支持 DES。
可 扩展标记语言(XML)加密规范由万维网联盟(W3C)在 2002 年制定。该规范包括对数据进行加密、解密的步骤,呈现 XML 加密数据的语法,用来进行数据解密的信息,以及加密算法列表。加密算法列表中包括 triple Data Encryption Standard(DES), Advanced Encryption Standard(AES) 以及 Rivest-Shamir-Adleman algorithm (RSA)几类。XML 规范支持的加密算法包括 tripledes-cbc, aes128-cbc, aes192-cbc, aes256-cbc, rsa-1_5 和 rsa-oaep-mgf1p。
加密算法之间的兼容性
z/OS RACF 和 Windows 所支持的 Kerberos 各加密算法之间存在一定的对应关系,各个对应的加密算法之间是兼容的。表 2 列出了这种兼容关系。
表 2. Kerberos 加密算法之间的兼容关系
z/OS RACF | Windows |
---|---|
DES | des-cbc-crc, des-cbc-md5 |
DESD | des-hmac-sha1 |
DES3 | des3-cbc-sha1-kd , tripledes-cbc |
AES128 | aes128-cts-hmac-sha1-96, aes128-cbc |
AES256 | aes256-cts-hmac-sha1-96, aes256-cbc |
确定共有的加密算法
综上所述,表 3 总结了各不同平台 /feature 对各种 Kerberos 加密算法的支持情况。“Y”表示支持,“N”表示不支持。
表 3. 不同平台 /feature 对 Kerberos 加密算法的支持
z/OS 1.8 | z/OS 1.9 | Window 2003 | Windows 2008 | Current IBM JDK | WS-securityXML | |
---|---|---|---|---|---|---|
DES | Y | Y | Y | Y | Y | N |
DES3 | Y | Y | N | N | Y | Y |
DESD | Y | Y | N | N | Y | N |
AES128 | N | Y | N | Y | Y | Y |
AES256 | N | Y | N | Y | N | Y |
由 于本文场景的需要,我们需要综合考虑 z/OS KDC、Windows KDC、IBM JDK 和 WebSphere Application Server 中的 WS-security XML 所支持的加密算法,确定哪个加密算法是它们共同支持的。所以本文会选择 z/OS 1.9 和 Window 2008 server 作为操作系统平台,使用 AES128 作为共用的 Kerberos 加密算法。
配置 Kerberos 加密算法
在 Kerberos 配置文件中配置加密算法
加 密算法需要在几个 Kerberos 配置文件中进行设置,包括 z/OS KDC 要用到的 envar,运行于 z/OS 平台的 WebSphere Application Server 需要使用的 krb5.conf 和 Windows 客户端需要使用的 krb5.ini。
表 4. 需要设置加密算法的 Kerberos 配置文件
平台 | Kerberos 配置文件 |
---|---|
z/OS KDC | envar |
z/OS 上的 WebSphere Application Server | krb5.conf |
Windows 客户端 | krb5.ini |
- z/OS KDC的 Kerberos 配置文件
envar 文件是 z/OS KDC 用来设置环境变量的配置文件。在该文件中,我们可以通过设置 SKDC_TKT_ENCTYPES 参数来指定该 KDC 支持哪些 Kerberos 加密算法。由于在本文场景中需要使用 AES128 作为 Kerberos 加密算法,参数 SKDC_TKT_ENCTYPES 的值需要包含 aes128-cts-hmac-sha1-96。下面是一个 envar 文件的例子,在这个例子中,SKDC_TKT_ENCTYPES 的值被设为所有的加密算法,所以 z/OS KDC 会支持所有的 Kerberos 加密算法。
清单 1. envar
b)z/OS WebSphere Application Server 和 Window 客户端的 Kerberos 配置文件
在 每一个 Kerberos 客户端机器上都需要配置 Kerberos 配置文件 krb5.conf 或者 krb5.ini。在 z/OS 平台上需要为 WebSphere Application Server 配置 krb5.conf;而在 Windows 平台上,需要为 Web Service 客户端配置 krb5.ini。在 krb5.conf/krb5.ini 文件中,支持的 Kerberos 加密算法是由参数 default_tkt_enctypes 和 default_tgs_enctypes 的值决定的。default_tkt_enctypes 指定了 TGT 中用户部分所使用的加密算法;default_tgs_enctypes 指定了 service ticket 中用户部分所使用的加密算法。为了简化配置,本文将这两个参数都设为一样的 aes128-cts-hmac-sha1-96 加密算法。[capaths] 部分用来指明 z/OS KDC 域和 Window KDC 域彼此信任。
清单 2. krb5.conf
[libdefaults] default_realm = ZOSKDC.PDL.POK.IBM.COM default_keytab_name = FILE:/etc/krb5/krb5.keytab kdc_default_options = 0x40000000 use_dns_lookup = 0 udp_preference_limit=1 ; Default encryption types if AES128 is not supported default_tkt_enctypes = aes128-cts-hmac-sha1-96 default_tgs_enctypes = aes128-cts-hmac-sha1-96 [realms] ZOSKDC.PDL.POK.IBM.COM = { kdc = webwb5.pdl.pok.ibm.com:88 kpasswd_server = webwb5.pdl.pok.ibm.com:464 admin_server = webwb5.pdl.pok.ibm.com:749 } WIN2008KDC.PDL.POK.IBM.COM = { kdc = Winserver2008-1.pdl.pok.ibm.com:88 default_domain = WIN2008KDC.pdl.pok.ibm.com } [domain_realm] ztestb0.pdl.pok.ibm.com = ZOSKDC.PDL.POK.IBM.COM webwb5.pdl.pok.ibm.com = ZOSKDC.PDL.POK.IBM.COM boss61a.pdl.pok.ibm.com = WIN2008KDC.PDL.POK.IBM.COM Winserver2008-1.pdl.pok.ibm.com = WIN2008KDC.PDL.POK.IBM.COM [capaths] ZOSKDC.PDL.POK.IBM.COM = { WIN2008KDC.PDL.POK.IBM.COM = . } WIN2008KDC.PDL.POK.IBM.COM = { ZOSKDC.PDL.POK.IBM.COM = . }
清单 3. krb5.ini
[libdefaults] default_realm = WIN2008KDC.PDL.POK.IBM.COM use_dns_lookup = 0 forwardable = true renewable = true udp_preference_limit=1 ; Default encryption types if AES128 is not supported default_tkt_enctypes = aes128-cts-hmac-sha1-96 default_tgs_enctypes = aes128-cts-hmac-sha1-96 [realms] ZOSKDC.PDL.POK.IBM.COM = { kdc = webwb5.pdl.pok.ibm.com:88 kpasswd_server = webwb5.pdl.pok.ibm.com:464 admin_server = webwb5.pdl.pok.ibm.com:749 } WIN2008KDC.PDL.POK.IBM.COM = { kdc = Winserver2008-1.pdl.pok.ibm.com:88 default_domain = WIN2008KDC.pdl.pok.ibm.com } [domain_realm] ztestb0.pdl.pok.ibm.com = ZOSKDC.PDL.POK.IBM.COM webwb5.pdl.pok.ibm.com = ZOSKDC.PDL.POK.IBM.COM boss61a.pdl.pok.ibm.com = WIN2008KDC.PDL.POK.IBM.COM Winserver2008-1.pdl.pok.ibm.com = WIN2008KDC.PDL.POK.IBM.COM [capaths] ZOSKDC.PDL.POK.IBM.COM = { WIN2008KDC.PDL.POK.IBM.COM = . } WIN2008KDC.PDL.POK.IBM.COM = { ZOSKDC.PDL.POK.IBM.COM = . }
Kerberos 加密算法的平台相关配置
- z/OS KDC
RACF 中需要为客户端和 WebSphere Application Server SPN 创建带 KERB 字段的用户。我们需要在用户创建阶段保证它们支持 AES128 加密算法。
可以参考下面的 RACF 命令来创建客户端用户:
ADDUSER CLIENT PASSWORD(temp)
ALTUSER CLIENT KERB(KERBNAME(CLIENT) ENCRYPT(NODES NODES3 NODESD AES128 NOAES256)) PASSWORD(password) NOEXPIRED
下面是创建 WebSphere Application Server SPN 用户的命令示例:
ADDUSER WASKERB PASSWORD(temp)
ALTUSER WASKERB KERB(KERBNAME(WAS/ztestb0.pdl.pok.ibm.com) ENCRYPT(NODES NODES3 NODESD AES128 NOAES256)) PASSWORD(password) NOEXPIRED
在 z/OS 系统升级或移植时,可能会遇到一些问题。DES3 只有在 z/OS 1.2 及以上版本才被支持;AES128 和 AES256 只有在 z/OS 1.9 或以上才被支持。当一个 principal 的密码改变后,会为该 principal 生成当前级别 z/OS 所支持的所有加密算法的 key。所以当 principle 从低于 z/OS 1.2 的系统移植到 z/OS 1.2 上时,该 principal 没有 DES3 key,必须通过修改 principal 的密码来生成 DES3 key。同样的情况也适用于 z/OS 1.9 和 AES128/AES256 key。
Kerberos principal krbtgt 在 RACF 中被定义为 REALM KERBDFLT。如果系统升级到了 z/OS 1.9 后没有对其密码进行更改,那么它只有 DES,DESD 和 DES3 key,没有 AES128 和 AES256 key。可以通过这个命令更改密码来生产 AES key:
RALT REALM KERBDFLT KERB(PASSWORD(xxx))
对于其它的 principal,使用 ALTUSER 或其它命令来更改密码。
如果 principal 从别的系统移植过来,原理的系统中 RACF 选项 KERBLVL 被设成了 0,那么这些 principal 只有 DES key。
- Windows KDC
为了使用 AES128 加密算法,Windows KDC 上需要进行一些特殊的配置。
- 确保用户帐号不使用 DES 作为加密算法
对于 AD 用户帐号,需要确保没有使用 DES 加密算法。以 user1 为例:
打开 “Server Manager”。在左边的导航树上打开
Roles -> Active Directory Domain Services -> Active Directory Users and Computers -> Domain Name (这里是 WIN2008KDC.pdl.pok.ibm.com) -> users -> 选中 “user1”,右键
打开 Properties Dialog 并切换到“Account” 标签页。确保"Use Kerberos DES encryption types for this account" 选项没有选中。如果这个选项是被选中的,DES 将被用作该帐号的加密算法,而不是 AES128。
图 2. 不选 "Use Kerberos DES encryption types for this account"
- 保证只使用 AES128 加密算法
打开注册表编辑器:开始 -> 运行 -> 输入“regedit”
右键选中条目 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kdc -> New -> DWORD
输入新的子关键字的名称“KdcUseRequestedEtypesForTickets”。
右 键选中“KdcUseRequestedEtypesForTickets”并选择“Modify”,将其值设为“1”。这样 KDC 就会只使用设置的 AES128 加密算法。如果该注册表条目的值没有被设置,那么它的缺省值为 0,意味着 KDC 会使用它所支持的功能最强的加密算法。
图 3. 设置 KdcUseRequestedEtypesForTickets 的值为 1
- 告诉 MS KDC foreign realm(z/OS KDC)支持 AES
通过 Control Panel -> Administrator Tools -> Active Directory Domains and Trusts 路径打开“Active Directory Domains and Trusts”窗口
右键点击 WIN2008KDC.pdl.pok.ibm.com,选中 properties
转到 Trusts 标签页并选择 ZOSKDC.PDL.POK.IBM.COM ->
点击 Properties … ,选中“The other domain supports Kerberos AES Encryption”
图 4. Foreign realm 支持 AES 加密算法
关于加密算法的一些调试方法
方法 1
当你需要查看存储在 keytab 文件中的 principle 使用的加密算法时,可以使用 klist
命令。
klist -k -e FILE:/etc/krb5/krb5.keytab
运行结果:
Key table: FILE:/etc/krb5/krb5.keytab Number of entries: 1 [1] principal: WAS/ztestb0.pdl.pok.ibm.com@ZOSKDC.PDL.POK.IBM.COM KVNO: 1 Encryption type: AES128-CTS-HMAC-SHA1-96
方法 2
如果需要查看运行时所使用的加密算法是否正确,可以打开一些包含加密算法信息的调试信息。
- z/OS KDC
打开 SKRBKDC job 的调试信息:
- 运行时动态的打开调试信息
SKRBKDC job 启动后,使用控制台命令
F SKRBKDC,DEBUG ON F SKRBKDC,DEBUG *.8
- 在配置文件中打开调试信息
在 envar 文件中设置如下参数,然后重启 SKRBKDC job
_EUV_SVC_DBG=*.8 _EUV_SVC_DBG_MSG_LOGGING=1 _EUV_SVC_DBG_FILENAME=/tmp/kdc.dbg _EUV_SVC_MSG_LOGGING=STDOUT_LOGGING
- WebSphere Application Server
设置与 Kerberos 调试相关的 JVM custom properties
com.ibm.security.jgss.debug=all com.ibm.security.krb5.Krb5Debug=all
图 5. 在管理控制台中设置与 Kerberos 调试相关的 JVM custom properties
- 查看网络数据包中使用的加密算法
Wireshark 可以捕获网络中的数据包,查看发往 KDC 和从 KDC 发出的数据包中使用的加密算法。
图 6. 使用 Wireshark 查看数据包中的加密算法
方法 3
在调试信息中,有时候会使用特定的数字来代表相应的加密算法。RFC 3961 中定义了各加密算法和数字之间的对应关系。
表 5. RFC 3961 中列出的加密算法与数字的对应关系
加密算法 | 数字 |
---|---|
des-cbc-crc | 1 |
des-cbc-md4 | 2 |
des-cbc-md5 | 3 |
des3-cbc-md5 | 5 |
des3-cbc-sha1 | 7 |
dsaWithSHA1-CmsOID | 9 |
md5WithRSAEncryption-CmsOID | 10 |
sha1WithRSAEncryption-CmsOID | 11 |
rc2CBC-EnvOID | 12 |
rsaEncryption-EnvOID | 13 |
rsaES-OAEP-ENV-OID | 14 |
des-ede3-cbc-Env-OID | 15 |
des3-cbc-sha1-kd | 16 |
aes128-cts-hmac-sha1-96 | 17 |
aes256-cts-hmac-sha1-96 | 18 |
rc4-hmac | 23 |
rc4-hmac-exp | 24 |
subkey-keymaterial | 65 |
结束语
本 文描述了在一个客户常见场景(基于 Web Service security 的 WebSphere 应用程序运行在 z/OS 和 Windows 两个互信的 KDC 域中)中如何确定并配置多方共同支持的 Kerberos 加密算法。这是基于不同 Kerberos 实现的客户端、应用程序和认证服务器之间实现互操作的必要条件。最后,本文还给出一些关于 Kerberos 加密算法的调试方法,以方便客户解决实际操作中可能碰到的 Kerberos 加密算法相关的问题。