专家访谈

Keys Botzum 谈 WebSphere 安全性

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 专家访谈

敬请期待该系列的后续内容。

此内容是该系列的一部分:专家访谈

敬请期待该系列的后续内容。

问: 在 WAS 和 WP 中,更新密码的最佳实践是什么?在我们的环境中,强迫我们每隔 90 天就要把每个密码更新一次。在测试的时候,我们在 WAS 和 WP 上总是遇到问题。我们需要更改 WAS 用户的密码,DB2® 用户的密码,每个管理密码。幸运地是,我们还没有部署。为了避免错误和维持计算机的正常运行,我们应该在哪里更改密码?以什么顺序?有没有一个清单或者脚本可以帮助我们?

答: 对于 WebSphere® Application Server(以后称为 Application Server),我推荐在 Application Server 运行的时候更改密码,接下来重新启动每个单元服务器。这是非常重要的。如果您在 Application Server 没有运行的时候更改注册密码,您将不能启动它。

对于数据库,方法是类似的。在数据库中更改密码,接下来是在 Application Server 中,然后重新启动。在这里,顺序并不是要求的十分严格,因为在您更改密码的时候,Application Server 并不去校验密码。

在每种情况中,当密码处在前后不一致的短暂时期的时候,都存在一定的故障风险。这里没有办法避免这点,但是如果您有可复制的服务器并且快速的转移,将会降低风险。

对于 WebSphere Portal,还有其他需要考虑的密码。幸运的是,WebSphere Portal 支持站点包含了很多关于如何更改大部分密码的非常好的文档:

如果您编辑了任何一个密码,您可能还需要更新 <WPS_ROOT>/config/wpconfig.properties 文件。注意 wpconfig.properties 文件在 WebSphere Portal 运行期间并不使用。请注意我并不是在支持这点。在 wpconfig.properties 文件中存储密码并不是一个好主意。我们推荐您在实施安装的时候删除它们:

WSPconfig cleanup-work-dir
WPSconfig delete-passwords

问: 用我们内部的 CA 中的 key 来替换 DummyKeys 被证实是非常困难的。我们仍然有一个问题,当一个新的结点被添加并联合到 CELL 中时,在联合可以开始,并且部署管理器可以管理新的节点代理以前,需要做一些手动的更改。该问题的根本归因于指向 Dummy keys 的 DefaultSSL 指令,和在其配置中使用 DefaultSSL 指令的 SOAP JMX Administration 端口。有没有更加灵活的方式来将一个节点联合到 CELL 中去,而不用手动的更改配置?

答: 很不幸,这些手动步骤是必须的,并且并没有灵活简单的解决方案来实现这一点。您需要单独安装新的节点,将 key 复制到机器中,使用这些新的 key 来更改该节点,接下来将该节点联合到 CELL 中。如果同步后正确的放置了复制的 key,该节点应该继续使用这些 key。如果您关心重复能力,您可以创建一个 wsadmin 脚本,该脚本配置该节点的 SSL,并且将复制 key,配置节点和联合的操作封装进一个 shell 脚本。

问: 我是一名 IT 架构师,并且我正在为一个 WPS 共享环境设计解决方案。它的意思是使用一个单独的 WPS 安装,但是供许多公司来使用。在没有安全问题的条件下配置这样的环境是可能的。您能预见什么安全问题吗?

答: 这里有许多问题,我很难一一列举:

  1. WebSphere Portal 和 WebSphere Application Server 仅仅支持一个单独的注册表,因此您计划如何为多个公司管理用户?
  2. 您打算如何管理 ACL 来控制对 portlet 的访问?您可以通过代理下面的管理来帮助自己,但是我认为管理起来是非常困难的。
  3. 这些公司是否需要在公用的 WebSphere Portal 环境中部署他们自己的代码?如果是这样,您知道 WebSphere Portal 和 WebSphere Application Server 并不提供应用程序隔离吗?因此,一个应用程序可以伤害该 CELL,并且破坏其他相关的应用程序。
  4. 您想要确保不同的公司不能看到彼此的 portlet,您打算如何处理应用程序访问?

问: 我希望通过 WAS 全局安全性来保护管理。但是我的应用程序并没有使用 J2EE 安全。我能够做些什么呢?

答: 我们强烈建议所有的 WebSphere Application Server 用户使用全局安全。如果没有做这些,就意味着将应用服务器公开给众多种类的攻击,因为管理动作是非安全的。通常情况下,简单应用全局安全对于应用程序并没有任何负面的影响。然而,有一些可测量的性能指标和一些 API,比如 request.getRemoteUser(),在使用安全的情况下会表现出不同的行为。如果应用程序依赖 request.getRemoteUser() 来返回 Web CGI 变量 REMOTE_USER 的值(它不应该这样,因为在没使用安全的情况下这是不安全的),在开启安全的情况下它将崩溃。应用服务器将返回空值,除非用户具备认证属性。如果您处在这种情况下,您又不能改变应用程序,在 WebSphere Application Server 5.0 Network Deployment 中,当您应用全局安全时,您可以不再单独的应用服务器上应用安全。这在服务器级安全下面的管理控制台中, Servers -> Application Servers -> <servername> -> Additional Properties -> Server Security -> Server Level Security

这个选项只有在该节点被联合的情况下才会出现。通过这一操作,您已经确保了所有的内部管理通信是安全的(加密或授权),但是同时,您并没有在应用服务器中运行的应用程序上应用安全。注意我们 强烈推荐应用程序利用 J2EE 安全并且不要禁用服务器级别的安全。

问: 当在 WebSphere Application Server 中实现自定义用户注册表的时候,都需要考虑什么事情?

答: 自定义用户注册表(UserRegistry 接口的一个实现)使客户使用他们自己的自定义注册表,而不是 WebSphere Application Server 中本来提供的两个:操作系统和 LDAP。第一个,也是最重要的,我们推荐如果您能避免的话尽量不要使用 CUR,因为这将限制同其他使用 LDAP 的应用程序的互操作性。然而,如果需要的话,您也可以编写一个 CUR。请注意,您自己的自定义注册表实现可能没有依赖任何 WebSphere Application Server J2EE 组件,诸如数据源,企业 Bean 等等。这是因为在启动时,安全是在其他大多数 WebSphere Application Server 组件之前初始化和可用的。如果您以前的实现(从 WAS 4.0)使用这些组件,需要做一个更改来消除依赖。比如,如果您的上一个实现用数据源来连接一个数据库,那么现在用 Java database connectivity(JDBC)来连接到数据库。注意在小心谨慎的情况下(和对初始化过程的良好理解),在 CUR 中使用 DataSource 也是可能的,但是仅仅在一个应用服务器内部(不是节点代理),并且仅仅在初始化结束以后。

问: 为什么不鼓励使用 SWAM?

答: SWAM 代表 Simple WebSphere Authentication Mechanism。SWAM 认证机制倾向于在简单的、非分布式的和独立应用服务器类型的运行时环境中使用。独立应用服务器的限制是因为 SWAM 不支持可转发的信任状。如果应用服务器进程 1 中的 servlet 或者企业 bean 调用应用服务器进程 2 中的企业 bean 的一个远程方法,进程 1 中调用者的身份并不会传输到服务器进程 2 中。真正传输的是一个未经认证的信任状态,其依赖于 EJB 方法中配置的安全许可,可能造成认证失败。

另外,SWAM 认证状态是通过 HTTPSession 来维护的,而不是像 LTPA 那样的单独 cookie。这就削弱了认证的安全性,因为 HTTPSession 并没有设计成安全的。比如,错误的 LTPA 令牌审查。

在 WebSphere Application Server(base)v5.0 中,您可以使用 SWAM 作为认证机制。在 WebSphere Application Server Network Deployment v5.0 中,SWAM 并不是一个被支持的选项,甚至在 base 版中,它的使用也是不鼓励的。

问: 在我的 WebSphere Application Server 应用程序中,在使用基于表单的登录时,为什么我必须使用 SSO?

答: 原因是非常简单的。通过使用 SSO,WebSphere Application Server 在 Web 请求之间保留用户状态为 LTPA cookie。如果没有使用 SSO,每个单独的请求都需要认证。如果您选择基于表单的登录,一旦表单完成了用户的认证,它将重定向回原始请求的 URL。没有 SSO,用户的认证将丢失并且这些认证将失败。当使用基本的认证时并不会出现这种情况,因为认证信息包含在每个 HTTP 请求中,并且 WebSphere Application Server 在任何需要的时候都可以使用它(这并不影响安全和性能)。

问: 在闲置超时后,我想要强迫我的用户重新登陆。WAS 如何使会话超时和 LTPA 超时起作用呢?

答: WebSphere Application Server LTPA 是基于登陆会话的寿命来标记过期,而不是基于静止状态。因此,如果用户在一段时间内没有执行任何动作,WebSphere Application Server 登陆会话并不会过期。然而,HTTPSession 却是基于静止状态类决定过期。如果在您的应用程序中,您需要基于闲置来决定使用应用程序的过期,您必须在应用程序中明确的用代码写出来。当一个用户得到一个过期的会话时(其实是一个新的会话),您可以捕获并且如果需要的话,可以强迫用户重新登陆。请注意,这一点将破坏跨应用程序的单点登入。

问: 我正在努力解决将我的对象绑定到 WebSphere Application Server 的命名目录的问题。在过去的一个星期,我已经与 IBM 技术支持人员进行了交谈,但是除了从他那里得到一堆红皮书的链接之外一无所获。我现在连接到 WAS 5.x 的 2809 端口,并且没有任何许可的异常。用户名和密码是我用来连接到管理控制台的用户名和密码,并且他们是我正在使用的 LDAP 的一部分。如果您能只给我一个简单的程序或者一些相关的东西,将对我非常的有帮助。

环境:
WebSphere 5.0.2.6 (使用与 network 以及 base 产品)
问题陈述:
当我们试图连接到运行在“全局安全”开启情况下的命名服务的时候,得到了一个 CORBA_NO_EXCEPTION 错误。
Naming Environment Settings:
ALL_AUTHENTICATED Cos Naming Read, Cos Naming Write, Cos Naming Create, Cos Naming Delete. EVERYONE Cos Naming Read

该问题的步骤:

  1. 在管理控制台中,开启“Global Security”,并且关闭“Enforce Java 2 Security”。
  2. 活动用户注册表被设定为“Local OS” / “LDAP”,并且活动协议为“CSI and SAS”。
  3. 用新的“root”用户名和密码来重新启动 Deployment Manager,节点代理和应用程序节点。
  4. 运行一个程序(通过 servlet 调用),通过 2809 端口连接到本地命名服务。
  5. 在调用 amingcontext.rebind() 时抛出了异常。

程序生成了下面的错误:

try{env.put(InitialContext.PROVIDER_URL, "iiop://dev.businessapp.com:2809");
// Greg: for the authentication type we have tried "simple" ,
// "strong" and "LTPA" without any luck.
env.put(javax.naming.Context.SECURITY_AUTHENTICATION, "simple");
env.put(javax.naming.Context.SECURITY_PRINCIPAL, "root");
env.put(javax.naming.Context.SECURITY_CREDENTIALS, "rootpassword");
ctxt = new javax.naming.InitialContext(env);
ctxt.rebind("aName", obj);
}catch(Exception e){
e.printStackTrace(System.out);
}
Exception printed by aforementioned printStackTrace is following:
<<< Exception from SystemOut.log
[9/22/04 15:40:41:895 PDT] 7dc141 Helpers W NMSV0610I: 
A NamingException is being thrown from 
a javax.naming.Context implementation. Details follow:
Context implementation: com.ibm.ws.naming.jndicos.CNContextImpl
Context method: rebind
Context name: DEVNetwork/nodes/DEV/servers/nodeagent
Target name: server2-2809-NotificationImpl
Other data: Object to bind: com.inc.businessapp.system.NotificationImpl@15a15f
Exception stack trace: javax.naming.NoPermissionException:
 NO_PERMISSION exception caught. 
Root exception is org.omg.CORBA.NO_PERMISSION: 
Trace from server: 298002686 at host 192.168.2.159 >>
org.omg.CORBA.NO_PERMISSION: not authorized to perform rebind_corba_object
 operation. 
minor code: 0 completed: No
at com.ibm.ws.naming.cosbase.WsnOptimizedNamingImplBase.performAuthorizationCheck
(WsnOptimizedNamingImplBase.java:2716)
at com.ibm.ws.naming.cosbase.WsnOptimizedNamingImplBase.rebind_corba_object
(WsnOptimizedNamingImplBase.java:914)
at com.ibm.WsnOptimizedNaming._NamingContextImplBase._invoke(Unknown Source)
at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:615)
at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:468)
at com.ibm.rmi.iiop.ORB.process(ORB.java:396)
at com.ibm.CORBA.iiop.ORB.process(ORB.java:1608)
at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2164)
at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:63)
at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)
<< END server: 298002686 at host 192.168.2.159
minor code: 0 completed: No
at java.lang.reflect.Constructor.newInstance(Native Method)
at com.ibm.rmi.iiop.ReplyMessage._getSystemException(ReplyMessage.java:228)
at com.ibm.rmi.iiop.ReplyMessage.getSystemException(ReplyMessage.java:177)
at com.ibm.rmi.iiop.ClientResponseImpl.getSystemException(ClientResponseImpl.java:142)
at com.ibm.rmi.corba.ClientDelegate.intercept(ClientDelegate.java:906)
at com.ibm.rmi.corba.ClientDelegate.invoke(ClientDelegate.java:430)
at com.ibm.rmi.corba.ClientDelegate.invoke(ClientDelegate.java:703)
at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:454)
at com.ibm.WsnOptimizedNaming._NamingContextStub.rebind_corba_object(Unknown Source)
at com.ibm.ws.naming.jndicos.CNContextImpl.cosRebindCorbaObject(CNContextImpl
 .java:3332)
at com.ibm.ws.naming.jndicos.CNContextImpl.doRebind(CNContextImpl.java:2052)
at com.ibm.ws.naming.jndicos.CNContextImpl.rebind(CNContextImpl.java:636)
at com.ibm.ws.naming.util.WsnInitCtx.rebind(WsnInitCtx.java:184)
at javax.naming.InitialContext.rebind(InitialContext.java:361)
at com.ibm.ws.naming.util.CorbaURLContext.rebind(CorbaURLContext.java:245)
at javax.naming.InitialContext.rebind(InitialContext.java:361)
at com.inc.businessapp.system.NotificationImpl.(NotificationImpl.java:127)

答: 您假设 WebSphere Application Server 使用 InitialContext 创建中指定的认证数据来进行认证。这并不是真正情况。WebSphere Application Server 安全是基于健壮的模型,在执行远程调用时,安全上下文信息承载在当前的线程中,并且通过 IIOP 来发送。如果要作为一个认证的用户来访问 JNDI,您必须在创建 InitialContext 之前通过您自己的代码来在 WebSphere Application Server 中进行认证。在您的示例中并不是很清楚,我假定您使用 Java™ 客户端。您需要参考 WebSphere Application Server Information Center, 配置 Java Authentication 和 Authorization Service 登录 部分。

问: 我们正在试图做一个 Client Certificate Authentication,但是至今没有任何输出。我们已经配置用户注册表为 Local OS。我翻阅了从 IBM Redbook 站点获取的 WebSphere 安全文档,但是它讨论了 LDAP 设置而并不是 Local OS。您能提供一个一步步的指导吗?

答: 您并没有为我提供足够的细节,使我能确切理解您的问题。我只能说明下面这些:

  1. 当在基于 Web 的认证使用 Local OS 注册表时,并不支持客户端证书。参考 WebSphere Application Server Information Center, 本地操作系统用户注册表部分。 这里有一段摘录: “当使用本地操作系统用户注册表的时候,目前并不支持 Web 客户端证书认证。然而,Java 客户端证书认证对于本地操作系统用户注册表确实起作用。Java 客户端证书认证将证书域中的第一个属性映射到用户注册表中的用户 ID。”
  2. 同文档暗示的一样,在使用 LocalOS 注册表的时候,并没有与证书认证相关的可配置的注册表特性。对于 LDAP(或者自定义的),有更大的灵活性。

如果您希望使用客户端证书认证,我推荐您 不要使用 Local OS 注册表。

问: 我们使用 W2K 和 Web 下面的 MQ WorkFlow v3.5。我们想要使用 Workflow API 访问 staff/Person 属性,或者开始一个进程实例,但是并不 logon()。这种方式我们不必在 JSP 中提供 User 和 Password。

答: 您的问题非常不清楚,并且和 WebSphere Application Server 没什么关系,但是下面这个答案可能与您的问题有些关系。我认为您想要做的是设立一个启动用户。这允许一个非 Workflow 用户开启一个 Workflow 进程而不用明确的登录到 Workflow 中(但是该用户不会被指派任何工作条目)。这在 WebCredit 例子中使用过(SupportPac WA82)。

  1. 编辑 /WebClient/WEB-INF/WebClient.properties 文件。
  2. 指定 StarterUserID、StarterPassword、StarterSystemGroup 和 StarterSystem。
  3. 重新启动 Web 客户端。

确保在 Workflow 中没有员工编写的 API。

问: (Solaris WAS 5.1.05 Network Deployer Custom User Registry) 我依照安装步骤直到“t”,使用这个名字, com.ibm.websphere.security.FileRegistrySample,仍然出现了“No Group was found in User Registry Repository”的错误,我需要编译这个文件吗?

# users.props
#
# Format:
# name:passwd:uid:gids:display name
# where name   = userId/userName of the user
#       passwd = password of the user
#       uid    = uniqueId of the user
#       gid    = groupIds of the groups that the user belongs to
#       display name = a (optional) display name for the user.
wasadmin:wa:123:500:WAS_Admin_user
wasadmin1:wa_1:124:500:WAS_Admin_user1
wasoperator:wo:125:600:WAS_Operator_user
wasoperator1:wo1:126:600:WAS_Operator_user1
wasconfig:wc:127:700:WAS_Configurator_user
wasconfig1:wc1:128:700:WAS_Configurator_user1
wasmonitor:wm:129:800:WAS_Monitor_use
wasmonitor1:wm1:130:800:WAS_Monitor_user1
# groups.props
#
# Format:
# name:gid:users:display name
# where name   = groupId of the group
#       gid    = uniqueId of the group
#       users  = list of all the userIds that the group contains
#       display name = a (optional) display name for the group.
wasadmins_group:500:wasadmin,wasadmin1:WAS_Administrative_group
wasoperators_group:600:wasoperator,wasoperator1:WAS_Operators_group
wasconfigurators_group:700:wasconfig,wasconfig1:WAS_Configurator_group
wasmonitors_group:800:wasmonitor,wasmonitor1:WAS_Monitor_group

答: 不用,用户文件并不需要编译。FileRegistry 已经被许多客户成功地使用,因此这里可能有一些配置错误。没有其它的细节,我不能提供答案。我建议您搜集 WebSphere Application Server 追踪并且联系 IBM 技术支持。

致谢

作者希望感谢下面这些 ISSW 顾问的帮助和为本文作的准备:

  • Saravana R. Chandran
  • Harold L. Creel
  • Paul Ilechko
  • Bruce Nuechterlein
  • Irina Singh
  • John Wang

参考资料

关于专家访谈

专家访谈 WSDD 上的一个很有特色的每月专栏。我们可以让您接触到有关 IBM WebSphere 的最好的思想、随时准备回答您问题的产品专家和执行人员。您来提出问题,我们将公布对最普遍问题的解答。


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=56008
ArticleTitle=专家访谈: Keys Botzum 谈 WebSphere 安全性
publish-date=12012004