文档章节

spring cloud vault配置

V
 Virya
发布于 2017/08/17 19:18
字数 1402
阅读 550
收藏 1

spring cloud vault配置

  • spring cloud vault配置
    • 简介
    • 1 vault服务端配置及启动
      • 1.1 consul启动
      • 1.2 vault启动
        • 1.2.1 创建配置文件
        • 1.2.2 启动vault
    • 2 vault Web UI启动
    • 3 vault服务端写入测试数据
    • 4 client端配置及调试
    • 参考

 

简介

Hashicorp Vault是一个工具,它为开发人员提供了以安全的方式进行安全的存取,比如API 令牌、SSL 证书和口令。它还处理用户的访问控制,具有撤销令牌的能力。除此之外,它还有审计功能,可以用它来跟踪用户。

spring cloud config可用来集中化管理集群配置。本文介绍使用vault来加密管理配置信息,client端用token获取配置,token可以细颗粒度管理配置信息。

所有配置集中存储在vault服务端,root token需要备份好,否则root token丢失,加密的配置也会丢失。

1 vault服务端配置及启动

vault后端配置用consul存储数据。client端用HTTP API 调用vault,可配置证书用https,本文未用https。

1.1 consul启动

下载consul二进制可执行文件并加入系统PATH中,验证:
# consul -v
Consul v0.9.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

后台启动:
nohup consul agent -server -bootstrap-expect 1 -data-dir /var/data/vault-consul -bind 127.0.0.1 >> /var/log/consul.log 2>&1 &

-data-dir指定数据存放目录,-bind 127.0.0.1只能本机访问,日志存放在/var/log/consul.log

1.2 vault启动

1.2.1 创建配置文件

# vim sccs-vault.conf

backend "file" {
 path = "vault"
}

storage "consul" {
 address = "127.0.0.1:8500"
 path = "vault"
}

listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}

storage "consul"指定存储方式, listener "tcp"address = "0.0.0.0:8200"配置了任何地址可访问vault,可修改为要指定的IP。

1.2.2 启动vault

下载vault二进制可执行文件并加入系统PATH中,验证:
# vault -v
Vault v0.8.0 ('af63d879130d2ee292f09257571d371100a513eb')

后台启动:
nohup vault server -config=/var/data/sccs-vault.conf >> /var/log/vault.log 2>&1 &

# export VAULT_ADDR='http://127.0.0.1:8200'
# vault status

初始化,注意保管好Initial Root Token:
# vault init

Unseal Key 1: /B9JpWDtQsQdUcqz1fvI1zfr8dOhhICnxxxxxxxxxxxx
Unseal Key 2: 9pw/+8w2cvfZCVrMlStTdTfdMiWs2ll5xxxxxxxxxxxx
Unseal Key 3: swsHnjEw6JAoNCdlfnhH7wpF7neeg85Fxxxxxxxxxxxx
Unseal Key 4: tnPWcJotb1DZUz9ujpw7VBA0Gpnh8GPlxxxxxxxxxxxx
Unseal Key 5: VA8UgvAgSUAX6im/P70pfM81FxGsKjd/xxxxxxxxxxxx
Initial Root Token: d9c43f56-5db0-c7fe-be83-xxxxxxxxxxxx

Vault initialized with 5 keys and a key threshold of 3. Please
securely distribute the above keys. When the vault is re-sealed,
restarted, or stopped, you must provide at least 3 of these keys
to unseal it again.

Vault does not store the master key. Without at least 3 keys,
your vault will remain permanently sealed.

用5个Key中的任意3个激活:

# vault unseal /B9JpWDtQsQdUcqz1fvI1zfr8dOhhICnxxxxxxxxxxxx
# vault unseal 9pw/+8w2cvfZCVrMlStTdTfdMiWs2ll5xxxxxxxxxxxx
# vault unseal swsHnjEw6JAoNCdlfnhH7wpF7neeg85Fxxxxxxxxxxxx

再次查看状态:

# vault status
Sealed: false
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0
Unseal Nonce:  
Version: 0.8.0
Cluster Name: vault-cluster-xxxxxxxx
Cluster ID: b85b198d-5d47-021b-6533-xxxxxxxxxxxx

High-Availability Enabled: true
       Mode: active
       Leader Cluster Address: https://127.0.0.1:8201

# export VAULT_TOKEN=(Root token)

HTTP API访问测试:
# curl http://127.0.0.1:8200/v1/sys/init
{"initialized":true}

2 vault Web UI启动

详情参看 https://github.com/djenriquez/vault-ui
在docker中启动vault Web UI:

docker run -d \
-p 58000:8000 \
-e VAULT_URL_DEFAULT=http://<VAULT SERVER IP>:8200 \
-e VAULT_AUTH_DEFAULT=TOKEN \
--name vault-ui \
djenriquez/vault-ui

注意修改<VAULT SERVER IP>
通过http://<DOCKER SERVER IP>:58000就可访问

3 vault服务端写入测试数据

使用Initial Root Token登录Web UI

  • Secret Backends->secret->NEW SECRET 中添加要被加密的内容再保存,如:

path: secret/app01/dev

{
  "username": "dev01",
  "password": "dev01"
}
  • System->Policies->ADD POLICY 中添加访问策略,对某个secrect的只读,如:

Name: app01-dev-r

{
  "path": {
    "secret/app01/dev": {
      "capabilities": [
        "read"
      ]
    }
  }
}
  • Auth Backends->token->NEW TOKEN 中根据策略添加token, 最终实现用该token只能读某个特定的secrect,如:

Token display name: app01-dev-r
Renewable: false
Assign Policies->Selected policies->app01-dev-r

注意关闭Renewale。选中的策略中只有指定的策略。
点击CREATE创建token,注意复制保存该token,否则只能重新创建生成。

4 client端配置及调试

客户端用spring boot框架
bootstrap.yml 优先级高于application.yml
bootstrap.yml若配置了从vault中读取配置,则vault中相同变量名会覆盖本地bootstrap.yml和application.yml

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-vault-config</artifactId>
        <version>{spring-cloud-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

读取vault与bootstrap.yml配置的对应关系:

/secret/{application}/{profile}
/secret/{application}
/secret/{defaultContext}/{profile}
/secret/{defaultContext}

bootstrap.yml

spring: 
  application:
    #name: client-01
    name: app01
  profiles:
    active:
    - dev
    #- test
  cloud: 
    vault:
      host: <VAULT SERVER IP> 
      port: 8200
      scheme: http
      connection-timeout: 5000
      read-timeout: 15000
      config:
          order: -10
          lifecycle: 
            enabled: false
      authentication: TOKEN
      ## app01-dev-r ##
      token: 1d15fc02-c90c-cf12-xxxxxxxxxxxx

注意修改<VAULT SERVER IP>为之前创建的vault服务地址
此配置会用token读取http://<VAULT SERVER IP>:8200/v1/secret/app01/dev中的配置

默认spring.cloud.vault.config.lifecycle.enabled=true,会定时刷新token,需要刷新权限。此处禁用刷新。

curl测试该token的有效性。jq用于将返回结果转为json,没有需安装jq
apt-get install -y jq

# curl \
    -H "X-Vault-Token: 1d15fc02-c90c-cf12-xxxxxxxxxxxx" \
    -X GET \
    http://127.0.0.1:8200/v1/secret/app01/dev |jq .data

spring boot 启动类

@SpringBootApplication
@RestController
@EnableAutoConfiguration
@ConfigurationProperties
public class Application {
    
    //@Value("${username}")
    String username;
    //@Value("${password}")
    String password;

    public String getUsername() {
      return username;
    }
    public void setUsername(String username) {
      this.username = username;
    }
    public String getPassword() {
      return password;
    }
    public void setPassword(String password) {
      this.password = password;
    }
    
    @PostConstruct
    private void postConstruct() {
    	System.out.println("##########################");
    	System.out.println(username);
    	System.out.println(password);
    	System.out.println("##########################");
    }
	
    @RequestMapping("/")
    public String home() {
        return "Hello " +username+ "!";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

添加 @EnableAutoConfiguration@ConfigurationProperties注解和get, set方法即可自动注入配置。
也可使用 @Value("${username}") 注入。

启动后即可看到读取到的vault配置:

##########################
dev01
dev01
##########################

参考

© 著作权归作者所有

V
粉丝 1
博文 3
码字总数 2460
作品 0
大理
私信 提问
Spring Cloud Edgware.SR6 发布,将于 8 月结束生命周期

Spring Cloud Edgware.SR6 已发布,该版本可以在 Maven Central 找到,本次更新主要是对其包含的一些模块进行了升级,或查看 Edgware 发布说明以获取更多信息。 需要提醒的是,Spring Cloud ...

xplanet
05/31
1K
1
Spring Cloud Edgware.SR5 发布,大量 bug 修复

Spring Cloud Edgware SR5(Service Release 5)已发布,可在 Maven Central 下载该版本。 主要更新 Spring Cloud Commons Bug fixes Spring Cloud Config Documentation and Bug fixes Spr......

淡漠悠然
2018/10/18
2.2K
0
Spring Cloud Finchley.SR2 发布

The release can be found in Maven Central. You can check out the Finchley release notes for more information. Spring Cloud Gateway Support WebFlux error handling in Hystrix time......

淡漠悠然
2018/10/25
0
0
Spring Cloud Greenwich.M3 版本发布

Spring Cloud Function 的第三个 Milestone 3 已发布,该版本的各个模块现可在 Spring Milestone 存储库中使用。 主要更改 此版本与 Spring Boot 2.1.0.RELEASE 兼容,并已对 Java 11 兼容性...

淡漠悠然
2018/11/22
5.7K
0
Spring Cloud Edgware SR4 发布,大量模块更新

在发布 Spring Cloud Finchley 正式版本后,Spring Cloud 又发布了 Edgware SR4 ,包含大量模块更新: Spring Cloud Commons 1.3.4.RELEASE (issues) Spring Cloud AWS 1.2.3.RELEASE (issu......

王练
2018/07/03
3K
4

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
7
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部