前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跟我学Spring Cloud(Finchley版)番外-01-Eureka安全详解

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

作者头像
用户1516716
发布2019-07-10 14:55:17
3450
发布2019-07-10 14:55:17
举报
文章被收录于专栏:A周立SpringCloudA周立SpringCloud

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

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

Eureka Server端

改造

1 加依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2 加配置

代码语言:javascript
复制
spring:
  security:
    user:
      name: user                # 配置登录的账号是user
      password: password123     # 配置登录的密码是password123

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

3 改配置

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

代码语言:javascript
复制
eureka:
  client:
    service-url:
      defaultZone: http://user:password123@localhost:8761/eureka/

4 写代码

代码语言:javascript
复制
/**
 * 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 ,可跳转至类似如下的登录页面:
  • 输入账号 user ,密码 password123 后,即可正常访问Eureka Server首页。

Eureka Client端

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

代码语言:javascript
复制
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的某个地方能直接切换环境,例如一键切换开发、测试、生产环境等。

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

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

配套代码

  • GitHub:
  • microservice-discovery-eureka-authenticating:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-discovery-eureka-authenticating
  • Gitee:
  • microservice-discovery-eureka-authenticating:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-discovery-eureka-authenticating
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT牧场 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Eureka Server端
    • 改造
      • 测试
      • Eureka Client端
      • 数据权限·吐槽·拓展
      • 配套代码
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档