`

跟我学Spring Cloud(Finchley版)番外-01-Eureka安全详解

 
阅读更多

说明:SpringCloud系列笔者自学系列,学习来源是周立的博客  http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。

本篇来源 http://www.itmuch.com/spring-cloud/finchley-out-1-eureka-security/

前文的示例中,Eureka Server都是允许匿名访问的,该方式一般无法满足公司在安全性上的诉求。

本节来构建一个需要登录才能访问的Eureka Server。Eureka本身不具备安全认证的能力,Spring Cloud使用Spring Security为Eureka Server进行了增强。

Eureka Server端

改造

  • 加依赖

     
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  • 加配置

     
    spring:
      security:
        user:
          name: user                # 配置登录的账号是user
          password: password123     # 配置登录的密码是password123

    不设置这段内容,账号默认是user,密码是一个随机值,该值会在启动时打印出来

  • 改配置

    将Eureka Server中的 eureka.client.service-url.defaultZone 修改为为http://{user}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/ 的形式:

     
    eureka:
      client:
        service-url:
          defaultZone: http://user:password123@localhost:8761/eureka/
  • 写代码

     
    /**
     * Spring Cloud Finchley及更高版本,必须添加如下代码,部分关闭掉Spring Security
     * 的CSRF保护功能,否则应用无法正常注册!
     * ref: http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_securing_the_eureka_server
     * @author zhouli
     */
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
      @Override
      protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
      }
    }

    Spring Cloud Finchley及更高版本必须添加这一段,在Edgware以及更早的版本中无需这一步骤。

测试

  • 启动Eureka Server并访问http://localhost:8761 ,可跳转至类似如下的登录页面:

    图-Eureka Server登录页

  • 输入账号user ,密码password123 后,即可正常访问Eureka Server首页。

Eureka Client端

如何将微服务注册到需认证的Eureka Server上呢——和Eureka Server端一样,只须将eureka.client.service-url.defaultZone 配置为http://{user}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/ 的形式即可:

 
eureka:
  client:
    serviceUrl:
      defaultZone: http://user:password123@localhost:8761/eureka/

数据权限·吐槽·拓展

实际项目中,出于安全考虑,往往还需实现数据权限。

举个例子:

  • 团队1维护微服务A、B、C
  • 团队2维护微服务D、E、F

从安全的角度,我们希望:

  • 团队1中的开发人员只能操作微服务A、B、C在Eureka Server上的信息;
  • 团队1中的开发人员只能访问其他团队授权给该团队的微服务的信息(例如团队2将微服务D授权给微服务A访问);

此时该怎么办呢?

TIPS

有人可能会想:Eureka Server上哪有什么操作啊!整个Eureka Server的界面上,明明只有查看的能力!

如果只是查看,那当然没有问题,但要知道Eureka Server是有RESTful API的(详见 跟我学Spring Cloud(Finchley版)-06-服务注册与服务发现-Eureka深入 一节 )——举个例子,只需发送DELETE请求到http://{username}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/apps/{appId}/{instanceID},即可下线服务。如果线上微服务被恶意下线,那后果是不堪设想的。君不见,前两年携程删库事件造成股票大跌?

Spring Cloud抑或原生Eureka Server并未提供这一功能,只能由开发人员基于Spring Security或其他权限框架自行扩展。

这个扩展的成本还是比较高的,于是目前业界大多企业都放弃了扩展,转而采用管理手段防止无数据权限带来的风险。例如,生产环境中:

  • 将Eureka Server的账号密码管控起来,只有核心成员才知晓。

    TIPS

    有人可能会想:这TM扯淡吧?我翻一下配置属性不知道账号密码了?后面会讲配置中心,配置中心可将账号密码等敏感数据加密存储。

  • 将Eureka Server部署在一个隔离的网络中,人们无法直接访问到Eureka Server首页,必须借助跳板机等工具才能访问。

但不管怎么样,以上方式都会增加运维成本,同时也会带来不少沟通问题。

在笔者看来,体验最好、最直观、最完美的做法如下:

  • 有完备的数据权限机制;
  • 开发人员在一个Dashboard上可以查看、管理所有他有权管理的微服务(这里的Dashboard并不是指Eureka Server的界面,而是自己另外做的界面);
  • 在Dashboard的某个地方能直接切换环境,例如一键切换开发、测试、生产环境等。

思路已经给出,实现也就是工作量的事情了。

相信聪明的看官们,对是放弃扩展,抑或追求完美一事,心里一定有了一些计较。

配套代码

相关文章

 

分享到:
评论

相关推荐

    spring-cloud-starter-netflix-eureka-server-1.4.5.RELEASE.jar

    spring-cloud-starter-netflix-eureka-server-1.4.5.RELEASE.jar

    spring-cloud-starter-eureka-server-1.4.5.RELEASE.jar

    spring-cloud-starter-eureka-server-1.4.5.RELEASE.jar

    springcloud-Netflix-eureka demo 可做参考

    在分布式系统中,Spring Cloud是实现微服务架构的重要工具,而Spring Cloud Netflix Eureka则是Spring Cloud生态中的服务发现组件。本项目"springcloud-Netflix-eureka demo"提供了一个基于Spring Boot搭建的基础...

    SpringCloud-Finchley.SR1-Ribbon客户端负载均衡demo

    良心demo,可以再学习的过程中参考一下,官网的教程是真的需要好好琢磨的,这个可以作为辅助参考,demo采用的版本均为最新版本:springcloud2.0-Finchley.SR1版本,大神提醒我一句学习springcloud不要想的太复杂,...

    spring-cloud-netflix-eureka-server-2.0.4.RELEASE.jar

    Eureka修改增加页面操作,用于多人开发测试操作流程。可以更好的进行协调操作,只需要替换本地仓库的jar包就行

    spring cloud eureka(免费下载)

    - 添加必要的依赖,包括`spring-cloud-starter-netflix-eureka-server`,这是Eureka服务注册中心的核心依赖,以及`spring-boot-starter-test`用于测试。 - 在`pom.xml`文件中,设置`spring-cloud.version`属性为`...

    spring-cloud-netflix-eureka-server-1.4.5.RELEASE.jar

    spring-cloud-netflix-eureka-server-1.4.5.RELEASE.jar

    springcloud-eureka-feign-mybatis-seata.zip

    在"springcloud-eureka-feign-mybatis-seata"项目中,开发者可以学习如何整合这些技术来创建一个完整的分布式事务示例。通过Eureka,服务能够被发现和调用;借助Feign,跨服务调用变得简单;MyBatis负责与数据库交互...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    基于Spring Cloud Finchley SR2 Spring Boot 2.0.7的最新版本。 核心基础项目内实现类自定义的权限注解,配合RBAC权限模型+拦截器即可实现权限的控制,具体的参考项目中的实现。同时也封装了一些顶层类和结果集等。...

    Spring Cloud Eureka Server

    Spring Cloud Eureka Server是Spring Cloud框架中的一个关键组件,它主要负责服务的注册与发现,是微服务架构中实现服务治理的重要工具。Eureka Server作为服务注册中心,为其他微服务提供服务注册和发现的能力,...

    springcloud-provider-consumer-eureka

    《SpringCloud入门实践:构建Provider与Consumer以及Eureka探索》 SpringCloud作为微服务领域的主流框架,被广泛应用于大型分布式系统开发中。本项目“springcloud-provider-consumer-eureka”旨在提供一个基础的...

    黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心

    黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心

    springcloud-eureka-server.zip

    本文将围绕"springcloud-eureka-server.zip"这个项目,深入探讨SpringCloud Eureka Server的核心功能、配置优化以及实际应用。 一、Eureka Server概述 Eureka是Netflix开源的一个基于REST的服务,用于定位服务,以...

    SpringCloud-2.0-eureka-service-10000.zip

    《SpringCloud 2.0与Eureka服务注册详解》 在微服务架构中,服务发现是至关重要的一个环节,Spring...通过对`SpringCloud-2.0-eureka-service-10000`源码的学习,可以进一步深入了解Eureka的内部工作原理和最佳实践。

    spring-cloud-examples

    spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...

    spring-cloud使用的各种示例

    - [spring-cloud-config-eureka-bus](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-eureka-bus):配置中心和消息总线示例(配置中心终结版) - [gateway-service-zuul]...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring-cloud-netflix-hystrix应用

    《深入理解Spring Cloud Netflix Hystrix:构建弹性微服务...在实际项目中,结合Spring Cloud其他组件,如Eureka(服务发现)、Zuul(API网关)等,可以构建出更为完善的微服务体系,提升整体系统的稳定性和可维护性。

    spring-cloud-netflix-eureka-client-1.4.5.RELEASE.jar

    spring-cloud-netflix-eureka-client-1.4.5.RELEASE.jar

    基于Spring Cloud(Finchley版本)架构体系

    Spring Cloud Finchley是Spring Cloud的一个重要版本,它提供了一套微服务开发的工具集,用于构建分布式系统,如服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...

Global site tag (gtag.js) - Google Analytics