Elasticsearch未授权访问漏洞

        漏洞描述:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch的增删改查操作全部由http接口完。由于Elasticsearch授权模块需要付费,所以免费开源的Elasticsearch可能存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。业务系统将面临敏感数据泄露、数据丢失、数据遭到破坏甚至遭到攻击者的勒索。      

        默认安装情况下,Elasticsearch会开启并监听9200端口,但是对于该端口并没有访问控制,恶意用户可以在未授权的情况下通过浏览器访问ip:9200/_nodes/stats等链接获得系统信息、以及存储的敏感数据等。 

漏洞的验证

        访问IP:端口/_cat/indices,如果可以看到“数据库”了,证明漏洞是可被利用的,可以设置防火墙屏蔽9200外部访问,还可以添加用户名及密码限制其访问

添加用户名及密码

        (1)、启用xpack安全功能

                ES 6.8以后的版本自带一个叫 xpack 的安全功能,启用即开启了xpack的功能、模式、并且传输启用ssl,。

                修改 elasticsearch.yml ,加上以下配置项:

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

                然后重启ES服务 

        (2)、执行命令:./elasticsearch-setup-passwords interactive

                切换到/bin 目录下,执行命令:./elasticsearch-setup-passwords interactive

                先输入 y 确认修改密码, 然后根据提示输入每个账号的密码即可

在RestHighLevelClient中增加用户名密码验证

        (1)、配置文件修改

        增加username及password

# ES配置
elasticsearch:
  cluster: elasticsearch
  ip: xxx.xxx.xxx.xxx
  port: 9200
  username: elastic
  password: xxxxxxx

        (2)、修改相关配置

@Configuration
public class ElasticsearchConfig {

    @Value("${elasticsearch.cluster}")
    private String cluster;

    @Value("${elasticsearch.ip}")
    private String ip;

    @Value("${elasticsearch.port}")
    private int port;

    @Value("${elasticsearch.username}")
    private String username;

    @Value("${elasticsearch.password}")
    private String password;

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration = null;
        try {
            clientConfiguration = ClientConfiguration.builder()
                    .connectedTo(ip+":"+port)
                    .withConnectTimeout(Duration.ofSeconds(5))
                    .withSocketTimeout(Duration.ofSeconds(3))
                    .withBasicAuth(username, password)
                    .build();
        }catch (Exception e){
            e.printStackTrace();
        }
        return RestClients.create(clientConfiguration).rest();
    }

}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐