在 Kubernetes 上部署 Secret 加密系统 Vault

HashiCorp Vault 是一个基于身份的 Secret 和加密管理系统。Secret 是您想要严格控制访问的内容,例如 API 加密密钥、密码或证书。Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存储和管理对机密和其他敏感数据的访问、严格控制和可审计。

目前的系统需要访问大量 Secret:数据库凭据、外部服务的 API 密钥、面向服务的架构通信的凭据等。了解谁在访问哪些机密已经非常困难。如果没有自定义解决方案,几乎不可能安全存储和详细审计。这就是 Vault 的用武之地。

我们可以使用官方 HashiCorp Vault Helm Chart 将 Vault 部署到 Kubernetes 中。https://github.com/hashicorp/Vault-helm

Helm Chart 允许用户以各种配置部署 Vault:

  • Dev:用于测试 Vault 的单个内存 Vault 服务器

  • 独立(默认):单个 Vault 服务器使用文件存储后端持久保存到卷

  • 高可用性 (HA):使用 HA 存储后端(如 Consul)的 Vault 服务器集群(默认)

  • 外部:依赖于外部 Vault 服务器的 Vault Agent Injector 服务器

下面将使用 Helm 部署 Vault,以下是步骤概述:

  • 下载 Vault Helm Chart

  • 修改 values.yaml, 用 Nodeport 暴露 Vault UI Service

  • 安装 Vault

  • 避坑指南

安装

下载 Chart 包

添加仓库:

helm repo add hashicorp https://helm.releases.hashicor

搜索可用的安装包版本:

# helm search repo hashicorp/Vault -l
NAME            CHART VERSION   APP VERSION     DESCRIPTION
hashicorp/Vault 0.19.0          1.9.2           Official HashiCorp Vault Chart
........

拉取最新版本的 Chart 包到本地:

helm fetch hashicorp/Vault
tar -zxf Vault-0.19.0.tgz
cd Vault/

修改 values.yaml

编辑 values.yaml 文件,修改访问 Vault UI 的配置:

  • enable ui

  • activeVaultPodOnly的值设为true

  • serviceType 更改为 NodePort

  • serviceNodePort 端口号改为 30000

# Vault UI
ui:# True if you want to create a Service entry for the Vault UI.## serviceType can be used to control the type of service created. For# example, setting this to "LoadBalancer" will create an external load# balancer (for supported K8S installations) to access the UI.enabled: truepublishNotReadyAddresses: true# The service should only contain selectors for active Vault podactiveVaultPodOnly: trueserviceType: "NodePort"serviceNodePort: 30000externalPort: 8200targetPort: 8200

执行安装

基于修改后的 values.yaml,执行安装命令:

helm install -f values.yaml Vault --namespace Vault . --create-namespace
或者
helm install -f values.yaml Vault hashicorp/Vault --namespace Vault --version 0.19.0  --create-namespace

检查 pod、svc 是否正常:

# k get pod -n Vault
NAME                                   READY   STATUS    RESTARTS   AGE
Vault-0                                1/1     Running   0          11m
Vault-agent-injector-f96b59db4-4855j   1/1     Running   0          11m# k get svc -n Vault
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
Vault                      ClusterIP   10.233.61.235    <none>        8200/TCP,8201/TCP   11m
Vault-agent-injector-svc   ClusterIP   10.233.32.31     <none>        443/TCP             11m
Vault-internal             ClusterIP   None             <none>        8200/TCP,8201/TCP   11m
Vault-ui                   NodePort    10.233.145.124   <none>        8200:30000/TCP      11m

避坑指南

Vault-0 一直 NotReady,通过 get pod 命令进行查看。

$ k get pod -n Vault
NAME                                   READY   STATUS    RESTARTS   AGE
Vault-0                                0/1     Running   0          1m
Vault-agent-injector-f96b59db4-4855j   1/1     Running   0          1m

检查日志:

$ k logs -f Vault-0 -n Vault
│ 2022-05-18T03:37:03.330Z [INFO]  core: security barrier not initialized                                                                                                        │
│ 2022-05-18T03:37:03.330Z [INFO]  core: seal configuration missing, not initialized

describe 看到下面的输出:

............Warning  Unhealthy  2m19s (x57 over 6m41s)  kubelet            Readiness probe failed: Key                Value                                                              │
│ ---                -----                                                                                                                                                       │
│ Seal Type          shamir                                                                                                                                                      │
│ Initialized        false                                                                                                                                                       │
│ Sealed             true                                                                                                                                                        │
│ Total Shares       0                                                                                                                                                           │
│ Threshold          0                                                                                                                                                           │
│ Unseal Progress    0/0                                                                                                                                                         │
│ Unseal Nonce       n/a                                                                                                                                                         │
│ Version            1.9.2                                                                                                                                                       │
│ Storage Type       file                                                                                                                                                        │
│ HA Enabled         false

这个问题是:尚未初始化和解封 Vault。自身没有自动初始化机制,需要执行下面的操作。

参见下面的 issue:
https://github.com/hashicorp/Vault-helm/issues/17

初始化 Vault

要解封 Vault,我们需要初始化 Vault,该操作将输出一些将用于解封 Vault 的 Unseal 密钥。保存Unseal KeyInitial Root Token,下面要用到:

$ k exec -ti Vault-0 -n Vault -- Vault operator init
Unseal Key 1: 84EQZ9v8EOsboZ2sakjWkaladYg3Kc6cMSR3SaTXjlnQ
Unseal Key 2: ljJlqqERDSjWkaladIcaNlpBUOELKJtZhb9zDwzV/GiL
Unseal Key 3: Cxi+JEpUs1aDR/XcjWadM/sK+xXbIXlYjck9o/5Bifw9
Unseal Key 4: 291rLn8XMsLIOKjWka6/7dBlzfIad830g0wcgEoOUx7X
Unseal Key 5: TqDLJkpE6NTsIyKVwjaWkaladO5B70LntD8o06x95l7ZInitial Root Token: s.mCOZiIHkRLopQsMOS1bd5ZJ
............

Vault 初始化为 5 个 Key,密钥阈值为 3。使用上面 Key 解封 Vault,需要达到阈值:

$ k exec -ti Vault-0 -n Vault -- Vault operator unseal$ k exec -ti Vault-0 -n Vault -- Vault operator unseal$ k exec -ti Vault-0 -n Vault -- Vault operator unseal

在提示符下每次粘贴不同的 Key。下面是解封 Vault 后的输出:

Unseal Key (will be hidden):
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    1/3
Unseal Nonce       9hl41a94-f15f-125d-04e5-edbd026cfc44
Version            1.9.2
Storage Type       file
HA Enabled         false

现在检查 Vault-0,应该为 READY 1/1

$ k get pod -n Vault
NAME                                   READY   STATUS    RESTARTS   AGE
Vault-0                                1/1     Running   0          11m
Vault-agent-injector-f96b59db4-4855j   1/1     Running   0          11m
登录 Vault UI

在 Nodeport 服务中配置的 30000 端口上打开 UI:
http://{HostIP}:30000/ui/Vault/auth?with=token

42a40a39f28f516b376cf1ec1d89cbe4.png

使用Token登录,需要使用到上面获得到的Initial Root Token

77aaf53b6f55534a4bf4addec37e9d80.png

总结

本文实践了如何在 Kubernetes 中使用 Helm 部署 HashiCorp Vault。下面是一些常用场景:

  • 使用在 Kubernetes 中运行的 Vault 服务的应用程序可以使用不同的 secrets 引擎[1] 和 身份验证方法[2] 从 Vault 访问和存储秘密。

  • 使用在 Kubernetes 中运行的 Vault 服务的应用程序可以利用Transit 秘密引擎[3] 作为“加密即服务”。这允许应用程序在存储静态数据之前将加密需求发送到 Vault。

  • 管理员可以给 Vault 挂载持久卷,该卷可用于存储 审计日志[4]

Vault 可以直接在 Kubernetes 上运行,因此除了 Vault 本身提供的原生集成之外,为 Kubernetes 构建的任何其他工具都可以选择利用 Vault。

  • Vault on Kubernetes Reference Architecture[5]提供了在生产环境 Kubernetes 上运行 Vault 的最佳实践。

  • Vault on Kubernetes Security Considerations[6]提供了特定于在生产 Kubernetes 环境中安全运行 Vault 的建议。

参考资料

[1]

secrets 引擎: https://www.vaultproject.io/docs/secrets

[2]

身份验证方法: https://www.vaultproject.io/docs/auth

[3]

Transit 秘密引擎: https://www.vaultproject.io/docs/secrets/transit

[4]

审计日志: https://www.vaultproject.io/docs/audit

[5]

Vault on Kubernetes Reference Architecture: https://learn.hashicorp.com/tutorials/vault/kubernetes-reference-architecture?in=vault/kubernetes

[6]

Vault on Kubernetes Security Considerations: https://learn.hashicorp.com/tutorials/vault/kubernetes-security-concerns?in=vault/kubernetes

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

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

相关文章

《看聊天记录都学不会C语言?太菜了吧》(15)你学了一节课的函数我5分钟搞定了,还很熟

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

【经典回放】多种语言系列数据结构算法:栈(JavaScript版)

本文采用JavaScript语言实现栈结构算法并举例应用。 JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: var s=new Array(); 定义一个s的数组,则这个s上将有以下的方法可供使用: 其中:FF: Firefox, IE: Internet Explore…

设计模式(10)-----模板方法模式

模板方法模式(Template Method) 定义 定义了一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 UML类图 例子 AbstractClass package com.csdhsm.pattemdesign.template;/** * Title: …

SLES修改本地FTP安装源

2019独角兽企业重金招聘Python工程师标准>>> SLES修改本地FTP安装源 一、配置本机FTP............................................................................................................. 1 1.1、安装.............................................…

.NET7 Preview4:重构的返回值TypedResults

为了更好的测试&#xff0c;更好的性能&#xff0c;Preview4带了一个新的请求返回值类型&#xff0c;这个新的类型中封装了所有的Http请求返回状态函数&#xff0c;还包括了返回成功后的几种数据类型&#xff0c;下面列举了几个常用的类型&#xff1a;app.MapGet("/test_o…

MATLAB软件禁用利好,Matlab被禁用?一款国产软件站了出来说:我就是中国的Matlab...

众所周知&#xff0c;前段时间Matlab被禁用&#xff0c;引发了网友们对于国产工业软件落后的诸多思考&#xff0c;比如为什么落后&#xff0c;落后到什么程度&#xff0c;有没有替代品等等。并且从Matlab到EDA&#xff0c;再到CAD等等&#xff0c;甚至工业操作系统等等&#xf…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(3)都说123是字符不是数字

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

ArcGIS实验教程:ArcGIS 10.2手把手图文安装教程(经典版)

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; ArcGIS许可服务无法启动解决办法&#xff1a;Win10操作系统ArcGIS许可License无法启动的解决方法汇总&#xff08;绝对成功&#xff01;&#xff09; 目录 一、系统…

html中radio,checkbox值的获取、赋值、注册事件

1&#xff0c;radio分组 只要name一样&#xff0c;就是一组的&#xff0c;即一组中只能选择一个&#xff0c;如下&#xff1a; 代码如下:<span>group1:</span> <input type"radio" id"radio1" checked"checked" name"grou…

ObjectAnimator属性动画应用demo

感谢慕课网--eclipse_xu 布局文件&#xff1a;activity_main.xml 1 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tools"http://schemas.android.com/tools"3 android:layout_width"match_parent"…

今晚在线解读|2021-2022 .NET 中国开发者生态调查报告

点击蓝字关注我们作为一名 .NETer&#xff0c;你就职于怎样规模的公司&#xff1f;所属什么行业领域&#xff1f;平时使用哪些快速开发框架&#xff1f;产品方向及收费模式又是怎样的&#xff1f; 作为一名开发者&#xff0c;你从业已有几年&#xff1f;平时加班多吗&#xff1…

实现网站验证码切换功能

实现网站验证码切换功能 一、样例 样例1、 样例2、 二、实现原理 三、实现代码 com.fry.servlet.VerifyCodeServlet 1 package com.fry.servlet;2 3 import javax.imageio.ImageIO;4 import javax.servlet.ServletException;5 import javax.servlet.annotation.WebServlet;6 im…

校园春色关不住,怎奈何唯有花枝俏,不见赏花人?

受新冠肺炎疫情的影响&#xff0c;直至今天&#xff08;2020年4月16日&#xff09;&#xff0c;各大学依然是人去楼空&#xff0c;我的大学也不例外。春天来了&#xff0c;本应是校园春色关不住&#xff0c;却怎奈何唯有花枝俏&#xff0c;不见赏花人&#xff1f;这也正应了那句…

CSDN是如何让我副业月入过万的?

始 我跟 CSDN 的缘分要从 2011 年说起&#xff0c;当时我正上高二&#xff0c;当时好像是在搞鼓 MFC。当时家里有了第一台电脑&#xff0c;我也再也不用去黑网吧去敲代码了&#xff0c;在家搜索资料的时候出现在我眼帘之中&#xff0c;并且对我有帮助的基本上都是 CSDN 上的内…

MSMQ消息广播

安装配置MSMQ消息广播&#xff0c;并验证是否可以发送广播消息&#xff0c;过程实录。1. 安装MSMQ with broadcasting support选择安装“消息队列”&#xff0c;并在子选项中选择“多播支持”一起安装。2. 注册表修改MulticastBindIPIf Message Queueing found multiple IP add…

【操作系统】操作系统不可怕,重装系统不求人,因为我们是GISer!

GISer不仅可以用意念操作软件,而且可以轻松自如重装系统!今天我们分享用U制作启动盘,并安装Win7系统。 一、系统安装必备 优盘(现在的U盘内存都比较大,大于4G即可)电脑店操作系统(Win7 64位专业版)二、安装过程 1、系统启动盘制作 下载电脑店优盘制作软件,安装,运行…

看聊天记录都学不会C语言?太菜了吧》(16)我一直以为校花很漂亮,直到我叫了她一声...

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

小米空调来了,意外的是还一起来了一个马桶盖

8月10日下午&#xff0c;小米旗下生态链企业智米召开了新品发布会&#xff0c;发布会上正式推出了智米全直流变频空调和智米智能马桶盖。 智米全直流变频空调采用了纯白配色&#xff0c;外观设计较为简洁&#xff0c;空调底部有一个圆形的显示屏&#xff0c;可显示温度、电量统…

聊一聊 CLR 中的 typedef 是怎么玩的

一&#xff1a;背景 在 CLR 源码中&#xff0c;我们会看到很多关于 typedef 的定义&#xff0c;比如下面这样&#xff1a;// Callback function type used by DacStreamManager to coordinate // amount of available memory between multiple streamable data // structures (…

JAVA如何正确处理Unicode字符

最近在开发输入法程序时遇到一个小问题&#xff0c;就是删除一个emoji时&#xff0c;不能一次删干净&#xff0c;需要执行两次操作才可以。Intuitively&#xff0c;这肯定是java操作unicode字符的问题&#xff0c;于是找了JAVA官方文档参考一下&#xff0c;解决了这个问题&…