如何从 Liferay 门户外部将敏感数据发送到 Liferay portlet

How to send sensitive data to a Liferay portlet from outside the Liferay portal

我有一个带有一些 Portlet 的 Liferay Portal (6.2 CE)(比如说 Portlet A 和 Portlet B)

我将从门户外部(来自互联网的第三方)调用一些参数 (http://myUrl/myPath?param=X&email=myUser@email.address&info=moreUserPersonalData),并且根据其中一个参数的值,我需要显示一个或另一个组件。下例中,如果param=A,则使用Portlet A进入门户页面;如果 param=B,则使用 Portlet B 转到门户页面。

一些参数将是敏感数据,我需要它们到达最终的 portlet A 或 B。

所以,我有不同的疑惑...

无论在哪里,我都可以决定它的技术。我已经成功:

所以,总而言之,我需要:

你能给我什么建议吗?

提前致谢。

创建一个使用 SSL/TLS 安全加密的网站。

Liferay 中的安全 IPC

在您阐明您的要求和功能规范之前,这主要是一个占位符。我将介绍一些与 Liferay 平台和相关技术相关的安全要点。我会尽可能笼统地提出建议,但完全公开我的大部分经验是 6.2 EE。

建议的解决方案

我认为最明显的方法是向门户外部的客户端公开一个或多个 Web 服务。我建议您不要尝试将所有数据接受到单个 Web 服务中,然后相应地进行路由。相反,我建议您为每个特定端点(无论您将数据路由到哪里)创建一个 Web 服务并直接调用该端点。您的客户端应配置为将数据发送到适当的位置。但是,如果出于某种原因您绝对需要有一个端点来调用,那么我建议您通过 jsonws 通过 service builder[ 注册一个端点来创建该端点=131=] 然后使用 Liferays 内部 Spring AMQP 总线 相应地路由消息。

要注册 JSON WS,只需创建一个服务构建器条目,如下所示:

<entity name="Entity" remote-service="true" local-service="true">

在将创建以下可修改文件的 JSR-286 Portlet 中

  • EntityLocalServiceImpl.java
  • EntityServiceImpl.java
  • EntityImp.java

您的 EntityServiceImpl 文件将在 EntityService 中生成代码(这将是您从外部调用的服务)。我通常建议在 EntityServiceImpl 中编写与 Liferay 的权限检查/资源框架有关的代码,一旦成功,您就可以在 EntityLocalServiceImpl 方法中调用同名方法。单独的本地服务方法应该是您写入消息 queue 或数据库的地方。

要调用您的 Web 服务,您可以参考与 JSONWS 相关的数百万个 Liferay 在线文档。这只是一个简短的架构概述,但我在下面有整个堆栈的一般强化步骤。

Liferya 技术堆栈强化

让我们谈谈您目前是如何配置门户的。我将假设您 运行 在 Apache Web 服务器后面安装一个或多个 Tomcat 应用程序容器。但是,如果您没有 运行 宁这些特定技术,我给出的建议是可以互换的。

1。门户版本

确保您至少 运行在 6.2 或 DXP 上安装企业版。验证您的门户是否处于该发布分支的最新批处理级别。我建议您更进一步,确保您也拥有每个修补程序(您可以使用最高修补程序版本,但仍然缺少修补程序)。

2。门户安装和 OS

我建议您通过执行以下操作来加强 Tomcat 服务器/门户安装。

  • 在 chroot 监狱中安装。
  • 所有者和组应该是非根用户
  • 运行 你的 Tomcat 实例与 Java 安全管理器,开发一个 java 策略文件特定于那个 Tomcat 实例的需要。
  • 在 Tomcat 层启用、正确配置并执行 SSL
  • 覆盖所有默认错误页面(404 等)。创建一个新页面以显示 returns java.lang.Exception
  • 的任何页面
  • 保护您的关闭端口
  • 确保 tomcat 在欢迎页面不特定时不提供索引页面。
  • 将 portal_home/conf 文件夹的权限位更改为 400/只读。
  • 删除 HTTP 响应中的服务器版本 headers
  • 剥离并重新包装 ServerInfo.properties 到 catalina 罐子中。
  • 为 cookie 设置安全标志
  • 为 cookie 添加 HTTPOnly
  • 确保您有 iptables 或其他防火墙,可以关闭所有来自外部的端口。仅从内部使用 SSH。仅从外部启用端口 80(如果它面向 public)并丢弃其余端口。
  • 停用 JSP 部署引擎

3。 Web 服务器层

Web 服务器层将具有类似于您的 Tomcat 实例的一般安全措施。 运行 在 chroot 监狱中或使用非特权帐户的 Web 服务器可能要困难得多。在您的 Web 服务器(或负载平衡器,如果存在的话)前面有一个真正的企业 IPS 会很好。

  • 启用并正确配置 SSL(为了获得最佳安全性,请在应用程序容器和 Web 服务器层执行此操作)。禁用 ssl v2、v3 等。这个主题对于单个要点来说太大了
  • 通过 removing/disabling ETag、目录列表页面、服务器名称响应删除信息收集能力 headers、
  • 运行 来自具有 apache 组(或您选择的任何帐户)的 apache 用户的 Web 服务器。您可以尝试将其设为非特权帐户但同样可能很难。
  • 将配置文件夹的权限位更改为 750
  • 在此处限制您希望允许的请求方法类型(您可以在此处禁用请求方法,如 put、post 等)。你做什么显然会决定你如何配置这个
  • 禁用 http 1.0
  • 禁用跟踪请求
  • 在此层也为 cookie 设置 httponly 和安全标志
  • 启用针对点击劫持、xss 等的保护

4。 Liferay 属性强化

您可以切换几个属性来强化您的 Liferay 平台。一些非常明显的(及其描述):

始终启用以下两个

auth.token.check.enabled=true
json.service.auth.token.enabled=true

这与您将在门户中看到的 p_auth get 参数有关。客户端负责生成此令牌。如果您的客户端在门户环境之外。

如果您的客户端在门户环境之外,您可以忽略特定来源的令牌

auth.token.ignore.origins=.....

基本上,这将允许您忽略特定来源的身份验证令牌要求。这比忽视所有人要好得多。

我肯定会建议您强制使用 HSTS 并再次根据请求方法进行过滤

jsonws.web.service.strict.http.method=true
jsonws.web.service.invalid.http.methods=DELETE,POST,PUT
# Not necessarily filtering the above methods just an example

为了保护网络服务,我可能需要基本身份验证

basic.auth.password.required=true

使用基本身份验证,您还需要创建特定的 Web 服务端点 public

jsonws.web.service.public.methods=.....

那么此时您需要在 tomcat/web 服务器上配置基本身份验证和用户帐户。

我会使用

进一步限制对 jsonws 页面、servlet 和服务的访问
son.servlet.hosts.allowed=....
json.servlet.https.required=true
jsonws.servlet.hosts.allowed=....
jsonws.servlet.https.required=true

您可能还想查看 AccessControlled 注释

要正确完成基本身份验证,您需要查看 authentication pipeline examples.

4。额外的 Liferay 硬化

除了保护网络服务之外,我可能会通过以下方式保护您的门户:

  • 使用default.admin.*属性禁用默认管理员帐户,
  • 阻止以下页面
    • /c/
    • /api/
    • /usr/
    • /组/
  • 通过基于 p_p_id
  • 的过滤禁用所有默认 portlet
  • 认真考虑限制 WebDAV Servlet、Spring Remoting Servlet、Liferay Tunneling servlet、Axis Servlet。
  • 禁用 unwanted/unused struts 操作
  • 使用JDBC
  • 的JNDI

我意识到这基本上只是一大堆信息,没有太多上下文,但是当广泛谈论安全性时,它都是适用的。我什至没有接触数据层,因为你没有提到持久性。当您进行初步研究、尝试实施解决方案并 运行 解决一个非常特殊的问题时,Whosebug 会更有帮助。希望这会让你在正确的方向上提出一个更尖锐的问题