跨 KDC 域的 WebSphere Web Services Security 应用中的 Kerberos 加密算法

最新的 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. 场景概述

图 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 RACFWindows
DESdes-cbc-crc, des-cbc-md5
DESDdes-hmac-sha1
DES3des3-cbc-sha1-kd , tripledes-cbc
AES128aes128-cts-hmac-sha1-96, aes128-cbc
AES256aes256-cts-hmac-sha1-96, aes256-cbc

确定共有的加密算法

综上所述,表 3 总结了各不同平台 /feature 对各种 Kerberos 加密算法的支持情况。“Y”表示支持,“N”表示不支持。

表 3. 不同平台 /feature 对 Kerberos 加密算法的支持
z/OS 1.8z/OS 1.9Window 2003Windows 2008Current IBM JDKWS-securityXML
DESYYYYYN
DES3YYNNYY
DESDYYNNYN
AES128NYNYYY
AES256NYNYNY

由 于本文场景的需要,我们需要综合考虑 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 KDCenvar
z/OS 上的 WebSphere Application Serverkrb5.conf
Windows 客户端krb5.ini
  1. 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 加密算法的平台相关配置

  1. 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。

  1. 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"

图 2. 不选

  • 保证只使用 AES128 加密算法

打开注册表编辑器:开始 -> 运行 -> 输入“regedit”

右键选中条目 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kdc -> New -> DWORD

输入新的子关键字的名称“KdcUseRequestedEtypesForTickets”。

右 键选中“KdcUseRequestedEtypesForTickets”并选择“Modify”,将其值设为“1”。这样 KDC 就会只使用设置的 AES128 加密算法。如果该注册表条目的值没有被设置,那么它的缺省值为 0,意味着 KDC 会使用它所支持的功能最强的加密算法。

图 3. 设置 KdcUseRequestedEtypesForTickets 的值为 1

图 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 加密算法

图 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

如果需要查看运行时所使用的加密算法是否正确,可以打开一些包含加密算法信息的调试信息。

  1. 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
  1. WebSphere Application Server

设置与 Kerberos 调试相关的 JVM custom properties

 com.ibm.security.jgss.debug=all 
 com.ibm.security.krb5.Krb5Debug=all
图 5. 在管理控制台中设置与 Kerberos 调试相关的 JVM custom properties

图 5. 在管理控制台中设置与 Kerberos 调试相关的 JVM custom properties

  1. 查看网络数据包中使用的加密算法

Wireshark 可以捕获网络中的数据包,查看发往 KDC 和从 KDC 发出的数据包中使用的加密算法。

图 6. 使用 Wireshark 查看数据包中的加密算法

图 6. 使用 Wireshark 查看数据包中的加密算法

方法 3

在调试信息中,有时候会使用特定的数字来代表相应的加密算法。RFC 3961 中定义了各加密算法和数字之间的对应关系。

表 5. RFC 3961 中列出的加密算法与数字的对应关系
加密算法数字
des-cbc-crc1
des-cbc-md42
des-cbc-md53
des3-cbc-md55
des3-cbc-sha17
dsaWithSHA1-CmsOID9
md5WithRSAEncryption-CmsOID10
sha1WithRSAEncryption-CmsOID11
rc2CBC-EnvOID12
rsaEncryption-EnvOID13
rsaES-OAEP-ENV-OID14
des-ede3-cbc-Env-OID15
des3-cbc-sha1-kd16
aes128-cts-hmac-sha1-9617
aes256-cts-hmac-sha1-9618
rc4-hmac23
rc4-hmac-exp24
subkey-keymaterial65

结束语

本 文描述了在一个客户常见场景(基于 Web Service security 的 WebSphere 应用程序运行在 z/OS 和 Windows 两个互信的 KDC 域中)中如何确定并配置多方共同支持的 Kerberos 加密算法。这是基于不同 Kerberos 实现的客户端、应用程序和认证服务器之间实现互操作的必要条件。最后,本文还给出一些关于 Kerberos 加密算法的调试方法,以方便客户解决实际操作中可能碰到的 Kerberos 加密算法相关的问题。

发表评论