基于 Traefik 的激进 TLS 安全配置实践

news2024/11/18 9:30:03

前言

Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易。

Traefik可以与现有的多种基础设施组件(Docker、Swarm模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地配置自己。

今天我们基于 Traefik on K8S 来详细说明如何对 TLS 安全进行「激进」配置。

环境基本信息

  1. K8S 集群;
  2. 域名:ewhisper.cn(由 DNSPod 进行 DNS 管理,已指向 K8S 集群的 Traefik Ingress 的 LoadBalancer 公网地址)
  3. 使用 cert-manager 自动管理的证书 *.ewhisper.cn 作为 Traefik 的默认证书;cert-manager 位于 cert-manager NameSpace 下
  4. Traefik 2.4.8 安装于 K8S 集群的 kube-system NameSpace 下,且使用 CRDs 进行配置。

「激进」的 TLS 配置

全站受信证书 + HTTPS。具体如下:

  1. 全站 HTTPS 443 端口配置;
  2. 证书来自 Let's Encrypt(由 cert-manager 自动申请)(⚡激进,生产慎用!)
  3. 监听 HTTP 请求,并重定向到 HTTPS;(⚡激进,生产慎用!)
  4. 启用 HSTS 功能(⚡激进,生产慎用!)
  5. TLS 版本限定在 TLS 1.3(⚡激进,生产慎用!)

配置实践

TLS 版本限定在 TLS 1.3

使用 Traefik 的 CRD - TLSOption 配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: default
  namespace: kube-system

spec:
  minVersion: VersionTLS13

💡 说明

  • minVersion: VersionTLS13 指定 TLS 最小版本为 TLS 1.3.

⚠️ Warning:

以防万一,建议 namespace: kube-system 和 Traefik 所在的 ns 保持一致。

证书

使用 Traefik 的 CRD - TLSStore 配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: TLSStore
metadata:
  name: default
  namespace: cert-manager

spec:
  defaultCertificate:
    secretName: ewhisper-crt-secret

💡 说明

  • secretName: ewhisper-crt-secret 这个是 cert-manager 自动从 Let's Encrypt 申请到的证书的存放位置(cert-manager 会负责定期自动更新该证书)。Traefik 就使用该证书作为默认证书。

⚠️ Warning:

TLSStore,注意 namespace: cert-manager 必须要在 证书的 secret 所在的 NameSpace。

接下来 2 个功能:

  1. HTTP 重定向到 HTTPS
  2. 启用 HSTS

都是通过 Traefik CRD - Middleware 来进行配置的。

HTTP 重定向到 HTTPS

Traefik CRD Middleware - redirectshttps 配置如下:

# Redirect to https
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: redirectshttps
  namespace: kube-system
spec:
  redirectScheme:
    scheme: https
    permanent: true

💡 说明

  • redirectScheme: 协议重定向
  • scheme: https: HTTP 协议重定向为 HTTPS
  • permanent: true: 设置为 true 以应用永久重定向。

启用 HSTS

Traefik CRD Middleware - hsts-header 配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: hsts-header
  namespace: kube-system
spec:
  headers:
    customResponseHeaders:
      Strict-Transport-Security: 'max-age=63072000'
  • customResponseHeaders 应用于响应头的名称和值。
  • Strict-Transport-Security: 'max-age=63072000': 即 「HTTP严格传输安全」响应头,收到该响应头的浏览器会在 63072000s(约 2 年)的时间内,只要访问该网站,即使输入的是 http,浏览器会自动跳转到 https。(HSTS 是浏览器端的跳转,之前的「HTTP 重定向到 HTTPS」是服务器端的跳转)

具体域名配置

以上的所有配置,包括:

  1. TLS 版本限定在 TLS 1.3
  2. 证书
  3. HTTP 重定向到 HTTPS
  4. 启用 HSTS

都是全局的配置,接下来针对具体的域名 - 这里是 example.ewhisper.cn 进行配置。

使用 Traefik 的 CRD - IngressRoute 配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: example
  namespace: cert-manager
spec:
  entryPoints:
    - websecure
    - web
  routes:
    - match: Host(`example.ewhisper.cn`)
      kind: Rule
      middlewares:
        - name: hsts-header
          namespace: kube-system
        - name: redirectshttps
          namespace: kube-system
      services:
        - name: example
          namespace: default
          port: 8080
  tls: {}

💡 说明

  • entryPoints: EntryPoints 是进入 Traefik 的网络入口点。它们定义将接收数据包的端口,以及是否侦听 TCP 或 UDP。如下图所示:

    entryPoints 这里 entryPoints 是静态配置,是直接静态配置在 Traefik Deployment 中的,如下图: Traefik Deployment arg

    • entryPoint - traefik 地址端口是::9000/tcp
    • entryPoint - web 地址端口是::8000/tcp
    • entryPoint - websecure 地址端口是::8443/tcp,且 tls 为 true
    • 然后,再通过 Serivce Type: LoadBalancer 暴露到公网的: 80 和 443 端口(至于entryPoint - traefik 则还没有通过 SVC 暴露,所以即使配了 IngressRoute 也无法访问),如下: Traefik LoadBalancer SVC
  • websecure 即:example.ewhisper.cn 可以通过 https://example.ewhisper.cn:443 访问;

  • web 即:example.ewhisper.cn 可以通过 http://example.ewhisper.cn:80 访问;

  • kind: Rule Rule 是一组配置了值的匹配器(即 match),它决定一个特定的请求是否匹配特定的条件。如果规则经过验证,Route 就会成为活动的,调用中间件,然后将请求转发给服务。

  • match: Host(`example.ewhisper.cn`): 这里是检查请求域名(host 报头值)是否以给定域之一(即example.ewhisper.cn)为目标。

  • middlewares: 连接到 Route 的中间件是在请求被发送到你的服务之前(或者在服务的回答被发送到客户端之前)对请求进行调整的一种方法。 在trafik中有几种可用的中间件,一些可以修改请求、报头,一些负责重定向,一些添加身份验证,等等。 使用相同协议的中间件可以组合成链,以适应每个场景。中间件作用如下图所示:

    middlewares

  • name: hsts-header 启用 HSTS 的中间件(可以复用)

  • name: redirectshttps 启用 HTTP 重定向到 HTTPS 的中间件(可以复用)

  • services... 转发到 K8S default NameSpace 下的 example Service 的 8080 端口。

配置生效

假设以上配置都放在 ./traefik-sec 目录下,执行如下命令生效:

kubectl apply -f ./traefik-sec

验证

浏览器访问

直接浏览器访问 http://example.ewhisper.cn 域名,跳转到 http://example.ewhisper.cn, 并且证书已生效。

☝ HTTP 重定向到 HTTPS 已生效

通过 SSL Labs 验证

在 SSL Labs 的 SSL Server Test 下进行验证。验证结果如下:

A ☝ 评分为 A,且 HSTS 已启用

证书信息 ☝ 证书为 *.ewhisper.cn 合法证书

TLS 协议 ☝ TLS 协议只支持 TLS 1.3

🎉🎉🎉

参考资料

  • 使用 cert-manager 为 dnspod 的域名签发免费证书 | 作者 roc
  • Traefik 官方文档
  • Traefik2.3.x 使用大全(更新版) | 作者 阳明
  • Mozilla SSL Configuration Generator

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

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

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

相关文章

力扣(39.40)补9.20

目前打算刷些算法题&#xff0c;数据结构的题暂时放一放吧。 39.组合总和 不会&#xff0c;毕竟好久没做回溯了。 看了这个图会好理解很多呦。 class Solution { List<List<Integer>> ansnew ArrayList<>(); List<Integer> listnew ArrayList<>(…

AcWing算法学习之动态规划(基础)

背包问题 01背包问题 思路&#xff1a; 01背包问题&#xff0c;表示每个物品要么放&#xff0c;要么不放。从集合的角度分析DP问题&#xff0c;状态表示为&#xff1a;选择前i个物品&#xff0c;总体积小于等于j的选法的集合&#xff0c;属性f[i][j]表示价值的最大值。状态计算…

正交编码器数字滤波器(二)

正交编码器数字滤波器&#xff08;一&#xff09;电路初画完了&#xff0c;正交编码器数字滤波器&#xff08;二&#xff09;把核心部分用HDL描述语言实现了&#xff0c;放在一个小芯片里。 上面的整张图上&#xff0c;截出下面的小图&#xff0c;就用古老的ABEL工具实现它。 这…

高斯函数和C++简单实现

高斯函数在科学和工程中有广泛应用&#xff1b;其定义为&#xff0c; 其一般图像为&#xff0c; 高斯函数的图形在形状上像一个倒悬着的钟&#xff1b;参数a指高斯曲线的峰值&#xff0c;b为其对应的横坐标&#xff0c;c即标准差&#xff08;有时也叫高斯RMS宽值&#xff09;&a…

【1754. 构造字典序最大的合并字符串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你两个字符串 word1 和 word2 。你需要按下述方式构造一个新字符串 merge &#xff1a;如果 word1 或 word2 非空&#xff0c;选择 下面选项之一 继续操作&#xff1a; 如果 word1 非空&#xff0…

Python常用基础语法知识点大全

介绍 Python 是一门独特的语言&#xff0c;快速浏览一下他的要点&#xff1a; 面向对象&#xff1a;每一个变量都是一个类&#xff0c;有其自己的属性&#xff08;attribute&#xff09;与方法&#xff08;method&#xff09;。语法块&#xff1a;用缩进&#xff08;四个空格…

Qml 中用 Shader 实现圣诞树旋转灯

一、前言 2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 这次给大家带来一个简单漂亮圣诞树灯。 当然了&#xff0c;本篇文章主要是讲解一下如何在 Qml 中使用 GLSL 来实现自己的特效。 至于代码嘛&#xff0c;我比较喜欢在 Shaderjoy 上寻找&#xff0c;那里有很…

Biotin-PEG-Biotin,生物素-聚乙二醇-生物素聚乙二醇试剂供应

一&#xff1a;产品描述 1、名称 英文&#xff1a;Biotin-PEG-Biotin 中文&#xff1a;生物素-聚乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG 4、分子量&#xff1a;可定制&#xff0c;2000/10000/3400/1000/20000/500 5、质量控制&…

c++继承知识点

目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员如何定义一个不被继承的类7.继承的一个题目8. 复杂…

目标检测之YOLOv2算法分析

要点 Batch Normalization 训练 若batchsize64,某一层的某一个神经元会输出64个响应值&#xff0c;对这64个响应值求均值&#xff0c;标准差&#xff0c;然后标准化&#xff0c;对标准化的结果乘λβ\lambda \betaλβ,其中λ\lambdaλ和 β\betaβ是需要训练的参数&#xf…

Windows平台RTMP、RTSP播放器录像模块精细化控制

技术背景 上篇文章&#xff0c;我们介绍了Unity平台RTMP、RTSP播放器录像功能&#xff0c;这里&#xff0c;我们详细的介绍下&#xff0c;做个RTSP或RTMP拉流端录像模块有哪些需要考虑的技术点&#xff1f; 在我们常规的考量&#xff0c;RTMP或RTSP流录制&#xff0c;无非就是…

在gitee上新建仓库并上传文件

一、进入到自己gitee的个人主页&#xff0c;点击图示新建仓库 二、根据图示操作&#xff0c;最后点击创建 三、如果没有配置git全局设置&#xff0c;需要配置一下(配置过的可以跳过这一步) 四、打开你要上传的文件&#xff0c;在里面右击鼠标&#xff0c;点击如图所示 五、输入…

spring之Bean的循环依赖问题

文章目录一、Bean的循环依赖之Set注入模式下1、Husband类2、Wife类3、Spring配置文件4、测试类5、测试结果6、结论二、Bean的循环依赖之构造方法注入模式下1、Husband类2、Wife类3、Spring配置文件4、测试类5、运行结果三、Spring解决循环依赖的机理三级缓存&#xff08;面试常…

PyQt5 基本布局管理 及 信号槽机制

一&#xff1a;布局设计 & 信号槽机制 效果实现如下&#xff1a; 对于窗口整体设计左右布局 对于左边布局&#xff0c;包括有水平布局(用户信息 左上方一块)垂直布局(多个按钮 左下方一块) 对于右边布局&#xff0c;主要是窗口切换&#xff0c;通过按下左边布局的左下方侧按…

SQLAlchemy连接MySQL及记录的查询、更新、删除、多表关联查询

SQLAlchemy是Python的ORM库&#xff0c;支持多种数据库。 建立连接 连接MySQL要用到Engine&#xff0c;Engine集成了连接池pool和方言Dialect&#xff08;支持不通数据库的SQL语法&#xff09;&#xff0c;最后都统一成标准DBAPI。 from sqlalchemy import create_engine en…

TypeScript

现在说起TypeScript想必大家都不会陌生的&#xff0c;当初从碎片信息中了解TypeScript&#xff0c;我认为他的变量声明和Rust语言有几分相似&#xff0c;是一门比较严格的语言&#xff0c;今天正式的来学习他 JavaScript易学习&#xff0c;易用&#xff0c;以至于大多数人对于…

软件体系结构 思维导图

软件体系结构 思维导图 软件体系结构思维导图 源文件放在 GitHub 仓库 使用 Xmind 即可打开查看 课程评价 比较抽象和理论化&#xff0c;如果光看 PPT 肯定看不懂&#xff0c;得听课或者看视频 后面实验试图基于 SpringBoot 去实战教学&#xff0c;可惜没系统学过只能照搬…

Kafka Consumer开发

Kafka Consumer - 消费者 跟生产者一样&#xff0c;消费者也属于kafka的客户端&#xff0c;不过kafka消费者是从kafka读取数据的应用&#xff0c;侧重于读数据。一个或多个消费者订阅kafka集群中的topic&#xff0c;并从broker接收topic消息&#xff0c;从而进行业务处理。今天…

一种嵌入式项目的参数保存方案

设计背景 嵌入式项目中&#xff0c;为了保证系统的正常运转&#xff0c;通常需要保存一部分数据至非易失存储设备如flash中。此处提供了一种通用的方案用于快速在项目中集成参数保存功能&#xff0c;该方案有以下几点特征&#xff1a; 接口简便&#xff0c;方便快速集成以及使用…

东北大学2023分布式操作系统实验

1.实验目的 建立伪分布式&#xff08;有条件的可以建立分布式环境&#xff09;的Hadoop环境&#xff0c;并成功运行示例程序。 2.Hadoop简介 2.1 Hadoop项目基础结构 在其核心&#xff0c;Hadoop主要有两个层次&#xff0c;即&#xff1a; 加工/计算层(MapReduce)存储层(Ha…