使用保险柜管理机密

您如何存储秘密?

密码,API密钥,安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置,不得以纯文本格式提供。 实际上,不得在任何位置以明文形式存储它。

可以使用Spring Cloud Config Server或TomEE对敏感数据进行加密。 加密数据比未加密数据好了一步。 加密在另一方面强加了对用户端解密的需求,这要求分发解密密钥。 现在,您将钥匙放在哪里? 密钥受密码保护吗? 您将密码放在哪里? 您在多少系统上分发密钥和密码?

如您所见,加密引入了鸡蛋问题。 存储解密密钥使应用程序可以解密数据。 它还允许攻击向量。 未经授权的人可以通过访问机器来访问解密密钥。 该人可以解密可通过此密钥解密的数据。 该密钥是静态的,因此泄漏的密钥需要更改密钥。 数据需要重新加密,凭据需要更改。 在线测量不可能发现这种泄漏,因为一旦获得数据就可以离线解密。

一种方法是在应用程序启动之前将密钥放在难以猜测的位置,并在将密钥读取到内存后擦除密钥。 按键可用的时间缩短了。 缩短了攻击时间范围,但关键仍然在那里。 擦除密钥仅对一个应用程序启动有效。 众所周知,云中的容器和微服务一旦崩溃就会重新启动。 由于密钥已丢失,因此不再可能重新启动应用程序。

等等,有希望!

正确地进行加密非常困难,而如果自己进行加密,则管理秘密就更加困难。 保险柜正好解决了这些问题。 它有助于解决鸡蛋问题,并且带有加密功能。 保险柜是一项用于管理机密的服务。 它提供了一个API,可根据策略访问机密。 API的任何用户都需要进行身份验证,并且只能看到其被授权的机密。 保管箱使用带有GCM的 256位AES加密数据。 它可以将数据存储在各种后端(文件,Amazon DynamoDB,Consul等)中。 另一个关键方面是,保管箱从不将密钥存储在持久位置中。 启动/重新启动保管库始终需要一个或多个操作员才能解封保管库。 但是,让我们先从基础开始。

保险柜并不是所有安全问题的答案。 值得检查Vault安全模型文档以了解威胁模型。

要引导Vault,您需要从https://www.vaultproject.io/downloads.html下载二进制文件。 Vault用Go编写,二进制文件可用于各种平台。 解压缩下载的文件,即可开始使用Vault。

接下来启动Vault服务器。 您需要一个配置文件来指定一些选项。

vault.conf

backend "inmem" {
}listener "tcp" {address = "0.0.0.0:8200"tls_disable = 1
}disable_mlock = true

此配置适用于大多数平台,可以尝试使用Vault的第一步。 不要在生产中使用它。

通过启动Vault

$ vault server -config vault.conf

保管箱将作为前台进程启动。

恭喜,您已启动保险柜。

现在是打开第二个控制台以使用Vault执行管理任务的好时机。 Vault现在以纯文本模式运行,因为已禁用TLS / SSL。 您需要设置VAULT_ADDR环境变量,以告知Vault客户端使用纯文本:

$ export VAULT_ADDR=http://127.0.0.1:8200

保管箱已启动。 在实际开始使用保管库之前,它需要另外两个步骤。 保管箱需要初始化和启封。 初始化是初始密钥生成的过程。 启封正在为Vault提供密钥,因此Vault可以解密加密的数据并开始为客户端提供服务。

保管箱在初始化时会创建两件事:

  1. 主密钥和密钥拆分
  2. 根令牌

保险柜允许使用Shamir Secret Sharing算法共享密钥。 数据通常用一个密钥加密。 有权访问密钥的人作为一个人就可以完全控制所有数据。 有时您不想要那样。 通常,您希望在多个人之间分配主密钥,因此,没有一个人可以控制所有加密数据。 保管箱允许指定总数的密钥共享和初始化期间解封Vault所需的密钥共享数。 保险柜初始化后,便无法更改该设置。 从控制台初始化保管库将显示完整密钥。 您可能希望通过DevOps工具采用API进行初始化,例如,向应该接收密钥共享的操作员发送安全消息。

使用以下方法初始化保管箱:

$ vault init -key-shares=5 -key-threshold=2

保管箱将显示密钥共享和根密钥。 请注意,这些值是随机的,并且在每次初始化时都会更改。 请小心该输出,因为您只会看到一次。 之后没有办法检索密钥和令牌。 将Vault与真实数据一起使用时,请仔细阅读说明,否则会丢失数据。

Key 1: 99eb89735688ad7a29bb1ff27383bd1005a22a62c97f14357ea4f5f98c1d2c8c01
Key 2: 0c5605b16905794a302603bbeb8f6c8ad5ecf7e877f0e29084f838eba931b86902
Key 3: 7f3d88067c7e355acea4fe756a8b23fc6cd6bc671d7cb0f3d2cc8ae543dc3dc303
Key 4: 3d37062e1704ca2a02073b29c097d5a56e7056e710f515c16b40b9cfe3698bb804
Key 5: 4e5c8b99027f863afc85c6e741939ad3d74a1d687a7947a23d740bc109840e1205
Initial Root Token: 9a63de21-8af7-311a-9a5a-151b6a0d4795Vault initialized with 5 keys and a key threshold of 2. Please
securely distribute the above keys. When the Vault is re-sealed,
restarted, or stopped, you must provide at least 2 of these keys
to unseal it again.Vault does not store the master key. Without at least 2 keys,
your Vault will remain permanently sealed.

然后,您需要打开Vault的密封。 保管箱不会将密钥存储在磁盘上。 它一直存储在内存中。 初始化后,(重新)启动Vault后,您需要使用所需数量的密钥共享来打开Vault的密封,以便Vault可以提供机密信息。 在这种情况下,这是两个关键部分。 注意:还有一个Seal命令可以使Vault停止提供机密信息。

$ vault unseal 99eb89735688ad7a29bb1ff27383bd1005a22a62c97f14357ea4f5f98c1d2c8c01
Sealed: true
Key Shares: 5
Key Threshold: 2
Unseal Progress: 1$ vault unseal 7f3d88067c7e355acea4fe756a8b23fc6cd6bc671d7cb0f3d2cc8ae543dc3dc303
Sealed: false
Key Shares: 5
Key Threshold: 2
Unseal Progress: 0

保险柜开封后,您可以开始在保险柜内部存储机密数据。

保险柜需要经过身份验证的访问权限才能从此处继续。 保险柜将令牌用作其传输级别的常规身份验证。

还记得初始化的输出吗? 密钥共享之后的最后一项是根令牌。 目前最简单的方法是使用根令牌。 在控制台上使用令牌的最简单方法是将其存储在环境变量中:

$ export VAULT_TOKEN=9a63de21-8af7-311a-9a5a-151b6a0d4795
$ vault write secret/my-application password=H@rdT0Gu3ss

通用秘密后端允许将任意值存储为键值存储。 单个上下文可以存储一个或多个键值元组。 上下文可以按层次进行组织,使用的数据格式为JSON。

Vault提供除一般的秘密后台其它后端,使证书产生的MySQL,SQL服务器和PostgreSQL,领事和更多 。

认证方式

保险柜主要与令牌一起使用。 每个令牌都分配给可能限制操作和路径的策略。 策略使用基于路径的匹配来应用规则。 令牌可以获取元数据(键值)并显示分配的名称,这使管理对操作更加友好。

您可以手动创建令牌并将其分配给应用程序和用户。 除此之外,还有两种身份验证机制 (LDAP,用户名/密码,GitHub令牌……),允许用户登录并获取令牌。 令牌和身份验证机制可以撤销,这使得锁定特定用户变得容易。

Spring Cloud Vault

我们在Pivotal考察了Vault,并认为它是一种很有前途的工具。 这就是我们构建Spring Cloud Vault的原因。 Spring Cloud Vault是类似于Spring Cloud Config的配置扩展。 Spring Cloud Config的目标是外部配置管理,该管理由存储在各种存储库(例如GitHub,SVN甚至Vault)中的数据支持。

借助Spring Cloud Vault,您可以访问Vault中的秘密。 在启动应用程序时会获取机密。 Spring Cloud Vault使用应用程序中的数据(应用程序名称,活动上下文)来确定存储机密的上下文路径。

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

Spring Cloud Vault入门

首先,您需要一个Spring Boot项目。 start.spring.io是一个很好的起点。 任何空项目都足够。

在您的项目中包含Spring Cloud Vault入门

将以下代码添加到您的构建配置文件中。 这些行包括具有所有必需依赖项的Spring Cloud Vault入门程序。

马文

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-vault-starter-config</artifactId><version>1.0.0.BUILD-SNAPSHOT</version>
</dependency><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/libs-snapshot</url><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>

摇篮

repositories {maven {url 'https://repo.spring.io/libs-snapshot'}
}dependencies {compile("org.springframework.cloud:spring-cloud-vault-starter-config:1.0.0.BUILD-SNAPSHOT")
}

使用SNAPSHOT依赖项时,请确保包括Snapshots存储库。

设置配置

Spring Cloud Vault默认使用application作为默认上下文,并使用spring.application.name的值作为应用程序上下文。 所有配置都需要在引导程序配置中指定。 对于此示例,我们在src/main/resources使用bootstrap.yml

spring:application.name: my-applicationcloud.vault:token: 9a63de21-8af7-311a-9a5a-151b6a0d4795scheme: http

由于我们已以纯文本HTTP模式启动Vault,因此spring.cloud.vault.scheme设置为http 。 不要在生产中这样做。 纯文本使整个秘密故事变得毫无用处,因为网络上的所有听众都可以看到您的秘密。 spring.cloud.vault.scheme默认为https

请注意,此处的令牌取自根令牌。 您可以使用以下方法创建新令牌:

$ vault token-create
Key             Value
---             -----
token           728d26ae-53a6-d8b6-d7a0-c5f62238ea55
token_accessor  2fd7dcba-39d0-04d3-8d6b-096c3529cf14
token_duration  0
token_renewable true
token_policies  [root]

将数据写入保险柜

将一些数据写入保险柜:

$ vault write secret/my-application password=H@rdT0Gu3ss

更新您的Spring Boot应用程序

现在转到您的应用程序启动器类,并增强它以注入秘密。 使用与将其写入保险柜时相同的属性名称:

package example;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootVaultHelloWorldApplication {public static void main(String[] args) {SpringApplication.run(SpringBootVaultHelloWorldApplication.class, args);}@Value("${password}")String password;@PostConstructprivate void postConstruct() {System.out.println("My password is: " + password);}
}

其他所有事情都由Spring Cloud Vault本身处理。 现在运行您的应用程序。

恭喜,您成功了!

外表

Spring Cloud Vault现在位于Cloud Incubator中。 它支持令牌和AppId身份验证。 Spring Cloud Vault带有用于各种数据库集成和RabbitMQ / Consul支持的启动程序和依赖项。 您可以在ttps://github.com/spring-cloud-incubator/spring-cloud-vault-config上签出项目和文档 。

我们准备了一些示例,以给您留下印象,如何将Spring Cloud Vault与应用程序集成。 您可以在https://github.com/mp911de/spring-cloud-vault-config-samples中找到示例。

翻译自: https://www.javacodegeeks.com/2016/07/managing-secrets-vault.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

winScp中文乱码设置

打开一个putty窗口(图一)&#xff0c;左上角鼠标左键点击&#xff0c;弹出设置界面&#xff0c;选择Change Settings&#xff0c;在图二界面的window->translation&#xff0c;Remote character set选择UTF-8&#xff0c;Apply应用即可。 转载于:https://www.cnblogs.com/ya…

多台电脑共用一个耳机、音箱

台式机电脑声卡一般有三个插孔&#xff0c;一个是麦克风&#xff0c;一个是耳机&#xff0c;另一个就是LineIn输入口了&#xff0c;买一根AUX线&#xff0c;一头插入笔记本的耳机插口&#xff0c;另一头插入台式机linein口&#xff1b;在控制面板的声音中选择线路输入&#xff…

liferay开发文档_Liferay –简单主题开发

liferay开发文档实际上&#xff0c;Liferay的6.1版本已经走了很长一段路&#xff0c;该版本完全支持JSF和IceFaces。 我一直在努力学习它的绳索&#xff0c;因为我希望使其成为我们团队中的标准协作工具。 好的软件应用程序可以解决问题&#xff0c;但是好的软件应用程序不仅可…

ACRush 楼天城回忆录

利用假期空闲之时&#xff0c;将这几年 GCJ &#xff0c; ACM &#xff0c; TopCoder 参加的一些重要比赛作个回顾。首先是 GCJ2006 的回忆。 Google Code Jam 2006 一波三折&#xff1a; Google Code Jam 2006 是我第一次到美国参加现场的程序设计比赛。 Google Code Jam 2006…

JUnit 5 –条件

最近&#xff0c;我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧&#xff01; 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列中有关JUnit 5…

我的编程竞赛之路 ——中国大学生计算机编程第一人楼天城访谈

记者/陈秋歌 25岁的楼天城有“中国大学生计算机编程第一人”的称号&#xff0c;也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子&#xff1a;从2001年开始参加计算机编程竞赛&#xff0c;并连获全国一等奖&#xff1b;2004年入选国家集训队&#xf…

jenkins部署_Jenkins:部署JEE工件

jenkins部署随着持续集成和持续交付的出现 &#xff0c;我们的构建被分为不同的步骤&#xff0c;以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试&#xff0c;运行慢速测试&#xff0c;运行自动验收测试或发布应用程序等。 部署流程的最后步骤意味着将我们…

2013年3月编程语言排行榜:有毒的Java

2013年3月12日&#xff0c;Tiobe公布了新一期编程语言排行榜。Java依旧是占据第一的位置&#xff0c;C语言紧随其后。值得注意的Objective-C持续发力&#xff0c;已经占到了第三的位置。咋一看榜单&#xff0c;前5条中C#下滑最快&#xff0c;从第3名下降到第五名。而其他语言都…

DHCP服务(dhcpd)

DHCP动态分配主机地址&#xff08;Dynamic Host Configuration Protocol&#xff09; 动态主机配置协议&#xff08;DHCP&#xff09;是一种基于UDP协议且仅限于在局域网内部使用的网络协议&#xff0c;主要用于大型的局域网环境或者存在较多移动办公设备的局域网环境中&#x…

基于Matlab/Simulink不平衡电网工况下级联H桥光伏并网逆变器仿真模型

本次更新的内容为级联H桥光伏并网逆变器相关的控制&#xff0c;后面会针对储能系统在级联H桥拓扑上的应用进行分享。由于传统发电造成的环境污染问题和光伏电池板价格持续创新低&#xff0c;太阳能从众多种类的可再生能源中拔地而起&#xff0c;因而光伏逆变器成为国内外学者和…

“速课小龙”项目冲刺3

第三天 日期&#xff1a;2018/6/15 一.今日完成任务情况及遇到的问题 姓名完成情况遇到的问题解决方法邓旭 通过对昨天的知识进行再学习&#xff0c;已经能进行文件上传。并且开始着手于出题模块。 今天着手只是模型的基础层搭建&#xff0c;所以难度相对较少。未有问题解决陈逸…

Java和Lagom的CQRS

我很高兴在Chicago Java User Group上进行了讨论&#xff0c;并讨论了Lagom如何实现CQRS&#xff08;命令查询责任隔离模式&#xff09;。 值得庆幸的是&#xff0c;有一个录音&#xff0c;我还把这些幻灯片发布在slideshare上 。 抽象&#xff1a; 一旦应用程序变得相当复杂…

怎么样开会才有效果?

SAP项目实施过程中&#xff0c;难免不了要开不少的会议&#xff0c;无论是最前期的选型&#xff0c;还是商谈&#xff0c;乃至后面上线评审都免不了将很多项目干系人聚在一起就出现的问题或大家关心的问题摆在台面上做探讨。但只要你开过大会议你就会知道很多时候开会纯粹是为了…

网络15软工个人作业5——软件工程总结

一、请回望开学时的第一次作业&#xff0c;你对于软件工程课程的想象 1. 对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和目标&#…

dijkstra算法学习

dijkstra算法学习 一、最短路径 单源最短路径&#xff1a;计算源点到其他各顶点的最短路径的长度 全局最短路径&#xff1a;图中任意两点的最短路径 Dijkstra、Bellman-Ford、SPFA求单源最短路径 Floyed可以求全局最短路径&#xff0c;但是效率比较低 SPFA算法是Bellman-Ford算…

php定时任务(自己)

php定时任务&#xff08;自己&#xff09; 一、总结 一句话总结&#xff1a;可用php.exe连接php文件和bat文件&#xff0c;bat文件在计划任务中可以设置定时执行&#xff0c; 二、 1、php 2、bat E: "D:\software\code\phpStudy2018\PHPTutorial\php\php-5.4.45\php.exe&q…

楼天城 楼教主

楼天城 求助编辑百科名片 楼天城楼天城是杭州人&#xff0c;姚期智教授的得意门生&#xff0c;正是姚教授发现他的才能后把他引上了现在的研究方向&#xff0c;并大力举荐他参加国际学术会议和比赛。在网络上他被称为“楼教主”&#xff0c;清华同学则简称他“教主”。中文名&a…

jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法

jpa 与非jpa 结合今天&#xff0c;我们将看到有关此工具的信息&#xff0c;该工具使使用JPA Criteria更加容易。 使用该库的应用程序将在JPA实现中更加简洁&#xff0c;易于使用和可移植。 在本文的结尾&#xff0c;您将找到要下载的源代码。 什么是标准&#xff1f; 当前是创…

Python排序算法之快速排序

转自&#xff1a;https://www.cnblogs.com/AlwinXu/p/5424905.html 快速排序&#xff08;quickSort&#xff09; 快排的思想&#xff1a;首先任意选取一个数据&#xff08;通常选用数组的第一个数&#xff09;作为关键数据&#xff0c;然后将所有比它小的数都放到它前面&#x…

关于DP与背包

听说过动态规划&#xff08;DP&#xff09;的同学应该都知道有背包问题的存在。 首先我们来了解一下动态规划 基本思想&#xff1a; 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c; 可能会有很多可行解。没一个解都对应于一个值&#xff0c;我们希…