如何从 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。
所以,我有不同的疑惑...
无论在哪里,我都可以决定它的技术。我已经成功:
- 一个小服务程序。主要问题是我不能在 Servlet 和 Portlet 之间共享会话,所以我不能在那里设置参数。我不想通过 GET 发送它(它是个人信息)并且任何避免这种情况的方法(例如加密数据或临时保存在数据库中)对于这样一个简单的任务来说看起来都太复杂了。
- 登陆 portlet。我需要在不需要用户操作的情况下进行重定向,因此 portlet 的生命周期对我没有帮助。渲染阶段(当我到达那里时调用的那个)没有重定向方法(看起来它违背了 liferay 的 portlet 策略)并且我不想进行 javascript 自动提交以到达操作阶段。
所以,总而言之,我需要:
- 被第三方呼叫
- 管理该第三方发送的部分数据
- 重定向到 portlet,发送在 url
处看不到的敏感数据
- 确定更好的技术来做到这一点
你能给我什么建议吗?
提前致谢。
创建一个使用 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 会更有帮助。希望这会让你在正确的方向上提出一个更尖锐的问题
我有一个带有一些 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。
所以,我有不同的疑惑...
无论在哪里,我都可以决定它的技术。我已经成功:
- 一个小服务程序。主要问题是我不能在 Servlet 和 Portlet 之间共享会话,所以我不能在那里设置参数。我不想通过 GET 发送它(它是个人信息)并且任何避免这种情况的方法(例如加密数据或临时保存在数据库中)对于这样一个简单的任务来说看起来都太复杂了。
- 登陆 portlet。我需要在不需要用户操作的情况下进行重定向,因此 portlet 的生命周期对我没有帮助。渲染阶段(当我到达那里时调用的那个)没有重定向方法(看起来它违背了 liferay 的 portlet 策略)并且我不想进行 javascript 自动提交以到达操作阶段。
所以,总而言之,我需要:
- 被第三方呼叫
- 管理该第三方发送的部分数据
- 重定向到 portlet,发送在 url 处看不到的敏感数据
- 确定更好的技术来做到这一点
你能给我什么建议吗?
提前致谢。
创建一个使用 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 会更有帮助。希望这会让你在正确的方向上提出一个更尖锐的问题