跨越平台与网络边界:Coherence 安全与 .NET 客户端配置
1. Coherence 集群安全与网络过滤基础
1.1 集群访问安全与数据加密需求
在确保对 Coherence 集群的访问安全时,我们已采取措施,仅允许在
auth-hosts
缓存中明确注册的主机访问集群。然而,这只是完整安全解决方案的一部分。虽然未经授权的主机无法连接到集群,但他们仍可能窃听授权客户端与代理服务器之间的网络流量,获取不应看到的数据,甚至冒充授权主机直接访问集群。为防止此类情况发生,我们需要对客户端与代理服务器之间的流量进行加密。
1.2 网络过滤器概述
网络过滤器是 Coherence 的一项特性,可用于 TCMP 和 Coherence*Extend,在后者的场景中更为适用。它用于在客户端与代理服务器之间交换的消息通过网络传输之前修改其内容。常见的应用场景包括加密和压缩。
1.2.1 加密
加密可以基于密码或私钥,能有效解决上述安全问题,让网络嗅探变得困难。不过截至 Coherence 3.5,加密仅支持 Java 客户端,.NET 和 C++ 的 Coherence*Extend 客户端暂不支持。但好在 Coherence 具备可插拔网络过滤器的基础设施,我们可以自行实现加密过滤器。
1.2.2 压缩
压缩可减少网络流量,但在集群内部,由于节点间网络带宽通常充足,压缩可能只会增加 CPU 负载而无实际益处。不过在低带宽、高延迟的广域网连接中,压缩能显著提升性能,适用于远程 Coherence*Extend 客户端或跨广域网的集群间通信。
1.3 内置网络过滤器配置
所有内置网络过滤器都在 Coherence 部署描述符
tangosol - coherence.xml
的
cluster - config/filters
部分进行配置。每个过滤器都有唯一名称,在配置 Coherence*Extend 客户端和代理服务器使用这些过滤器时需要引用该名称。每个过滤器还可以有一个或多个配置参数,在每个过滤器元素的
init - params
配置部分定义。
1.3.1 压缩过滤器配置示例
<filter id="1">
<filter-name>gzip</filter-name>
<filter-class>
com.tangosol.net.CompressionFilter
</filter-class>
<init-params>
<init-param id="1">
<param-name>strategy</param-name>
<param-value>gzip</param-value>
</init-param>
<init-param id="2">
<param-name>level</param-name>
<param-value>default</param-value>
</init-param>
</init-params>
</filter>
当创建网络过滤器实例时,Coherence 会将为过滤器定义的参数转换为 XML 元素,并传递给过滤器的
setConfig
方法。对于上述压缩过滤器,传递的 XML 如下:
<config>
<strategy>gzip</strategy>
<level>default</level>
</config>
1.3.2 对称加密过滤器配置示例
<filter id="2">
<filter-name>symmetric-encryption</filter-name>
<filter-class>
com.tangosol.net.security.PasswordBasedEncryptionFilter
</filter-class>
<init-params>
<init-param id="1">
<param-name>password</param-name>
<param-value system-property="tangosol.coherence.security.password">
</param-value>
</init-param>
</init-params>
</filter>
在这个例子中,默认密码为空字符串,通常需要在启动 Coherence 节点时使用系统属性
tangosol.coherence.security.password
指定密码。
1.4 内置过滤器详细介绍
1.4.1 压缩过滤器
配置 Coherence*Extend 代理服务器使用压缩过滤器时,需要在代理方案的
acceptor - config
元素中添加
use - filters
配置部分,并指定过滤器名称:
<proxy-scheme>
<scheme-name>extend-proxy</scheme-name>
<service-name>ExtendTcpProxyService</service-name>
<acceptor-config>
<tcp-acceptor>
...
</tcp-acceptor>
<use-filters>
<filter-name>gzip</filter-name>
</use-filters>
</acceptor-config>
</proxy-scheme>
在客户端,需要在远程缓存方案和远程调用方案的
initiator - config
部分添加
use - filters
元素。需要注意的是,网络过滤器是一个“全有或全无”的特性,所有客户端和代理服务器的配置必须完全相同,包括
use - filters
部分中过滤器的顺序,否则通信将无法正常工作。对于 .NET 客户端和代理服务器之间的压缩,建议使用默认的
gzip
策略,因为这是当前 .NET Coherence 客户端版本唯一支持的策略。
1.4.2 对称加密过滤器
在默认的 Coherence 部署描述符中,有两种加密过滤器实现:
PasswordBasedEncryptionFilter
和
ClusterEncryptionFilter
。由于
ClusterEncryptionFilter
配置复杂且当前不支持 Coherence
Extend 客户端,我们主要关注
PasswordBasedEncryptionFilter
。配置 Coherence
Extend 客户端和代理服务器使用加密的方式与配置压缩过滤器类似,在客户端的
initiator - config
和服务器的
acceptor - config
的
use - filters
部分引用
symmetric - encryption
过滤器:
<use-filters>
<filter-name>symmetric-encryption</filter-name>
</use-filters>
Java 加密过滤器基于 Java 密码学扩展(JCE),可以使用 JDK 自带的标准密码服务提供商,也可以插入第三方提供商,如 Bouncy Castle。加密算法可配置,Bouncy Castle 支持几乎所有常见的加密算法。
1.5 密码加密基础概念
基于密码的加密中,指定的密码并非直接用于加密数据,而是作为生成密钥的起点。生成密钥还需要盐(salt)、加密算法以及迭代次数等参数。即使攻击者获取了密码,如果不知道这些额外参数,也无法确定用于解密数据的密钥。Coherence 为盐、算法和迭代次数提供了默认值,但可以在过滤器定义中添加相应参数并指定值来覆盖默认值。不过要确保客户端和服务器的过滤器配置完全相同,否则密钥不匹配,通信将失败。
1.6 自定义网络过滤器实现
1.6.1 Java 自定义网络过滤器
在 Java 中创建自定义网络过滤器,需要创建一个实现
com.tangosol.io.WrapperStreamFactory
接口的类:
public interface WrapperStreamFactory {
InputStream getInputStream(InputStream stream);
OutputStream getOutputStream(OutputStream stream);
}
每个方法应返回一个新的流,该流包装指定的输入或输出流并添加必要的行为。例如,实现压缩可以通过分别用
java.util.zip.GZIPInputStream
和
java.util.zip.GZIPOutputStream
包装原始输入和输出流。
1.6.2 .NET 自定义网络过滤器
在 .NET 中实现自定义网络过滤器类似,类需要实现
Tangosol.IO.IWrapperStreamFactory
接口:
public interface IWrapperStreamFactory
{
Stream GetInputStream(Stream stream);
Stream GetOutputStream(Stream stream);
}
借助 .NET 版的 Bouncy Castle 加密库提供的
Org.BouncCastle.Crypto.IO.CryptoStream
类,我们可以创建一个包装器来实现自定义加密过滤器:
public class PasswordBasedEncryptionFilter
: IWrapperStreamFactory, IXmlConfigurable
{
private char[] m_password;
private byte[] m_salt;
private int m_iterationCount;
private String m_algorithm;
public PasswordBasedEncryptionFilter()
{}
public Stream GetInputStream(Stream stream)
{
return new CipherInputStream(stream, GetCipher(false));
}
public Stream GetOutputStream(Stream stream){
return new CipherOutputStream(stream, GetCipher(true));
}
...
}
其中,
CipherInputStream
和
CipherOutputStream
是对
CryptoStream
类的简单包装,用于简化配置和处理一些实现
IWrapperStreamFactory
所需的细节。
GetCipher
方法负责创建用于加密或解密的块密码,具体实现细节可参考相关示例代码。
以下是配置流程的 mermaid 流程图:
graph LR
A[开始] --> B[选择过滤器类型]
B --> C{加密或压缩}
C -- 加密 --> D[配置对称加密过滤器]
C -- 压缩 --> E[配置压缩过滤器]
D --> F[客户端和服务器配置一致]
E --> F
F --> G[完成配置]
2. .NET 客户端配置
2.1 .NET 客户端配置问题与解决方案
在实现 .NET 中的 Coherence 客户端时,一个常见问题是如何配置应用程序,让其知道使用哪些操作、缓存和 POF 配置文件。与 Java 不同,.NET 没有类路径和系统属性,因此需要采用不同的方法。.NET 客户端配置有多种方法,具体选择取决于应用程序的类型:
-
桌面或 ASP.NET 应用程序
:可以将具有知名名称的文件放在应用程序目录中,或在应用程序配置文件中明确指定。
-
Microsoft Excel 插件
:使用程序集嵌入资源和编程式配置更为合适。
2.2 Coherence 配置文件在 .NET 与 Java 中的差异
2.2.1 验证方式
Java 配置文件使用 DTD 进行验证,而 .NET 配置文件使用 XML Schema。这是因为 Microsoft Visual Studio 作为最常用的 .NET IDE,仅能为基于 XML Schema 的 XML 文件提供智能感知(IntelliSense)。
2.2.2 配置选项
.NET 中的配置选项相对 Java 较少。例如,在 Java 缓存配置文件中有多种缓存方案,而 .NET 中只能配置本地、近程和远程方案,这是因为 .NET 应用程序始终是 Coherence*Extend 客户端,并非集群的完整成员。
2.3 启用 Visual Studio IntelliSense
如果使用 Oracle 提供的安装程序安装了 .NET 版的 Coherence,支持 IntelliSense 的 XML Schema 文件应已自动复制到相应的 Visual Studio 目录。若 IntelliSense 无法正常工作,可以手动将
config
目录下的三个架构文件(
coherence.xsd
、
cache - config.xsd
和
coherence - pof - config.xsd
)复制到 Visual Studio 安装目录的
Xml/Schemas
子目录。
2.4 .NET 中的操作描述符
.NET 操作描述符是 Java 操作描述符的简化版本。由于大多数操作设置与集群相关,不适用于 .NET 客户端,因此在 .NET 操作描述符中,可配置的内容主要包括日志记录器、默认缓存工厂和网络过滤器。
2.4.1 日志记录器配置
具体配置方法可参考 Coherence 用户指南,有多种选项可供选择,包括使用常见的开源日志框架,如 Log4Net、NLog 或 Microsoft 企业库中的日志应用程序块,通过 Common.Logging 抽象库实现。
2.4.2 自定义缓存工厂
可以在
configurable - cache - factory - config
元素中指定自定义的可配置缓存工厂实现,但这是一个较为高级的功能,通常很少使用。
2.4.3 网络过滤器配置
以注册之前创建的
PasswordBasedEncryptionFilter
为例,配置如下:
<coherence xmlns="http://schemas.tangosol.com/coherence">
<cluster-config>
<filters>
<filter>
<filter-name>symmetric-encryption</filter-name>
<filter-class>
PasswordBasedEncryptionFilter, Coherence.Encryption
</filter-class>
<init-params>
<init-param id="1">
<param-name>password</param-name>
<param-value>my!paSSwoRD</param-value>
</init-param>
</init-params>
</filter>
</filters>
</cluster-config>
<logging-config>
...
</logging-config>
</coherence>
以下是 .NET 客户端配置步骤的表格:
| 配置项 | 操作步骤 |
| ---- | ---- |
| 选择配置方式 | 根据应用类型选择合适的配置方式,如桌面应用可放文件到目录或在配置文件指定,Excel 插件用嵌入资源和编程式配置 |
| 处理配置文件差异 | 了解 .NET 用 XML Schema 验证,配置选项少的特点 |
| 启用 IntelliSense | 若需要,手动复制 XML Schema 文件到 Visual Studio 目录 |
| 配置操作描述符 | 配置日志记录器、缓存工厂和网络过滤器 |
以下是 .NET 客户端配置流程的 mermaid 流程图:
graph LR
A[开始配置 .NET 客户端] --> B[选择配置方式]
B --> C[处理配置文件差异]
C --> D[启用 IntelliSense(若需要)]
D --> E[配置操作描述符]
E --> F[完成配置]
通过以上步骤,我们可以实现 Coherence 集群的安全访问和 .NET 客户端的正确配置,确保数据在传输过程中的安全性和应用程序的正常运行。
3. 总结与注意事项
3.1 关键要点总结
在前面的内容中,我们围绕 Coherence 集群安全和 .NET 客户端配置展开了详细讨论,以下是关键要点的总结:
| 主题 | 要点 |
|---|---|
| Coherence 集群安全 |
- 通过限制
auth - hosts
缓存中的主机访问集群,初步保障访问安全
- 为防止数据被窃听和主机被冒充,需对客户端与代理服务器间的流量进行加密 - 网络过滤器可用于修改客户端与代理服务器间消息内容,常见应用为加密和压缩 |
| 内置网络过滤器 |
- 所有内置网络过滤器在
tangosol - coherence.xml
的
cluster - config/filters
部分配置,有唯一名称和可配置参数
- 压缩过滤器可在低带宽、高延迟的广域网连接中提升性能,.NET 客户端建议用
gzip
策略
- 对称加密过滤器基于 Java 密码学扩展(JCE),可使用标准或第三方提供商,如 Bouncy Castle |
| 自定义网络过滤器 |
- Java 需实现
com.tangosol.io.WrapperStreamFactory
接口
- .NET 需实现
Tangosol.IO.IWrapperStreamFactory
接口,可借助 Bouncy Castle 加密库实现自定义加密过滤器
|
| .NET 客户端配置 |
- 因 .NET 无类路径和系统属性,配置方法因应用类型而异,如桌面应用和 Excel 插件配置方式不同
- .NET 配置文件用 XML Schema 验证,配置选项较 Java 少 - 可在 .NET 操作描述符中配置日志记录器、默认缓存工厂和网络过滤器 |
3.2 注意事项
- 网络过滤器配置一致性 :网络过滤器是“全有或全无”的特性,客户端和代理服务器的配置必须完全相同,包括过滤器顺序,否则通信将失败。
- 加密参数一致性 :在使用对称加密过滤器时,客户端和服务器的盐、算法和迭代次数等参数必须一致,以确保密钥匹配。
- .NET 客户端配置选择 :根据应用类型选择合适的配置方法,确保配置的有效性和适用性。
3.3 未来展望
随着技术的不断发展,Coherence 的功能和性能可能会进一步提升。例如,未来可能会支持更多平台的加密功能,简化配置过程,提高用户体验。同时,对于网络过滤器的优化和扩展也值得期待,以满足不同场景下的安全和性能需求。
以下是整个配置过程的 mermaid 流程图:
graph LR
A[开始] --> B[保障 Coherence 集群访问安全]
B --> C[选择网络过滤器类型]
C --> D{加密或压缩}
D -- 加密 --> E[配置对称加密过滤器]
D -- 压缩 --> F[配置压缩过滤器]
E --> G[客户端和服务器配置一致]
F --> G
G --> H[完成集群安全配置]
A --> I[配置 .NET 客户端]
I --> J[选择配置方式]
J --> K[处理配置文件差异]
K --> L[启用 IntelliSense(若需要)]
L --> M[配置操作描述符]
M --> N[完成 .NET 客户端配置]
H --> O[确保数据安全传输]
N --> O
O --> P[应用正常运行]
4. 常见问题解答
4.1 网络过滤器相关问题
-
问
:如果客户端和代理服务器的网络过滤器配置不一致会怎样?
答 :网络过滤器是“全有或全无”的特性,若配置不一致,包括过滤器顺序不同,客户端和代理服务器之间的通信将无法正常工作。 -
问
:.NET 客户端和代理服务器之间的压缩只能用
gzip策略吗?
答 :在当前 .NET Coherence 客户端版本中,gzip是唯一支持的压缩策略,因此建议使用该默认值。
4.2 加密相关问题
-
问
:基于密码的加密中,密码是直接用于加密数据吗?
答 :不是,指定的密码仅作为生成密钥的起点,还需要盐、加密算法和迭代次数等参数来生成密钥,确保即使密码被获取,攻击者也无法轻易解密数据。 -
问
:Java 加密过滤器可以使用哪些密码服务提供商?
答 :Java 加密过滤器基于 Java 密码学扩展(JCE),可以使用 JDK 自带的标准密码服务提供商,也可以插入第三方提供商,如 Bouncy Castle。
4.3 .NET 客户端配置相关问题
-
问
:.NET 客户端配置和 Java 有什么主要区别?
答 :主要区别在于验证方式和配置选项。Java 配置文件使用 DTD 验证,.NET 使用 XML Schema;且 .NET 配置选项相对较少,因为 .NET 应用程序始终是 Coherence*Extend 客户端,并非集群的完整成员。 -
问
:如果在 Visual Studio 中编辑 Coherence 配置文件时 IntelliSense 不工作怎么办?
答 :可以手动将config目录下的三个架构文件(coherence.xsd、cache - config.xsd和coherence - pof - config.xsd)复制到 Visual Studio 安装目录的Xml/Schemas子目录。
4.4 操作描述符配置相关问题
-
问
:.NET 操作描述符中可以配置哪些内容?
答 :可以配置日志记录器、默认缓存工厂和网络过滤器。其中,日志记录器可参考 Coherence 用户指南进行多种配置;自定义缓存工厂是较高级的功能,通常较少使用;网络过滤器可按示例进行配置,如注册自定义的加密过滤器。
通过对这些常见问题的解答,希望能帮助大家更好地理解和应用 Coherence 集群安全和 .NET 客户端配置的相关知识,在实际操作中避免常见的错误和问题,确保系统的稳定运行和数据安全。
综上所述,通过深入了解 Coherence 集群安全和 .NET 客户端配置的方法和技巧,我们能够有效地保障数据在传输过程中的安全性,提高应用程序的性能和稳定性。在实际应用中,需要根据具体的场景和需求,灵活选择合适的配置方式和安全策略,以实现最佳的效果。
超级会员免费看
10万+

被折叠的 条评论
为什么被折叠?



