文档章节

在Ignite中自定义身份认证安全插件

李玉珏
 李玉珏
发布于 09/18 12:49
字数 1090
阅读 446
收藏 2

Ignite集群搭建完成之后,应用就可以接入集群进行各种操作了,但是默认的集群,没有安全保护机制,任何应用、支持JDBC的客户端,只要知道集群节点的IP地址,都可以接入集群,这造成了一定的安全风险,这对于持有敏感数据的用户,显然是无法接受的。

Ignite本身有一个简单的安全模块,提供了一个基于用户名/密码的认证机制,但是在实际业务场景中,需求往往更复杂,本文以白名单认证方式为例,讲述如何通过自定义安全插件的方式,满足自己的业务需求。

插件

Ignite有一个设计良好的模块化架构和插件机制,可以配置不同的模块,也可以自定义自己的插件。本文会介绍如何替换掉默认的安全实现。

第一步是在IgniteConfiguration中注入一个插件,本示例采用基于XML的配置,配置如下:

<bean id="ignite" class="org.apache.ignite.configuration.IgniteConfiguration"
      p:gridName="mygrid">

    <property name="pluginConfigurations">
        <bean class="ignite.WhiteListPluginConfiguration"/>
    </property>
</bean>

这个配置类的实现没什么特别的,只是创建一个插件提供者:

public class WhiteListPluginConfiguration implements PluginConfiguration {
    @Override
    public Class<? extends PluginProvider> providerClass() {
        return WhiteListPluginProvider.class;
    }
}

插件提供者类将在启动时由IgniteKernal初始化,可以创建支持不同接口的插件。本文对安全插件感兴趣,所以会创建GridSecurityProcessor的实现:

public class WhiteListPluginProvider
                  implements PluginProvider<WhiteListPluginConfiguration> {

    @Override
    public String name() {
        return "WhiteListSecurity";
    }

    @Override
    public String version() {
        return "1.0.0";
    }

    @Nullable
    @Override
    public Object createComponent(PluginContext ctx, Class cls) {
        if (cls.isAssignableFrom(GridSecurityProcessor.class)) {
            return new WhiteListSecurityProcessor();
        } else {
            return null;
        }
    }

    @Override
    public IgnitePlugin plugin() {
        return new WhiteListAuthenticator();
    }

    //all other methods are no-op
}

注意这里的createComponent方法和plugin方法。

这个类上的其它方法,大部分都是空实现。

WhiteListSecurityProcessor

到此为止,已经在Ignite中创建和安装了安全插件,剩下的就是实现具体的认证和授权逻辑,本文只关注认证,认证通过之后会授予所有的权限。

以下是主要的代码段:

public class WhiteListSecurityProcessor
                          implements DiscoverySpiNodeAuthenticator,
                                     GridSecurityProcessor,
                                     IgnitePlugin {

    //the hosts that will be allowed to join the cluster
    private Set<String> whitelist = new HashSet<>();

    private boolean isAddressOk(Collection<String> addresses) {
        //return true if the address is in the whitelist
    }

    @Override
    public SecurityContext authenticateNode(ClusterNode node,
                                                SecurityCredentials cred)
                                                throws IgniteException {

        return new SecurityContext(new SecuritySubject() {

            @Override
            public SecurityPermissionSet permissions() {
                if (isAddressOk(node.addresses())) {
                    return WhiteListPermissionSets.ALLOW_ALL;
                } else {
                    return WhiteListPermissionSets.ALLOW_NONE;
                }
            }

            //all other methods are noop

        });
    }

    @Override
    public boolean isGlobalNodeAuthentication() {
        //allow any node to perform the authentication
        return true;
    }

    @Override
    public void start() throws IgniteCheckedException {
        //load the whitelist
        //check that this process is running on a white listed server
        //if there's a problem throw new IgniteCheckedException
    }

    @Nullable
    @Override
    public IgniteSpiNodeValidationResult validateNode(ClusterNode node) {
        if (!isAddressOk(node.addresses())) {
            return new IgniteSpiNodeValidationResult(node.id(),
                                                     "Access denied",
                                                     "Access denied");
        } else {
            return null;
        }
    }

    //all other methods are noop

}

这个只是一段伪代码,具体的实现需要开发者根据自身的需求进行发挥。

start方法会在Ignite启动时调用,因此这里是加载白名单IP地址的合适位置。这里还可以用于校验此进程是否在列出白名单的服务器上运行,如果有任何问题,都可以抛出IgniteCheckedException异常,这会导致进程终止并输出错误信息。

当新的节点启动并尝试接入时,将按顺序调用authenticateNodevalidateNode方法。调用authenticateNode需要返回一个安全上下文,该安全上下文标识授予该进程的权限。为安全起见,如果IP地址不在白名单上,会返回一个ALLOW_NONE策略。然后调用validateNode,在这里可以获取连接节点的IP地址,并确定它是否可以加入集群。

至于有关如何创建策略列表的示例,请查看Ignite的GridOsSecurityProcessor类。

同样,有许多需要实现的无操作方法,但是与本文的主题无关。

最后

这个只是一个简单的示例,讲述了如何定制Ignite的插件,尤其是身份认证插件。如果用于处理身份认证的节点故障,则会选择一个新的节点并恢复服务。

© 著作权归作者所有

李玉珏

李玉珏

粉丝 384
博文 78
码字总数 148142
作品 0
沈阳
架构师
私信 提问
Apache Ignite上的TensorFlow

任何深度学习都是从数据开始的,这是关键点。没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要。在做研究、构建新的神经网络架构、以及做实验时,会习惯...

李玉珏
03/20
1K
0
Apache Ignite 高危漏洞预警:攻击者可执行任意代码

Apache Ignite 的开发团队近日在 Apache 邮件列表上发布了一个高危漏洞(CVE-2014-0114)预警,所有 Ignite 2.4 及更早之前的版本都会受到影响。 据悉,Apache Ignite 使用了 commons-beanut...

王练
2018/06/04
1K
0
Apache Ignite 2.5.0 版本发布,千级节点伸缩性

Apache Ignite 2.5: 千级节点伸缩性 Apache Ignite的用户通常知道的两个关键点是-扩展性和性能。在很多分布式系统的整个生命周期中,通常会不停地改进性能,而对扩展性相关的改进次数,会比较...

李玉珏
2018/06/01
1K
10
MyBatis Ignite 1.0.3 发布,MyBatis 缓存插件

MyBatis Ignite 1.0.3 发布了,MyBatis Ignite 是 MyBatis 的缓存插件。 本版本主要是将 Apache Ignite 更新至 1.8.0。 发布说明请查看: http://blog.mybatis.org/2016/12/mybatis-ignite-1...

王练
2016/12/15
2.2K
3
MyBatis Ignite 1.0.0 Beta1 发布

MyBatis Ignite 1.0.0 Beta1 发布了,这是 MyBatis 的一个插件,用于实现基于 Ignite 的缓存支持。 下载地址: https://github.com/mybatis/ignite-cache/releases/tag/mybatis-ignite-1.0....

淡漠悠然
2016/02/13
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
11分钟前
0
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
12分钟前
0
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
31分钟前
0
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
38分钟前
13
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
40分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部