Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >又双叒被eureka坑了

又双叒被eureka坑了

作者头像
你呀不牛
发布于 2021-05-28 03:32:10
发布于 2021-05-28 03:32:10
58900
代码可运行
举报
文章被收录于专栏:我要变牛我要变牛
运行总次数:0
代码可运行

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

Eureka包含两个组件:Eureka Server和Eureka Client。具体怎么部署这里就不说了,直接说问题

Eureka 客户端注册时需要配置服务端地址,类似如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    hostname: hello-service
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
    register-with-eureka: true 
    fetch-registry: true
    service-url: 
     defaultZone: "http://localhost:8761/eureka/" 

这种配置后客户端就会注册到Eureka注册中心,在Eureka界面就能看到:

但是这样把界面暴露到外面,会把注册信息泄漏,一般公司也不允许暴露没有安全认证的后台界面

所以尝试把Eureka界面加密

引入security

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Eureka服务端增加basic鉴权:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  application:
    name: eureka-server 
  security: 
    basic:
      enabled: true
    user:
      name: admin
      password: 123456

配置完成后发现现在访问eureka界面需要用户名和密码登录了

但是登录进去后发现刚才的hello服务并没有注册进来

呕吼,应该是客户端没配置鉴权信息的原因,在官网找到了客户端鉴权配置方式

https://cloud.spring.io/spring-cloud-netflix/multi/multi__service_discovery_eureka_clients.html

于是在hello服务修改配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  instance:
    hostname: hello-service
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://admin:123456@localhost:8761/eureka/

重启hello服务后,发现还是没有注册成功,原来增加basic验证后,不支持跨域访问了,我的天,你这个大坑,服务注册肯定是跨域的了,

于是,迅速增加配置,去掉跨域拦截

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
     // http.csrf().disable();//一种方式直接关闭csrf,另一种配置url后放行
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

终于在界面看到可可爱爱的hello服务了,但是呢,还有一个问题,现在不允许这种明文密码出现在配置或代码中,怎么办呢?

首先想到的就是密码加密, 所以从spring-securiry中找到PasswordEncoderFactories加密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PasswordEncoderFactories.createDelegatingPasswordEncoder().encode("123456")

然后把加密后的结果放到Eureka服务端配置文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
security: 
  basic:
    enabled: true 
  user:
    name: admin
    password: '{bcrypt}$2a$10$mhH7ogkRB91YDUO3F883JugDMHz2o6miT95.8ukqEc6Ed4Z2xyHmm' //必须有引号

那Eureka客户端怎么办?同样道理的嘛

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client:
  register-with-eureka: true
  fetch-registry: true
  service-url:
    defaultZone: http://admin:{bcrypt}$2a$10$mhH7ogkRB91YDUO3F883JugDMHz2o6miT95.8ukqEc6Ed4Z2xyHmm@localhost:8761/eureka/

但是呢,启动直接报错,害,eureka注册时并不会解密

解析Eureka服务端地址失败,即使是加上引号也是报相同错误

Eureka客户端注册过来的消息,服务端并不会给解密,那怎么办呢?

从上图可以看到如果要实现更复杂的需求,需要通过注入clientFilter方式,so,搞起来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@Priority(Integer.MIN_VALUE)
public class UserCilentFilter extends ClientFilter {
    @Override
    public ClientResponse handle(ClientRequest clientRequest) throws ClientHandlerException {
        try {
            String originUrl = clientRequest.getURI().toString();
            if(originUrl.contains("@")){
                return this.getNext().handle(clientRequest);
            }
            String userNameAndPwd = "http://admin"+ jiemi("'{bcrypt}$2a$10$mhH7ogkRB91YDUO3F883JugDMHz2o6miT95.8ukqEc6Ed4Z2xyHmm'");
            String addUserInfoUrl = originUrl.replaceFirst("http://", userNameAndPwd);
            clientRequest.setURI(new URI(addUserInfoUrl));
        } catch (URISyntaxException e) {
            // FIXME: 2021/4/2
        }
        return this.getNext().handle(clientRequest);
    }

    private String jiemi(String pwd) {
        // FIXME: 解密
        return pwd;
    }


    @Bean
    public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() {
        DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs = new DiscoveryClient.DiscoveryClientOptionalArgs();
        discoveryClientOptionalArgs.setAdditionalFilters(Collections.singletonList(new UserCilentFilter()));
        return discoveryClientOptionalArgs;
    }
}

这样写的思路是让其他客户端注册时去掉用户名和密码,然后在自定义过滤器中对没有用户名和密码时补充上basic验证的用户名和密码

然后开始测试,这样还是不行,其他服务注册过来时,会被其他安全过滤器拦截都走不到自定义的拦截器就返回鉴权失败了,即使@Priority(Integer.MIN_VALUE)最高优先级

那是不是可以在更前面的地方进行拦截呢?增加ServletRequest拦截器可行否?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ServerRequestAuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        //业务实现,根据请求的IP或者参数判断是否可以执行注册或者访问
//        String addUserInfoUrl = originUrl.replaceFirst("http://", "http://admin:123456@");
        filterChain.doFilter(request, response);
    }
}

但是假设这样修改后,登录的web界面也会走到这个拦截器,同样会增加鉴权

也就是说这样直接增加鉴权,无法区分是其他客户端注册还是从界面访问

也没有什么太好的办法了,就直接在security的拦截器中把eureka注册相关的放掉,不进行鉴权操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/eureka/**").permitAll();
    super.configure(http);
}

这样设置后除了直接访问的界面需要鉴权外,其他eureka相关注册、查询等不需要鉴权

都这样分层鉴权操作了,再找下是不是有其他方式达到相同的目的,于是找到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka:
  dashboard:
    enabled: false

通过在启动脚本设置后,效果是类似的,在eureka主界面无法访问

上面所有的操作都是为了信息安全考虑,还有一个经常忘记需要考虑的组件是Spring Boot Actuator,针对 Spring Boot Actuator 提供的 endpoint,采取以下几种措施,可以尽可能降低被安全攻击的风险

  1. 最小粒度暴露 endpoint。只开启并暴露真正用到的 endpoint,而不是配置:management.endpoints.web.exposure.include=*。
  2. 为 endpoint 配置独立的访问端口,从而和 web 服务的端口分离开,避免暴露 web 服务时,误将 actuator 的 endpoint 也暴露出去。例:management.port=8099。
  3. 引入 spring-boot-starter-security 依赖,为 actuator 的 endpoint 配置访问控制。
  4. 慎重评估是否需要引入 spring-boot-stater-actuator。以我个人的经验,我至今还没有遇到什么需求是一定需要引入spring-boot-stater-actuator 才能解决,如果你并不了解上文所述的安全风险,我建议你先去除掉该依赖。

信息安全已经成为各大公司不得不考虑的问题,所以精准的权限控制也是必不可少的,希望本文对大家在使用SpringCloud相关组件安全控制上有启发作用。

如果觉得俺写的还可以,记得点赞,一键三连也不介意。

☞☞每周一篇,赛过神仙,看完点赞,养成习惯☜☜

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 你呀不牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微服务中一个监控Spring Boot的神器
你是不是在一个月黑风高的晚上想过这么一件事情,就是想把spring boot actuator的那些endpoint可视化,是不是想着自己搞一个UI。 每当你有这种想法的时候,建议你一定要首先想想:开源世界是不是早就有人做了。 没错,有人为你做好了。其中最有名的当属spring-boot-admin这个项目了。 spring boot admin是个什么鬼呢?就是一个可以监控和管理spring boot应用的admin管理应用。原理很简单,就是把spring boot actuator中的那些endpoin
ImportSource
2018/04/03
9.6K2
微服务中一个监控Spring Boot的神器
Eureka服务发现和注册
文章目录 1. Eureka - 服务发现和注册 2. 服务端 3. 客户端 4. 细节的完善 4.1. 微服务名称的改变 4.2. 访问信息显示IP信息提示 4.3. 微服务info内容的说明(客户端) 5. 自我保护机制 6. 服务发现(不重要) 7. 集群配置 7.1. 服务端的配置 7.2. 客户端 8. 完整的配置信息 8.1. 服务端 8.2. 客户端 9. Eureka设置用户名和密码访问 10. Eureka和zookepper的区别 11. 参考文章 Eureka - 服务发现和注册
爱撒谎的男孩
2019/12/31
7040
SpringCloud之Eureka使用篇
业务场景: 比如说某个app搞活动,然后用户每日完成多少单奖励啥东西,用户中心页面能够看到自己今日完成多少单。 环境: 1.首先我这里有spring-cloud-parent pom工程 2.spring-cloud-eureka-server Eureka Server 子工程 这里端口我们使用90开头 3.spring-cloud-user-service-consumer 用户服务 (也就是咱们的服务消费者)这里端口我们使用80 开头 4.spring-cloud-order-service-provider 订单服务 (服务提供者) 这里端口我们使用70开头
全栈程序员站长
2022/07/23
3460
SpringCloud之Eureka使用篇
Springcloud:Eureka服务注册与发现
@EnableEurekaServer加上个注解就是Eureka的服务端了,我们并不需要写什么业务员,启动之后访问
冷环渊
2021/10/19
5280
SpringCloud2.0 Eureka集群 高可用的认证服务实现与搭建
SpringCloud-2.0.2.RELEASE Eureka认证后,服务注册失败问题。
吴生
2018/05/29
1K0
服务注册与发现组件 Eureka 应用实战
在传统的单体应用中,组件之间的调用通过有规范约束的接口进行,实现不同模块间良好协作。在微服务架构中,原本的'巨石'应用按照业务被分割成相对独立的、提供特定功能的服务,每一个微服务都可以通过集群或者其他方式进行动态的扩展,每一个微服务实例的网络地址都可能动态变化,这使得原本通过硬编码地址的调用方式失去了适用性。微服务架构中,服务跨度之大,数量之多,迫切需要架构建立一个去中心化的组件对各个微服务实例的信息进行登记和管理,同时提供能力让各个服微务实例之间能够互相发现,从而达到互相调用的结果。
aoho求索
2019/08/21
5490
服务注册与发现组件 Eureka 应用实战
SpringCloud的入门学习之概念理解、Eureka入门
  答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题、提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务工程/或者Module模块。
别先生
2019/11/26
4670
Spring Boot Admin:微服务应用监控
SpringBoot应用可以通过Actuator来暴露应用运行过程中的各项指标,Spring Boot Admin通过这些指标来监控SpringBoot应用,然后通过图形化界面呈现出来。Spring Boot Admin不仅可以监控单体应用,还可以和Spring Cloud的注册中心相结合来监控微服务应用。
macrozheng
2019/10/31
8770
Spring Cloud Eureka:服务注册与发现
在微服务架构中往往会有一个注册中心,每个微服务都会向注册中心去注册自己的地址及端口信息,注册中心维护着服务名称与服务实例的对应关系。每个微服务都会定时从注册中心获取服务列表,同时汇报自己的运行情况,这样当有的服务需要调用其他服务时,就可以从自己获取到的服务列表中获取实例地址进行调用,Eureka实现了这套服务注册与发现机制。
macrozheng
2019/09/17
9430
微服务(三)——Eureka服务注册与发现&Eureka集群
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
不愿意做鱼的小鲸鱼
2022/09/26
9320
微服务(三)——Eureka服务注册与发现&Eureka集群
SpringCloud---Eureka
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
大忽悠爱学习
2021/11/15
3560
springcloud之Eureka
Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,就可以访问到服务,而不需要修改调用的配置文件。
Java微观世界
2025/01/20
1050
springcloud之Eureka
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务注册与发现
步骤i同 将EurekaClient端8001注册进EurekaServer成为服务提供者provider !!!
百思不得小赵
2022/12/01
3940
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务注册与发现
【愚公系列】2023年11月 Java教学课程 184-SpringCloud(Eureka注册中心)
微服务注册中心是一个管理微服务的工具,可以帮助微服务在分布式系统中发现、注册和协调服务之间的交互。它是微服务架构的核心组件之一,负责维护服务注册表,提供服务发现、负载均衡、故障恢复等功能,使得微服务能够更好地运行和协作。常见的微服务注册中心有Consul、Eureka、Zookeeper等。
愚公搬代码
2025/06/02
1160
【愚公系列】2023年11月 Java教学课程 184-SpringCloud(Eureka注册中心)
利用 Spring Boot Admin 对 Spring Boot 应用监控以及配置认证
Spring Boot Admin 是一个优秀的 Spring Boot 应用监控,可以查看应用的各项性能指标,修改日志级别(生产环境利器,不用动不动就上 Arthas),dump 线程等功能。如果是微服务可以使用 Eureka 来做服务的注册与发现,单体应用的话直接往 Spring Boot Admin 的 Server 端注册就行。
Yuyy
2022/09/21
1.5K0
微服务架构与springcloud04——Eureka服务注册与发现
如果你有自己的私人医生,那么你需要时直接与医生进行联系就可以。但大多数人都需要去医院,医院有很多病人,也有很多医生,那么就需要一个窗口来挂号、取号、管理余号等等。同样的道理,当我们的服务数量变得多起来,就需要进行服务注册与发现的管理了。
半旧518
2022/10/26
2500
微服务架构与springcloud04——Eureka服务注册与发现
Spring Cloud 服务的注册与发现(Eureka)
服务发现是微服务架构下最核心的概念。Eureka是服务发现的服务端和客户端,服务端是服务的注册中心,客户端是每一个服务。
小忽悠
2018/08/28
1.3K1
Spring Cloud 系列之注册中心 Eureka
  Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client。2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主。Eureka 提供基于 REST 的服务,在集群中主要用于服务管理。Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群部署创造了条件。使用该框架,可以将业务组件注册到 Eureka 容器中,这些组件可进行集群部署,Eureka 主要维护这些服务的列表并自动检查它们的状态。Spring Cloud Netflix Eureka 是 Pivotal 公司为了将 Netflix Eureka 整合于 Spring Cloud 生态系统提供的版本。   Eureka 包含两个组件:Eureka Server 和 Eureka Client, Eureka Server 提供服务注册服务。各个微服务节点通过配置启动后,会在 EurekaServer 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。EurekaClient 通过注册中心进行访问。它是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为30秒)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除(默认90秒)
Demo_Null
2020/11/04
4000
Spring Cloud 系列之注册中心 Eureka
SpringCloud 入门之Eureka 篇
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。
崔笑颜
2020/06/08
5950
Spring Cloud 微服务学习笔记 - Eureka 服务注册与发现
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
泰坦HW
2021/02/01
4590
相关推荐
微服务中一个监控Spring Boot的神器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验