【问题标题】:Preventing unauthorized member for joining Hazelcast cluster防止未经授权的成员加入 Hazelcast 集群
【发布时间】:2019-05-20 04:03:42
【问题描述】:

我们正在更改我们的一个应用程序以使用 Hazelcast 3.11 社区版,并在几个主机上运行的多个 JVM 之间进行一些锁定。 我们按照如下语法配置我们的集群:

public class HazelcastBuilder {
    private final String name;
    private final String password;
    private final String members;
    private final String hostName;
    private final String applicationName;

    public HazelcastInstance getHazelcastInstance() {
        Config hazelcastConfig = new Config();
        GroupConfig groupConfig = new GroupConfig(name, password);
        hazelcastConfig.setGroupConfig(groupConfig);

        TcpIpConfig tcpIpConfig = new TcpIpConfig();
        tcpIpConfig.setEnabled(true);
        for (String member : members.split(",")) {
            tcpIpConfig.addMember(member.trim());
        }

        hazelcastConfig.getNetworkConfig().getJoin().setTcpIpConfig(tcpIpConfig);
        // By default the multicast config is enabled. Disable it here.
        hazelcastConfig.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
        String instanceName = applicationName + "-" + hostName;
        hazelcastConfig.setInstanceName(instanceName);

        logger.info("Creating hazelcast instance: " + instanceName);
        return Hazelcast.getOrCreateHazelcastInstance(hazelcastConfig);
    }
}

一切正常,集群被正确创建并按预期工作。

但是,我创建了一个单元测试并配置了一个与应用程序同名的本地集群,然后我将我的开发人员机器添加到其中。一切正常,我的本地主机毫无问题地加入了应用程序集群。

在生产环境中当然不能接受这样的事情,这是我的问题:

鉴于我们有一个可以运行我们的应用程序的主机名列表,防止未经授权的成员加入给定 hazelcast 集群的最佳方法是什么。

提前感谢您的帮助。

【问题讨论】:

    标签: java hazelcast


    【解决方案1】:

    如果您正在搜索安全功能,那么您应该使用 Hazelcast 企业版。检查功能列表:

    如果你只需要阻止任意机器连接到你的集群,那么开源版有几个选项:

    • 为每个集群使用唯一的组名;
    • 作为额外的保护级别,您可以在配置中定义验证令牌 - 只需设置 hazelcast.application.validation.token Hazelcast 属性(或系统属性) - 查看 reference manual 了解详细信息
    • 指定应使用哪些网络接口 (doc) 并通过将 hazelcast.socket.bind.any 属性设置为 false 来禁用与所有本地接口的绑定。通常,您的生产集群在受信任的 LAN 环境中运行,因此您希望使其只能在该 LAN 内访问。
    • 多播发现机制 (doc) 还添加了 <trusted-interfaces> 配置,可以帮助您。您正在使用 TCP 发现,因此它对您的方案无效。

    最后说明:Hazelcast 开源版中没有勾选组密码字段!

    【讨论】:

    • 我最终使用了hazelcast.application.validation.token=node1,node2,node3,其中 node1、node2 和 node3 是运行我的应用程序的主机的名称。当另一个节点尝试加入集群时,它就像一个魅力,甚至在日志中收到警告:
    • @Julian,您介意分享一下您是如何做到的吗?您是以声明方式还是以编程方式进行的。你添加了不同的密码,还是“node1,node2,node3”是一个密码?如果它们是不同的密码,您是否管理调用每个节点的主机名以便在 hazelcast 中进行身份验证?
    • 我在语法上这样做了,但是集群中的节点名称是从属性文件中加载的。请注意,这只有在黑客不知道主机名的情况下才能正常工作。如果黑客知道他们并且有权访问这些主机所属的网络,那么我的解决方案将不起作用。
    • validation.token 不应用于 IMO。如果尝试使用虚假令牌,这就是我得到的。它也打印正确的。 Node could not join cluster. A Configuration mismatch was detected: Incompatible 'hazelcast.application.validation.token'! expected: U8fHwYS2mG, found: U8fHwYS2mG123 Node is going to shutdown now! 我认为它的唯一目的是保持配置同步。
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多