尽管以下RedBook IBMRedbooks®标题于2004年发布,但是我们建议读者在尝试配置SSO之前先对其进行完整的回顾。 我们发现该文档相关且非常有用,并且我们相信我们的读者也会。
IBM Eserver iSeries服务器上基于Windows的Single Signon和EIM框架 :
我们想指出第二章-规划网络身份验证服务和企业身份映射的实现。 本章对于成功实施SSO至关重要。 第2章中的几个关键点是所需的必要先决条件组件和计划工作表(2.4)。 不要低估计划工作表的价值。 附录D有空白的计划工作表供读者使用。
这是规划单点登录的两个链接,其中包含上面的RedBook Redbooks标题缺少的当前信息。
配置单点登录环境的要求:
单一登录计划工作表:
这是我们使用的Planning WorkSheet,它将为本文中的示例和插图提供帮助。
我们还发现,第4.2章-提供了Kerberos协议的组件(图4-1),这对说明所有不同的Kerberos组件如何组合在一起以执行Kerberos网络解决方案非常有帮助。
最初,Kerberos仅支持DES和Triple-DES加密。 不再推荐使用DES,因此PTF添加了对较新的加密类型AES128,AES256和RC4以及QSYSINC中新的KRB5头文件的支持:
V7R1 SI42919,SI42919
V6R1 SI42957,SI42957
V5R4 SI43034,SI43034
如果打算使用这些PTF提供的较新的加密方法之一,则必须修改NAS向导创建的批处理文件,因为它默认使用DES。 有关详细信息和说明,请参阅PTF求职信。
如果尚未设置Active Directory,请按照Microsoft的这些说明进行安装和创建。
如何在Windows Server 2003上安装Active Directory
如何在Windows Server 2003中创建Active Directory服务器
如何在Windows Server 2008上安装Active Directory
如果您已经设置了Active Directory,请与Microsoft®Windows®管理员联系,以查看他们是否设置了特定的目录结构以及希望放置Kerberos服务帐户的位置。 如果是这样,请参阅本文结尾处有关自定义AD批处理文件的部分。
注意 :此示例使用运行Windows Server 2003且将Active Directory作为Kerberos领域的密钥分发中心(KDC)的系统,因此用于初始登录的客户端系统必须能够加入Windows域。
这并不意味着客户必须运行Windows -我们还建立了一个openSUSE的v 11.1工作站Kerberos领域中的主要点登录点。 YaST(用于openSuSE和SuSELinux®Enterprise发行版的安装和配置工具)包括Kerberos设置向导。 使用该工具,Linux可以在登录时联系Active Directory,获得授予票证的票证,并访问其他启用Kerberos的资源,例如IBM i上的HTTP服务器。 我们还使用了本文中包含的示例Java代码来创建与IBM i的启用Kerberos的JDBC连接。 由于每个Linux发行版可能会有所不同,因此您可能必须在Internet上搜索有关配置您的文章以使其作为Kerberos领域的主要工作站的文章。
Windows域是共享中央目录数据库的计算机的逻辑组。 该中央数据库在Windows 2000和Windows Server 2003中称为Active Directory,在Windows Server 2008和Server 2008 R2中称为Active Directory域服务,在Windows NT操作系统上称为NT目录服务(NTDS)。 它包含该域中资源的用户帐户和安全性信息。 在域中使用计算机的每个人都会收到自己的唯一帐户或用户名。 然后可以为该帐户分配对域内资源的访问权限。
在域中,该目录位于配置为“域控制器”的计算机上。 域控制器是一台服务器,用于管理用户和域交互之间所有与安全相关的方面,从而集中安全性和管理。 当使用10台以上的PC时,Windows Server域通常适合企业和/或组织。
希望成为域安全性的工作站和服务器必须成为域成员。 参与域安全性通常称为单点登录,简称SSO。
此链接描述了工作站加入Windows域必须遵循的过程:
Windows网络
LDAP服务器必须支持EIM所需的特殊对象类和属性,它们是IBM Tivoli LDAP服务器的一部分。 例如,AD和OpenLDAP没有这些架构扩展。
对于我们的示例,我们选择在IBM i上实施。
IBM Tivoli Directory Server for i5 / OS(LDAP):
此时选择的LDAP服务器仅需要运行并可以访问。 不需要进一步的配置。
当您通过System i Navigator运行EIM配置向导时,将在本文后面完成LDAP服务器的EIM配置。
讨论EIM配置向导的知识库文章显示,应在屏幕的EIM向导中指定LDAP管理员DN,以输入LDAP管理员以及IBM i EIM系统用户DN。 虽然这很容易 遵循和设置,从安全和管理的角度来看,这当然是一个坏习惯。 LDAP管理员通常是一个帐户(如QSECOFR),应定期更改密码。 但是,如果您将LDAP Admin用作IBM i EIM系统用户帐户,并且有人更改了LDAP Admin密码,则EIM会停止工作,并且任何用户都无法使用Kerberos进行身份验证。 作为准备任务,最好为EIM设置一个额外的LDAP用户条目,并在为EIM系统用户配置EIM向导期间指定该帐户。 这样,您还可以通过访问控制列表ACL控制对LDAP目录各个部分的访问(以防客户将LDAP服务器用于其他目的的工具)。
另外,从IBM V6R1开始,您可以配置LDAP服务器的多个实例。 我们建议为EIM域控制器使用单独的实例。 LDAP服务器是一个非常关键的组件。 如果EIM域控制器不可用,则没有用户可以通过SSO进行身份验证。 因此,将EIM部分拆分为单独的LDAP 推荐服务器。
我们建议的另一个可用性问题是,当需要为多个IBM i分区实施SSO时。 在这种情况下,第一个IBM i分区将是EIM域控制器,而下一个IBM i分区将加入第一个IBM i分区上的现有EIM域。 如果第一个分区出现故障,则没有用户可以向第二个或其他分区进行身份验证。 强烈建议先以传统方式设置EIM,然后在支持SSO的每个IBM i分区上配置LDAP复制并创建EIM数据的副本。 复制活动后,立即更改每个系统上的本地EIM配置,使其指向自己的(本地)系统作为EIM域控制器。 这样,每个分区都可以彼此独立地运行。
在本文的前面,我们讨论了EIM红皮书中的“规划工作表”,其示例在第2章中,而空白副本可以在附录D中找到。如果您已正确完成此工作表,则将容易得多。浏览企业身份管理(EIM)和网络身份验证服务(NAS)向导,因为工作表中的几个值需要插入到显示的各个屏幕中。 知识库文档是配置EIM和NAS的绝佳资源,可在以下网站找到该文档:
http://www-912.ibm.com/s_dir/slkbase.NSF/DocNumber/558590066。 请注意,此文档还包含“规划工作表”的副本。 我们可能听起来很多余,但是我们不能十分强调使用此计划工作表的重要性。 多年来,在许多配置中成功与失败之间一直存在差异。 如果您还没有完成工作表,那么在继续阅读知识库文档之前,您应该花点时间。 红皮书的第2.4节告诉您在哪里可以获取工作表的信息。 另外,您应该阅读Redbooks标题为Time / SNTP的2.2.2节,并确保您的IBM i正在与SNTP服务器通信,并且它具有通过QTIMZON系统值配置的正确时区。 (在IBM i的最新发行版中,QTIMZON自动将QUTCOFFSET调整为正确的值)。
在上面引用的知识库文档中EIM / NAS配置的步骤J中,您将使用向导创建必须复制到Active Directory计算机并运行的批处理文件(.bat)。 .bat文件的目的是在Active Directory计算机上运行ktpass语句,该语句将设置您在NAS中配置的服务主体。 与手动输入ktpass命令相比,这更容易ktpass不容易出错。 如果Windows管理员已经设置了特定的目录结构以及他们希望放置Kerberos服务帐户的位置,请在运行它之前参阅本文结尾处有关自定义AD批处理文件的部分。
知识库文档中还有关于使用QSH的keytab list和kinit -k命令验证NAS配置的部分。 对您配置的每个服务主体(krbsvr400,http等)执行此操作,并更正此时发现的任何错误,这一点非常重要。 纠正错误可能包括反复运行NAS配置,更改DNS,更改Active Directory或解决其他问题,例如IBM i与Active Directory计算机之间的时差。 通过确保此时已正确配置NAS,可以将NAS作为问题解决,如果以后在处理过程中遇到麻烦。 如果以后确实有问题,可以随时返回并重新运行NAS验证,以确保它是正确的。 KB文档中的最后一项是设置EIM映射,该映射将您的IBM i用户ID映射到您在Active Directory中设置的用户ID。 最后,您应该在IBM i上检查系统值QRMTSIGN 。 该值应设置为*VERIFY 。 如果将其设置为*FRCSIGNON ,它将覆盖您配置单一登录的所有尝试,并始终显示登录提示。
在NAS配置期间,您可能会看到以下警告屏幕。 据说客户端和服务器解析主机名的方式有所不同。 在所示示例中,请注意列出了两个不同的主机名。 我们发现,尽管在收到此错误后可以继续使用NAS向导,但最好返回并解决DNS或客户端或服务器上的主机表中冲突的根源。 我们在越过主机名冲突屏幕时遇到错误,并且krbsvr400主体正常工作,但是HTTP主体无法连接。
错误CWB0999 RC8999指示三件事之一:
1.未启用DES加密。
2. Active Directory中的kbsvr400帐户需要使用在网络身份验证服务(NAS)配置期间设置的相同密码来重置。
3.验证AD帐户是否设置为“使用DES加密”:http://support.microsoft.com/kb/977321
默认情况下,Windows 7和Windows Server 2008 R2中禁用了用于Kerberos身份验证的数据加密标准(DES)加密。 此MS Techdoc描述了由于禁用了DES加密而可能在应用程序,安全性和系统日志中收到以下事件的各种情况:
•KDCEVENT_UNSUPPORTED_ETYPE_REQUEST_TGS
•KDCEVENT_NO_KEY_INTERSECTION_TGS
此外,它还说明了如何在Windows 7和Windows Server 2008 R2中为Kerberos身份验证启用DES加密。 有关详细信息,请参阅此Techdoc的“症状”,“原因”和“解决方法”部分。
如果您使用的是Windows Server 2003,则在尝试配置5250仿真会话之前,建议您安装kerbtray 。 Kerbtray是一个实用程序,它将显示从KDC提供给您的PC的票证。 这是获取实用程序的链接。 该下载(Windows Server 2003资源工具包工具)除了kerbtray之外,还包括其他实用程序。 Windows Server 2003资源工具包工具:
Windows Server 2008没有可下载的资源工具包。Microsoft声明:“与以前的操作系统不同,在Windows Server 2008和Windows Server 2008 R2中,资源工具包工具是作为服务器角色安装的一部分安装的。过去,您必须单独下载资源工具包工具。
某些工具(例如kerbtray在Windows Server 2008和Windows Server 2008 R2版本中具有合适的替代品。 Kerbtray不再是工具集的一部分,但klist可用于完成以前由它执行的许多任务。”
http://social.technet.microsoft.com/wiki/contents/articles/windows-server-2008-and-windows-server-2008-r2-support-tools-dsforum2wiki.aspx 在参与启用了Kerberos的域的Windows PC上安装并调用kerbtray之后,您将在系统托盘中看到一个绿色图标,如下所示:
如果kerbtray无法从KDC获取票证,则该图标如下所示:
如果右键单击并选择票证,它们将显示如下:
您应该看到“票证授予票证”。 在这种情况下,krbtgt / RCHPWDI.COM
如果您未从KDC收到TGT,请不要继续尝试为任何应用程序配置EIM,因为必须继续进行TGT。
如果您没有收到TGT,则Wireshark(请参阅参考资料)跟踪将是调查原因的最有用工具。
一旦有了TGT,请按照以下步骤为Kerberos身份验证配置5250仿真会话:
如果还有其他问题,Wireshark跟踪始终是一个好主意。 另外,请检查域控制器,AD服务器和PC上的事件日志,以及QZSOSIGN作业日志中的Kerberos错误消息。 如果错误来自Windows的IBM System I Access(通常具有CWB前缀),则可以通过执行开始>程序> IBM System i Access for Windows>服务>错误和跟踪消息帮助来获取有关消息的更多信息。
为Kerberos V5身份验证启用i5 / OS NetServer支持:
请按照以下步骤为Kerberos身份验证配置System i Navigator(iNav):
至此,EIM已配置且可运行。 现在让我们将SSO带到WebSphere。 我们在i5 / OS V6R1上使用了WebSphere V6.1。
我们使用以下出版物作为指南: 5761-XH2 V6R1系统i Access for Web
使用WebSphere SPNEGO支持的System i Access Web单点登录
尽管我们对启用System i Access for Web单点登录不感兴趣,但是该文档描述了Windows服务器和WebSphere需要完成的工作。
我们从2.5节-创建HTTP服务主体开始,到3.4节-配置SPNEGO TAI结束
某些值得注意的项目包括第19页的错字,该错字是在“创建JGSS使用的Kerberos配置文件:”信息之后开始的。 该信息引用了一个名为“ spnego.krb5.keytab ”的文件。 该文件应命名为spnego.krb5.conf 。 然后,文档提供该文件的值。 确保在填充spnego.krb5.conf ,以下内容位于同一行,而不是文档中所示的单独行。
default_keytab_name = FILE:/QIBM/UserData/OS400/NetworkAuthentication/keytab/HTTP_systemName.keytab我们的spnego.krb5.conf文件显示在这里供参考:
[libdefaults] default_realm = RCHPWDI.COM default_keytab_name = FILE:/QIBM/UserData/OS400/NetworkAuthentication/keytab/ HTTP_rchassmb.keytab default_tkt_enctypes = des-cbc-md5 rc4-hmac default_tgs_enctypes = des-cbc-md5 rc4-hmac kdc_default_options = 0x54800000 [realms] RCHPWDI.COM = { kdc = TOSHW2003.RCHPWDI.COM:88 default_domain = rchland.ibm.com } [domain_realm] .rchland.ibm.com = RCHPWDI.COM在第30页上,有使用安全配置向导的说明。 安全向导页面2说明了独立LDAP注册表的使用。 无论是否在i5 / OS上使用Directory Server,这都是您要进行的选择。 在此步骤中,您要连接到Microsoft Active Directory上的LDAP服务器。
我们使用了Ldp.exe ,它是Windows支持工具实用程序,可用于对Active Directory执行轻型目录访问协议(LDAP)搜索,以获取给定搜索条件的特定信息。
使用Ldp.exe在Active Directory中查找数据:
http://support.microsoft.com/kb/224543
在确定基本和绑定专有名称语法时,此工具变得很有用。
接下来,您将要查看4.6节-配置域帐户浏览器设置。
一旦配置了WebSphere安全性,就可以使用snoop servlet进行验证。 如果您遇到用户名和密码的挑战,则表明未发生SSO。
这导致我们调试步骤。 我们发现第5节很有用,特别是第5.3节-SPNEGO组件的诊断跟踪设置。 我们发现跟踪信息非常有帮助。
至此,EIM已配置且可运行。 现在,让我们使用IBM Java Toolbox在IBM i V6R1上建立到DB2的SSO连接。
我们已经提供了示例代码,以使用Kerberos票证结合IBM Toolbox for Java来登录到IBM i。 有两种示例方法。 第一个示例使用内置的工具箱代码获取Kerberos票证。 第二个示例使用JGSS手动获取Kerberos票证,然后将其传递到工具箱代码。
您将需要在main()中更改示例代码以使其适合您。 具体来说,以下三个系统属性的值需要更新以匹配您的环境:
java.security.krb5.realm (计划工作表项目A)
java.security.krb5.kdc (计划工作表项目B)
KRB5CCNAME (仅在示例2中使用)
此外,在两种示例方法中都需要更新AS400()构造函数,以使用IBM i系统的名称。
除了需要进行编码更改以外,还必须已经为Kerberos配置了IBM i。 您还将需要以下各项。
1.在运行该代码并已正确添加到Windows域的PC上,将krb5.ini文件添加到C:\WINDOWS目录。
已添加示例krb5.ini文件以供参考。
可下载的代码:krb5.ini
2.我们遇到了一种情况,Microsoft限制了一个接口来从Kerberos安全包中检索票证授予票证/会话密钥对。 这迫使我们更改在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters找到的注册表值allowtgtsessionkey 。 在此处记录:
http://support.microsoft.com/kb/308339
3.在PC上创建两个环境变量:USER.HOME和USER.NAME。
Java kinit命令需要这些来将主体凭证存储在高速缓存中。 这是运行示例2的关键要求。
USER.HOME是kinit放置证书文件的目录,文件名以krb5cc_开头,并以USER.NAME环境变量的值结尾。 USER.NAME的值应小写。 在下面的示例中,凭据文件将为C:\Documents and Settings\jahrens\krb5cc_jahrens
4.此时,我们建议在PC上运行kinit命令。 kinit命令是JVM的一部分。 例如,我们使用了IBM JVM 1.6。 在我们的例子中, kinit位于C:\ Program Files \ IBM \ Java60 \ jre \ bin
这是运行成功的kinit命令的示例(您将必须输入用户密码)。
C:\Documents and Settings\jahrens>kinit Password for jahrens@RCHPWDI.COM: Done! New ticket is stored in cache file C:\Documents and Settings\jahrens\krb5cc_jahrens如果kinit命令失败,请更正错误并再次运行命令。 在kinit成功完成之前,您将不希望继续。 为了帮助调试, kinit命令将使用在C:\Windows目录下的krb5.ini文件中找到的值。
注意! 样本2需要成功完成kinit然后才能期望它被调用并成功运行。
5.我们仅成功使用IBM的JDK / JRE。 我们无法成功使用Sun的JDK / JRE。
这些示例的唯一外部依赖关系是Toolbox / JTOpen jar文件( jt400.jar )和JGSS(包含在JRE 1.4及更高版本中)。
可以从( JTOpen )网站获得jt400.jar文件,也可以从IBM i的/ QIBM / ProdData / HTTP / Public / jt400 / lib /中的IFS获得jt400.jar文件。
信息中心包含许多用C语言编写的EIM API的示例。 但是,样本通常仅包含一个功能。 实际上,通常必须将多个功能放到一个程序中才能真正完成API有用的工作。
以下是将一些API组合在一起的源代码,最终运行了eimGetTargetFromSource API,该API可用于将用于登录到客户端(源)的域配置文件映射到用于登录到另一个平台的配置文件或应用程序(目标)。 在示例中,您将看到必须同时使用许多其他API来完成此操作。
如果要编写基于Windows的应用程序,需要从启用Kerberos的服务器请求服务,则可能需要从默认的Windows凭据缓存中获取授予票证的票证。 TGS_request上需要TGT,以获得服务票证。 我们遇到的问题是,缺少有关如何正确使用TGT的文档,默认情况下,Windows中的文档位于内存中的凭据缓存中,并且从未写入文件。 我们知道必须有一组功能,但是我们正在努力尝试通过Google搜索找到它们。 我们得出的结论是,Microsoft的klist实用程序必须在其中包含可以实现我们想要的(或接近我们想要的)代码,因此我们集中精力寻找klist源代码。 我们在Microsoft Windows 7.0 SDK的示例源中找到了源代码(可从http://www.microsoft.com/download/zh-cn/details.aspx?displaylang=en&id=3138下载),我们正在路上。 如果安装Windows 7.0 SDK,则klist.c源代码位于C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\security\authorization\klist 。
在这里没有复制整个klist源代码,我们将指出源代码的一些关键元素。
我们特别感兴趣的函数调用是:
LsaConnectUntrusted-返回登录句柄 LsaLookupAuthenticationPackage-使用登录句柄和要返回的缓冲区的名称,它返回一个包ID LsaCallAuthenticationPackage-使用登录句柄和包ID返回信息缓冲区,包括请求的票证查阅klist源代码将显示如何编写这些函数调用的代码。
我们在调用klist以获得TGT时使用的parms是
get krbtgt/RCHPWDI.COM ,其中RCHPWDI.COM是我们的默认领域的名称。
GetEncodedTicket函数中有许多printf语句,它们调用LsaCallAuthenticationPackage。 他们解析票务结构并将其分块呈现。 这是RFC 1510定义的票证结构:
typedef struct _KERB_EXTERNAL_TICKET { PKERB_EXTERNAL_NAME ServiceName; PKERB_EXTERNAL_NAME TargetName; PKERB_EXTERNAL_NAME ClientName; UNICODE_STRING DomainName; UNICODE_STRING TargetDomainName; UNICODE_STRING AltTargetDomainName; KERB_CRYPTO_KEY SessionKey; ULONG TicketFlags; ULONG Flags; LARGE_INTEGER KeyExpirationTime; LARGE_INTEGER StartTime; LARGE_INTEGER EndTime; LARGE_INTEGER RenewUntil; LARGE_INTEGER TimeSkew; ULONG EncodedTicketSize; PUCHAR EncodedTicket; } KERB_EXTERNAL_TICKET, *PKERB_EXTERNAL_TICKET关于必须复制到Active Directory计算机并运行的批处理文件(.bat),在某些情况下,Windows管理员已经设置了特定的目录结构以及他们希望放置Kerberos服务帐户的位置。 这通常与批处理文件不符。 下面是一个使这一点更加明显的示例。
例如,在生成的示例批处理文件(.bat)中采用以下条目:
DSADD用户cn = rchassmb_1_krbsvr400,cn = users,dc = RCHPWDI,dc = COM -pwd PWD1SUP -display rchassmb_1_krbsvr400
KTPASS -MAPUSER rchassmb_1_krbsvr400 -PRINC krbsvr400/rchassmb.rchland.ibm.com@RCHPWDI.COM -PASS PASSWORD -mapop set + DesOnly -ptype KRB5_NT_PRINCIPAL
在这种情况下,创建新帐户rchassmb_1_krbsvr400的默认位置在此层次结构中:
root RCHPWDI.COM Users rchassmb_1_krbsvr400通常,Windows管理员设置一种结构,该结构根据组织边界或其他条件来组织LDAP条目。
例如:
root RCHPWDI.COM IT Operator System Administrators Technical Users Rochester Sales Marketing Support etc.然后,Windows管理员将提供路径到目录中应放置Kerberos服务帐户的位置。
例如,技术用户。 在这种情况下,上一个示例中的命令如下所示:
DSADD用户“ cn = rchassmb_1_krbsvr400, ou =技术用户,ou = IT ,dc = RCHPWDI,dc = COM ” -pwd PWD1SUP -display rchassmb_1_krbsvr400
KTPASS -MAPUSER rchassmb_1_krbsvr400 -PRINC krbsvr400/rchassmb.rchland.ibm.com@RCHPWDI.COM -PASS PASSWORD -mapop set + DesOnly -ptype KRB5_NT_PRINCIPAL
这总是需要在NAS向导创建文件后手动编辑批处理文件。
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-sso/index.html