TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?
引 言
这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式。TLS,安全传输层协议,是用于保护网络通信的加密协议。它是目前已经弃用的安全套接层(SSL)的继任者。
你可以从本系列中了解TLS如何集成到各种Rancher组件中以及如何准备环境以正确利用Rancher中的TLS。
为什么安全传输层协议(TLS)很重要?
Rancher在任何地方都可以使用TLS。因此,在安装Rancher之前,确定TLS终止选项十分重要。
1、 确认你想要执行的TLS终止类型,有以下几种类型:
自签名,由Rancher终止(这是默认的)
Let’s Encrypt,由Rancher终止
自带证书,由Rancher终止
外部TLS终止
2、 如果你选择了自带证书或外部TLS终止,那么请确保你有用于注册证书的CA证书的副本(仅需cert,不需要密钥)。Rancher在执行操作时需要这一文件。
3、 确保你知道Rancher要使用的主机名。这在安装之后不可更改。
建议你通过阅读文档来了解更多的细节:
什么组件需要安全传输层协议
对于任何企业软件来说,你都需要在安装和使用之前确定特定的要求,包括存储要求、网络、在云端还是本地等等。在进行安装之前,你必须得明确回答这些问题。
对于Rancher来说,考虑因素之一是TLS。必须了解并计划使用Rancher进行TLS的方法,如此才能获得能够充分支持并且拥有良好功能的解决方案。
除了HTTPS安全之外,还有其他两个地方也十分需要TLS:
1、 kubectl
2、 节点和集群agent通信
注意,并不止以上两个地方会使用到TLS,只是上述两个地方更为常见。
理解kubectl TLS
首先,我们来看一下示例kubeconfig文件:
apiVersion: v1
kind: Config
clusters:
\- name: "sample"
cluster:
server: "https://rancher.example.org/k8s/clusters/c-1234"
certificate-authority-data: "LS0t..."
特别注意certificate-authority-data
的存在。该字段是CA证书的base64编码版本,这一CA证书可用于对Kubernetes API服务器提供的TLS证书进行签名。或者是Rancher在代理调用kube-apiserver
时提供的TLS证书。
为什么这个如此重要呢?因为kubectl使用certificate-authority-data
来确保是你(而不是冒名顶替者)正在连接到正确的集群。如果服务器提供的证书尚未由certificate-authority-data
中的证书签名,那么kubectl会警告你并且退出。基本上,你不会遭受MITM(中间人)攻击。
certificate-authority-data
中的值来自kube-ca
的CA证书(非Rancher集群或使用授权集群端点的Rancher集群),或者是Rancher CA证书(任意Rancher集群)。
请务必在此字段中输入正确的值,否则kubectl不会验证与你的Kubernetes集群的连接。这就是为什么在设置Rancher时需要正确配置TLS。
理解节点和集群Agent通信
在任意Rancher连接的集群(包括导入的或其他方式)中,需要部署两个工作负载:
1、cattle-cluster-agent
Deployment
2、cattle-node-agent
Deployment
每个工作负载执行一个特定的功能。总之,这两个agent连接到Rancher的API并在tcp/443上建立安全的websocket连接。然后,该websocket连接会用于Rancher与托管的节点或集群之间的双向通信。
集群agent连接到托管集群的Kubernetes API,这使Rancher可以通过websocket隧道执行API操作。当执行集群操作时(如升级、ectd快照等),节点agent将与RKE集群中的节点进行交互。
这两个agent都使用称为“CA checksum
”的配置值,该配置值将作为环境变量以CATTLE\_CA\_CHECKSUM
的形式传递给Pod。该值需要与kubectl相同——确保连接到正确的端点并方式MITM的发生。但是,校验和的工作原理略有不同。
cattle agent的CA checksum可以厌憎agent是否连接到Rancher API的正确实例。由于Rancher使用TLS保护其HTTPS API端点,因此agent容器可以使用此校验和来验证API端点提供的TLS证书是否正确。
其次,CATTLE\_CA\_CHECKSUM
未配置为CA证书的base64编码副本。相反,Rancher会生成CA证书的sha256
校验和,该证书用于签署Rancher TLS证书,并将该值放入CATTLE\_CA\_CHECKSUM
字段中。结果如下:
CATTLE\_CA\_CHECKSUM=b0af09b35ef086fcfc21e990fbd750720abe5c811dbea3ae40fe050a67f0bdb0e
当一个Rancher集群或节点agent调用Rancher API,它会将CA证书与其在Deployment和DaemonSet中配置的那一个进行比较。如果它们匹配,通信则会建立起来。
安全传输层协议(TLS)终止(termination)
当安装Rancher时有以下4种主要方式来终止TLS:
使用Rancher的自签名证书
使用Let’s Encrypt
自带证书
外部TLS终止
每种方法都有特定的要求,需要在具体操作中进行权衡。
使用Rancher的自签名证书
在终止TLS的四个选项中,这个可能是最简单的。在HA和单节点安装方案中,这也是Rancher的默认选项。也就是说,通过不将任何TLS特定的参数传递给helm install
或docker run
,来进行安装。
安装后,Rancher会生成一个CA证书(CN=cattle-ca
),并且使用该证书为其自身证书签名。根据你执行的安装类型,自签名证书的工作方式会有所不同。
单节点安装
容器启动后,设置前,Rancher在443端口上响应任意HTTPS请求,无论其目标Host值如何。这是如何成为可能的呢?
在这一状态下,Rancher会为你到达的任何主机名自动生成一个证书。如果是一个IP(如10.11.12.13
),那么Rancher会为该IP生成一个自签名(使用cattle-ca
)证书。如果是以一个主机名(如my-rancher.example.org
)到达此新的Rancher安装目录,同样也会以相同的方式生成一个自签名证书。
在Rancher使用单个证书之前,你需要完成设置步骤(设置管理员密码并确认Rancher主机名)。该证书对于在Rancher初始设置期间配置的主机名有效。
HA安装
在HA安装场景下,自签名证书需要你安装一个名为cert-manager
的应用程序。与单节点Rancher管理CA证书本身不同,HA rancher使用cert-manager
来处理证书的生命周期。你可以根据以下指引将cert-manager安装到你准备好的Kubernetes集群中:
https://rancher.com/docs/rancher/v2.x/en/installation/k8s-install/helm-rancher/
一旦你完成cert-manager的安装,下一步是安装rancher。使用自签名证书是Rancher的默认设置,所以执行helm install时实际上只有一个强制性参数:
--set hostname=<YOUR.DNS.NAME>
该参数是强制性的,因为Rancher HA安装不具有与单节点安装相同的即时证书生成功能。因此,一旦你设置了主机名,该主机名将用于Rancher安装的整个生命周期。所以你必须确保你的设置是正确的。
然后cert-manager将会生成一个证书,该证书作为一个secret存储在cattle-system
命名空间中,名为tls-rancher-ingress
。
本文就到此结束啦,本系列的第二篇文章将会为大家介绍其他类型的TLS终止选项。
TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?的更多相关文章
- 如何在Apache HttpClient中设置TLS版本
1.简介 Apache HttpClient是一个底层.轻量级的客户端HTTP库,用于与HTTP服务器进行通信. 在本教程中,我们将学习如何在使用HttpClient时配置支持的传输层安全(TLS)版 ...
- 【初学者指南】在ASP.NET MVC 5中创建GridView
介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...
- 如何在ASP.NET Core中实现CORS跨域
注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...
- 如何在ASP.NET Core中实现一个基础的身份认证
注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ...
- 如何在ASP.NET Core中应用Entity Framework
注:本文提到的代码示例下载地址> How to using Entity Framework DB first in ASP.NET Core 如何在ASP.NET Core中应用Entity ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- [转]如何在ASP.NET Core中实现一个基础的身份认证
本文转自:http://www.cnblogs.com/onecodeonescript/p/6015512.html 注:本文提到的代码示例下载地址> How to achieve a bas ...
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
随机推荐
- 如何在Linux上创建,列出和删除Docker容器
本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...
- $Noip2013/Luogu1970$ 花匠 $dp$+思维
$Luogu$ $Sol$ 和$Poj1037\ A\ Decorative\ Fence$好像吖. $f[i][0/1]$表示前$i$个数,且选了第$i$个数,这个数相对于上一个数是下降(上升)的, ...
- JAVA的引用类型
一.强引用 JAVA默认的引用类型,强引用,是在我们的开发工作当中普遍存在的.如果一个对象具有强引用,当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收它来释放内存.但是我们可以将对象 ...
- 洛谷P1020 导弹拦截 题解 LIS扩展题 Dilworth定理
题目链接:https://www.luogu.com.cn/problem/P1020 题目大意: 给你一串数,求: 这串数的最长不上升子序列的长度: 最少划分成多少个子序列是的这些子序列都是不上升子 ...
- 洛谷P5664 Emiya 家今天的饭 题解 动态规划
首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...
- Python 处理Excel内的数据(案例介绍*2)
(一)案例一介绍 现在有一匹电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每个子品类当日销售量(品 ...
- 我该如何学习spring源码以及解析bean定义的注册
如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...
- 浅析PHP类的自动加载和命名空间
php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...
- 哪些工具可以提升PHP开发效率
本文就我自己在开发过程中的一点经验,谈谈如何利用工具来提升开发工作的编码效率, IDE(phpstorm 收费) 一个好的IDE真的可以给开发人员节省大量的时间,我从最开始使用editplus 到su ...
- JS中Cookie、localStorage、sessionStorage三者的区别
cookie:大小4k,一般由服务器生成,可设置失效时间,关闭浏览器后失效,与服务器通信时:每次都会携带HTTP头中,如果使用cookie保存过多数据会带来性能问题 localhostStorage: ...