SpringCloud组件:你的Eureka服务注册中心安全吗?

在之前的章节我们讲到了SpringCloud组件:搭建Eureka服务注册中心,已经可以让我们自定义的微服务节点进行注册到该Eureka Server上,不过在注册过程中存在一个风险的问题,如果我们的Eureka Server的地址无意暴露在外,那岂不是通过Eureka协议创建的任意服务都可以进行注册到该Eureka Server吗?(当然如果你配置了服务器的安全组并且使用内网的IP地址或者主机名方式对外提供服务注册地址几乎不存在这个问题。)

本章目标

Eureka Server穿上安全的外套,我的注册中心更安全。

构建项目

依然使用idea开发工具创建一个SpringBoot项目,在依赖的选择界面我们添加Eureka ServerSecurity相关依赖,pom.xml配置文件如下所示:

//...省略部分内容
<dependencies>
    <!--Eureka服务端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <!--添加安全认证-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
//...省略部分内容

因为我们是用的是Spring Security作为安全组件,所以在这里需要添加spring-boot-starter-security依赖来完成安全相关组件自动化配置以及实例化

既然依赖已经添加好了,那么我们怎么配置安全用户呢?

开启注册中心安全配置

在添加安全配置之前,我们需要把Eureka Server的配置也一并添加上,如果你对Eureka Server配置不太了解,你可以查看SpringCloud组件:搭建Eureka服务注册中心阅读学习

配置文件的安全配置

修改application.yml配置文件内容,添加安全配置信息,如下所示:

# 服务名称
spring:
  application:
    name: hengboy-spring-cloud-eureka-security
  # 安全参数配置
  security:
    user:
      name: api
      password: node
      roles: SERVICE_NODE
# eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:${server.port}/eureka/
    fetch-registry: false
    register-with-eureka: false

# 端口号
server:
  port: 10000

安全相关的内容我们通过spring.security.user开头的参数进行配置,对应自动绑定spring-boot-starter-security依赖内的org.springframework.boot.autoconfigure.security.SecurityProperties属性实体类。 在SecurityProperties的内部类SecurityProperties.User内我们可以看到已经给我们生成了一个默认的name以及password

  • spring.security.user.name 用户名,默认值为user,配置Spring Security内置使用内存方式存储的用户名。
  • spring.security.user.password 用户对应的密码,默认值为UUID随机字符串,配置Spring Security默认对应user用户的密码,该密码在系统启动时会在控制台打印,如果使用默认值可以运行查看控制台的输出内容。

开启Http Basic 安全认证

旧版本的Spring Security的依赖是可以在配置文件内容直接通security.basic.enabled参数进行开启basic认证,不过目前版本已经被废除,既然这种方式不可行,那我们就使用另外一种方式进行配置,通过继承WebSecurityConfigurerAdapter安全配置类来完成开启认证权限,配置类如下所示:

/**
 * 开启Eureka Server安全认证配置
 *
 * @author:于起宇 <p>
 * ================================
 * Created with IDEA.
 * Date:2018/9/28
 * Time:5:42 PM
 * 简书:http://www.jianshu.com/u/092df3f77bca
 * 码云:https://gitee.com/hengboy
 * GitHub:https://github.com/hengyuboy
 * ================================
 * </p>
 */
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    /**
     * 配置安全信息
     * - 禁用csrf攻击功能
     * - 开启所有请求需要验证并且使用http basic进行认证
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf()
                .disable()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .httpBasic();
    }
}

如果你了解Spring Security那肯定对我们自定义的安全配置类SecurityConfiguration的内容不陌生,在SecurityConfiguration#configure方法内,我们禁用了csrf功能并且开启所有请求都需要通过basic方式进行验证。

到目前为止我们的Eureka 注册中心的安全相关配置已经添加完成,那么我们的服务在进行注册时是不是也需要同步修改呢? 答案:肯定以及必须的 不过服务注册时仅仅是微调,影响不太大,那么我们下面来看下该怎么调整。

注册服务时的安全配置

如果你对怎么把服务注册到Eureka Server不太了解,你可以阅读SpringCloud组件:将微服务提供者注册到Eureka服务中心来进行学习, 我们只需要修改eureka.client.service-url.defaultZone配置的连接字符串内容即可,下面是修改前后的对比:

// 修改前
# 配置Eureka Server 信息
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10000/eureka/

// 修改后
# 配置Eureka Server 信息
eureka:
  client:
    service-url:
      defaultZone: http://api:node@localhost:10000/eureka/

修改后的api:node@这块的内容,前面是spring.security.user.name配置的值,而后面则是spring.security.user.password配置的值,@符号后面才是原本之前的Eureka Server的连接字符串信息。 对于上面的修改是不是很简单?

这也归功于Eureka的设计,安全方面也是netflix他们在研发过程中考虑到的一点,所以才会可以这么简单的集成Spring Security安全认证。

运行测试

本章的测试流程如下:

  1. 启动Eureka Server(本章项目)
  2. 启动Eureka Client(可以自行创建一个服务节点,也可以直接使用SpringCloud组件:将微服务提供者注册到Eureka服务中心源码进行测试。)
  3. 访问Eureka Server管理平台 http://localhost:10000
  4. 输入用户名api以及密码node进行登录
  5. 查看服务注册列表

总结

我们本章为Eureka Server穿上了安全的外套,让它可以更安全,在文章开始的时候我说到了如果使用内网IP或者主机名方式进行服务注册时是几乎不存在安全问题的,如果你想你的服务注册中心更新安全,大可不必考虑你的服务注册方式都可以添加安全认证。

源码位置

与恒宇少年面对面

如果你喜欢恒宇少年的相关文章,那么就去微信公众号(恒宇少年)关注我吧!!! 当然你也可以去 SpringCloud码云源码 项目底部扫描微信公众号二维码关注我,感谢阅读!!!

学习目录推荐

开源信息

这段时间一直在编写开源的相关框架,致力于公司使用的框架升级以及开源计划,将公司使用到的工具以及插件进行升级重构并且开源。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

linux GDB调试c++程序

  GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNI...

14320
来自专栏编程

Spring Boot+Mybatis+Redis二级缓存开发指南

背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。...

590100
来自专栏java一日一条

Spring Boot + Mybatis + Redis二级缓存开发指南

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Red...

19030
来自专栏SpringBoot 核心技术

SpringCloud组件:将服务提供者注册到Eureka集群

在之前章节SpringCloud组件:将微服务提供者注册到Eureka服务中心已经讲解了把服务注册到单个Eureka Server节点上,既然我们在Spring...

73850
来自专栏向治洪

Ant打包

Ant打包 使用步骤: 对于已经存在的工程需要利用Ant命令更新一下: android update project -n Test -p D:/wo...

24980
来自专栏Android相关

Gradle For Android(3)--管理依赖关系

依赖关系管理是Gradle的闪光点。在这个脚本中最好的一点,就是你所需要的只是添加一行到你的build.gradle中,然后Gradle就会从一个远程仓库中下载...

11330
来自专栏SpringBoot 核心技术

SpringCloud组件:将微服务提供者注册到Eureka服务中心

Eureka提供了Server当然也提供了Client,如果你对Eureka Server不了解,点击SpringCloud组件:搭建Eureka服务注册中心阅...

43840
来自专栏云计算教程系列

如何在CentOS 7上安装Bacula Server

Bacula是一种开源网络备份解决方案,允许您创建备份并执行计算机系统的数据恢复。它非常灵活和强大,这使得它在配置时稍微麻烦,适合在许多情况下进行备份。备份系统...

80930
来自专栏java闲聊

AvtiveMQ与SpringBoot结合

23270
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项...

34060

扫码关注云+社区

领取腾讯云代金券