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

本文涉及的产品
.cn 域名,1个 12个月
简介: 基于 Traefik 的激进 TLS 安全配置实践

前言

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
YAML

💡 说明

  • 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
YAML

💡 说明

  • 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
YAML

💡 说明

  • 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'
YAML
  • 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: {}
YAML

💡 说明

  • entryPoints: EntryPoints 是进入 Traefik 的网络入口点。它们定义将接收数据包的端口,以及是否侦听 TCP 或 UDP。如下图所示: 这里 entryPoints 是静态配置,是直接静态配置在 Traefik Deployment 中的,如下图:
  • entryPoint - traefik 地址端口是::9000/tcp
  • entryPoint - web 地址端口是::8000/tcp
  • entryPoint - websecure 地址端口是::8443/tcp,且 tls 为 true
  • 然后,再通过 Serivce Type: LoadBalancer 暴露到公网的: 80 和 443 端口(至于entryPoint - traefik 则还没有通过 SVC 暴露,所以即使配了 IngressRoute 也无法访问),如下:
  • 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 中有几种可用的中间件,一些可以修改请求、报头,一些负责重定向,一些添加身份验证,等等。 使用相同协议的中间件可以组合成链,以适应每个场景。中间件作用如下图所示:

  • name: hsts-header 启用 HSTS 的中间件(可以复用)
  • name: redirectshttps 启用 HTTP 重定向到 HTTPS 的中间件(可以复用)
  • services... 转发到 K8S default NameSpace 下的 example Service 的 8080 端口。

配置生效

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

kubectl apply -f ./traefik-sec
BASH

验证

浏览器访问

直接浏览器访问 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

🎉🎉🎉

参考资料

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
Ingress 开启 TLS / HTTPS 被忽略的细节
我们之前接入层用的SLB>Nginx ,考虑到Ingress和k8s的集成,我们用Ingress替代了Nginx,测试同学反馈在低版本浏览器上报错。
4980 0
|
4月前
|
存储 Kubernetes 安全
在k8S中,Kubernetes 准入机制是什么?
在k8S中,Kubernetes 准入机制是什么?
|
4月前
|
缓存 Kubernetes 应用服务中间件
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
33 3
|
6月前
|
Kubernetes 网络协议 Cloud Native
Kubernetes网络问题排查分享两则(1)——calico特定场景下的网络性能问题
在对Kubernetes项目[kosmos](https://github.com/kosmos-io/kosmos)与Calico网络性能进行对比测试时,发现kosmos在跨集群容器网络的性能显著优于Calico的集群内网络(约6Gbit/s对比2.9Gbit/s)。物理机网络测试达到9.38Gbit/s,显示Calico有68%的性能损耗。问题定位到网卡的checksum/offload参数,尝试用`ethtool`调整后虽短暂提升,但随后恢复原状。转载自:https://mp.weixin.qq.com/s/XsQZCSqZAXJK46zqc7IpLw
|
7月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes服务网络Ingress网络模型分析、安装和高级用法
Kubernetes服务网络Ingress网络模型分析、安装和高级用法
172 5
|
7月前
|
Kubernetes 应用服务中间件 nginx
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
123 0
|
7月前
|
安全 Linux 数据安全/隐私保护
Nomad 系列 -Nomad+Traefik+Tailscale 集成实现零信任安全
Nomad 系列 -Nomad+Traefik+Tailscale 集成实现零信任安全
|
7月前
|
Kubernetes 网络协议 Linux
Cilium 系列 -13- 启用 XDP 加速及 Cilium 性能调优总结
Cilium 系列 -13- 启用 XDP 加速及 Cilium 性能调优总结
|
Kubernetes 前端开发 API
Kubernetes 认证机制学习
# 引言 Kubernetes API Server 组件是 Kubernetes 具有网关性质的组件,它是 Kubernetes 集群资源操作的唯一入口,它通过 HTTP RESTful 的形式暴露服务,允许不同的用户、外部组件等访问它。我们使用 curl 命令去模拟访问 apisever 请求过程中,发生了什么。 ```bash iZj6ccqyhc7xduup9vl8mvZ :: ~ »
|
存储 Kubernetes 安全
一文搞懂基于 Kubescape 进行 Kubernetes 安全加固
Hello folks! 今天我们介绍一款开源容器平台安全扫描工具 - Kubescape。作为第一个用于测试 Kubernetes 集群是否遵循 NSA-CISA 和 MITREATT&CK 等多个框架安全部署规范的开源工具,Kubescape 在整容器编排生态中具有举足轻重的意义。在这篇文章中,我们将解析什么是 Kubernetes 加固以及如何基于 Kubescape 工具进行 Kubernetes 生态体系加固。
311 0