1.概述

转载:【es】ELASTICSEARCH之自定义JAVA代码的安全策略管理

在我们首次使用intellij直接运行elasticsearch的源代码的时候,我们必然会碰到下边这样一个安全性的问题(异常堆栈只截取了一部分),如果在深夜中静下心来思考一下,为什么直接执行发行包不发生这个错误呢?

Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[?:?]at java.security.AccessController.checkPermission(AccessController.java:1044) ~[?:?]at java.lang.SecurityManager.checkPermission(SecurityManager.java:408) ~[?:?]at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:470) ~[?:?]at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:369) ~[?:?]at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:359) ~[?:?]at java.lang.ClassLoader.<init>(ClassLoader.java:456) ~[?:?]at org.elasticsearch.plugins.ExtendedPluginsClassLoader.<init>(ExtendedPluginsClassLoader.java:36) ~[main/:?]at org.elasticsearch.plugins.ExtendedPluginsClassLoader.lambda$create$0(ExtendedPluginsClassLoader.java:57) ~[main/:?]at java.security.AccessController.doPrivileged(AccessController.java:310) ~[?:?]at org.elasticsearch.plugins.ExtendedPluginsClassLoader.create(ExtendedPluginsClassLoader.java:56) ~[main/:?]at org.elasticsearch.plugins.PluginLoaderIndirection.createLoader(PluginLoaderIndirection.java:31) ~[main/:?]at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:545) ~[main/:?]at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[main/:?]at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[main/:?]at org.elasticsearch.node.Node.<init>(Node.java:339) ~[main/:?]at org.elasticsearch.node.Node.<init>(Node.java:266) ~[main/:?]at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[main/:?]at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[main/:?]at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[main/:?]at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[main/:?]

2.探索问题根源

通过上边的异常堆栈信息,我们可以看到是执行ExtendedPluginsClassLoadercreate方法时候抛出了异常,如果仔细的分析一下,可以看到在create方法里边调用了ExtendedPluginsClassLoader的构造函数,紧接着调用了ClassLoader的构造方法,这里进行checkCreateClassLoader的时候没有通过。接下来看下源代码,可以看到这是一个相对比较简单的类,但是它继承了Java内置的ClassLoader类。

public class ExtendedPluginsClassLoader extends ClassLoader {private final List<ClassLoader> extendedLoaders;@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {for (ClassLoader loader : extendedLoaders) {try {return loader.loadClass(name);} catch (ClassNotFoundException e) {// continue}}throw new ClassNotFoundException(name);}public static ExtendedPluginsClassLoader create(ClassLoader parent, List<ClassLoader> extendedLoaders) {return AccessController.doPrivileged((PrivilegedAction<ExtendedPluginsClassLoader>)() -> new ExtendedPluginsClassLoader(parent, extendedLoaders));}
}

Java提供了一整套的安全机制,这里涉及到的是SecurityManager,负责管理类的具体的操作权限,例如这里的createClassLoader权限。但是默认情况下是不启用SecurityManager的,这里报错了,那elasticsearch肯定是启用了,我们来看下启动的源代码,在ElasticSearchmain方法中确实是启用了SecurityManager,从注释上可以看到已经授予全部的权限,现在报错了可能在后边执行过程中重置了SecurityManager,我们接着往下看

 public static void main(final String[] args) throws Exception {overrideDnsCachePolicyProperties();System.setSecurityManager(new SecurityManager() {@Overridepublic void checkPermission(Permission perm) {// grant all permissions so that we can later set the security manager to the one that we want}});LogConfigurator.registerErrorListener();final Elasticsearch elasticsearch = new Elasticsearch();int status = main(args, elasticsearch, Terminal.DEFAULT);if (status != ExitCodes.OK) {exit(status);}}

通过查找发现在Bootstrapsetup方法中对安全进行了配置

  // install SM after natives, shutdown hooks, etc.try {Security.configure(environment, BootstrapSettings.SECURITY_FILTER_BAD_DEFAULTS_SETTING.get(settings));} catch (IOException | NoSuchAlgorithmException e) {throw new BootstrapException(e);}

可以看到,在Securityconfigure方法直接中对Policy进行了重置,通过对createPermissionsgetPluginPermissions进行分析,未发现有针对ExtendedPluginsClassLoader进行授权的处理或者配置。

static void configure(Environment environment, boolean filterBadDefaults) throws IOException, NoSuchAlgorithmException {// enable security policy: union of template and environment-based paths, and possibly plugin permissionsMap<String, URL> codebases = getCodebaseJarMap(JarHell.parseClassPath());Policy.setPolicy(new ESPolicy(codebases, createPermissions(environment), getPluginPermissions(environment), filterBadDefaults));}

我们来看ESPolicy的初始化逻辑,经过分析只有第一行针对特定的codebases进行授权配置,这里读取的权限配置文件是server\src\main\resources\org\elasticsearch\bootstrap\security.policy,我们来看下这个文件

ESPolicy(Map<String, URL> codebases, PermissionCollection dynamic, Map<String,Policy> plugins, boolean filterBadDefaults) {this.template = Security.readPolicy(getClass().getResource(POLICY_RESOURCE), codebases);this.untrusted = Security.readPolicy(getClass().getResource(UNTRUSTED_RESOURCE), Collections.emptyMap());if (filterBadDefaults) {this.system = new SystemPolicy(Policy.getPolicy());} else {this.system = Policy.getPolicy();}this.dynamic = dynamic;this.plugins = plugins;
}

在文件中只有下边这一个是控制createClassLoader权限的,通过project的结构视图,plugin-classloader就是ExtendedPluginsClassLoader所在的项目,直接执行发行包没有问题,那这里应该是针对jar包进行的授权。

grant codeBase "${codebase.plugin-classloader}" {// needed to create the classloader which allows plugins to extend other pluginspermission java.lang.RuntimePermission "createClassLoader";
};

通过JarHellparseClassPath可以看到codebases最终来源于"java.class.path"

public static Set<URL> parseClassPath()  {return parseClassPath(System.getProperty("java.class.path"));
}

通过分析es的启动脚本,启动传递的是es根目录下的lib,里边都是jar文件,印证了我们前边的猜测。

# now set the classpath
ES_CLASSPATH="$ES_HOME/lib/*"

当我们在Intellij中执行es的时候,Intellij自动传递的是它自动生成的class文件所在的目录

-classpath F:\source\elasticsearch-6.8.12\server\build\classes\java\main;F:\source\elasticsearch-6.8.12\server\out\production\resources;F:\source\elasticsearch-6.8.12\libs\x-content\build\classes\java\main;

总结一下问题的根源,由于es自定义了java的代码安全策略,其在自己的security.policy文件中对createClassLoader权限进行了限制,只授权给了plugin-classloader,由于使用Intellij直接使用自己生成的class文件执行es,所以才会出现权限问题。

3.解决方案

最简单的方式就是新建一个专用的授权文件security_dev.policy,在里边进行授权

grant codeBase "file:/F:/source/elasticsearch-6.8.12/libs/plugin-classloader/build/classes/java/main/" {permission java.lang.RuntimePermission "createClassLoader";
};

并将自定义的文件路径添加到JVM的启动参数中即可

-Djava.security.policy=F:\source\elasticsearch-6.8.12\server\src\main\resources\org\elasticsearch\bootstrap\security_dev.policy

4.总结

默认情况下不会启用代码权限控制;要启用权限控制需要在启动入口使用代码显示的启用;

代码权限是针对某些代码授予一些操作的权限,这些操作都是需要通过调用JVM的,JVM负责进行权限校验;

Java的代码权限安全框架,提供了不同测试的自定义灵活性,我们既可以通过安全策略文件进行自定义,也可以通过实现自己的Policy或者SecurityManage来实现自定义;

【es】ELASTICSEARCH之自定义JAVA代码的安全策略管理相关推荐

  1. kettle 教程(四):自定义 Java 代码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qqfo24/article/detai ...

  2. java 内存管理_高性能Java代码之内存管理

    本文通过几个方面,来介绍Java代码的内存管理. 有的代码,GC根本就回收不了,直接系统挂掉.GC是一段程序,不是智能,他只回收他认为的垃圾,而不是回收你认为的垃圾. GC垃圾回收: Grabage ...

  3. 如何在Mirth Connect中创建和调用自定义Java代码

    0-前言 本文章将向您展示如何创建自定义Java类,将其编译/打包到JAR中,将其包含在Mirth Connect在,并在JavaScript中调用它,您可以从任何JavaScript上下文调用自定义 ...

  4. Kettle变量和自定义java代码的实例应用

    1  kettle.properties参数配置数据源连接和FTP连接 由于测试环境和生产环境中数据库连接FTP等配置会在部署过程中变更,所以预先定义成配置项,在配置文件中修改,这样测试和发布将会变得 ...

  5. java输出和opensl,OpenSL ES范例,无java代码,纯C

    http://tieba.baidu.com/p/2661564 ... p;cid=0#81086592640*/ #include //#include #include #include sta ...

  6. java代码实现图书管理_Java图书管理系统(用Java常用集合实现)(示例代码)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  7. java代码怎样连接es,Elasticsearch 连接ES的两种方式

    1.创建客户端节点来连接: 其中client(true)将node指定为客户端节点,所以这个不能写漏掉,客户端节点是不持有数据的, Java代码   Node node = NodeBuilder.n ...

  8. 分布式搜索引擎01-elasticsearch-介绍、倒排索引原理、概念(文档和字段,索引和映射)、安装、索引库crud、文档crud、RestAPI(java代码实现es的crud)

    文章目录 分布式搜索引擎01 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticse ...

  9. es文本分析java代码_Elasticsearch系列---Java客户端代码Demo

    前言 前面历经33篇内容的讲解,与ES的请求操作都是在Kibana平台上用Restful请求完成的,一直没发布Java或python的客户端代码,Restful才是运用.理解ES核心功能最直接的表达方 ...

最新文章

  1. 全新WiFi技术问世 更适合智能家庭和物联网
  2. 神奇的计算器dc和bc
  3. 利用api接口来实现web网页登陆
  4. 推荐两款 GTD 工具
  5. 7-1 一元多项式求导 (10 分)
  6. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验
  7. mysql不同的类的个数_Mysql-SQL优化-统计某种类型的个数_MySQL
  8. go golang 判断base64数据 获取随机字符串 截取字符串
  9. Vue中this.$router.replace和this.$router.push的区别
  10. 怎么计算机械需要的电机,步进电机力矩的怎么计算?
  11. ML-Agents案例之跳墙游戏
  12. 网课搜题公众号制作方法
  13. 缩写月份单词python_月份的英语单词
  14. AS中NDK环境搭建
  15. Towards Accurate Scene Text Recognition with Semantic Reasoning Networks
  16. 一文读懂ICO、IFO、IMO、IEO的区别,或许是全网最全科普
  17. Qt5.9最简单的画五角星
  18. 渗透测试工程师面试题大全(三)
  19. linux下载安装tree命令
  20. 阿里云 Redis 报出You can't read against a non-read redis.解决方案

热门文章

  1. 恒大和小米双双否认外界谣言,此前有人宣称小米将接手恒大造车
  2. 在吗,支付宝土味情歌撩到你了吗?网友:撩到了,好酸
  3. 曝张一鸣在游戏群批员工上班时聊游戏,遭回怼:那你退群啊
  4. 李开复:有三个AI专家就能估值7亿的时代过去了
  5. 覆盖7大手机品牌近4亿安卓用户 “互传联盟”让分享更容易
  6. iPhone SE 2生产无限期推迟,苹果决定推迟3月份产品发布会
  7. 疫情之下,哪些行业正在逆势爆发?
  8. 三星中国区启动裁员计划,无奈回应:提升在中国市场的竞争力
  9. 传音控股回应“遭华为起诉侵权”:未收到起诉状 科创板上市不受影响
  10. 国内电动车召回12万辆有余 电池衰减和充电故障成头号问题