1.2. 保护路由


您可以使用 HTTP 严格传输安全性(HSTS)保护路由。

1.2.1. HTTP 严格传输安全性

HTTP 严格传输安全性 (HSTS) 策略是一种安全增强,向浏览器客户端发送信号,表示路由主机上仅允许 HTTPS 流量。HSTS 也通过信号 HTTPS 传输来优化 Web 流量,无需使用 HTTP 重定向。HSTS 对于加快与网站的交互非常有用。

强制 HSTS 策略时,HSTS 会向站点的 HTTP 和 HTTPS 响应添加 Strict Transport Security 标头。您可以在路由中使用 insecureEdgeTerminationPolicy 值,以将 HTTP 重定向到 HTTPS。强制 HSTS 时,客户端会在发送请求前将所有请求从 HTTP URL 更改为 HTTPS,无需重定向。

集群管理员可将 HSTS 配置为执行以下操作:

  • 根据每个路由启用 HSTS
  • 根据每个路由禁用 HSTS
  • 对一组域强制每个域的 HSTS,或者结合使用命名空间标签与域
重要

HSTS 仅适用于安全路由,可以是 edge-terminated 或 re-encrypt。其配置在 HTTP 或传递路由上无效。

HTTP 严格传输安全 (HSTS) 实施在 HAProxy 模板中,并应用到具有 haproxy.router.openshift.io/hsts_header 注解的边缘和重新加密路由。

先决条件

  • 您可以使用具有项目的管理员特权的用户登陆到集群。
  • 已安装 OpenShift CLI(oc)。

流程

  • 要在路由上启用 HSTS,请将 haproxy.router.openshift.io/hsts_header 值添加到 edge-terminated 或 re-encrypt 路由中。您可以运行以下命令来使用 oc annotate 工具来实现此目的:

    $ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;\ 
    1
    
    includeSubDomains;preload"
    Copy to Clipboard Toggle word wrap
    1
    在本例中,最长期限设置为 31536000 ms,大约为 8.5 小时。
    注意

    在这个示例中,等号 (=) 包括在引号里。这是正确执行注解命令所必需的。

    配置了注解的路由示例

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      annotations:
        haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload 
    1
     
    2
     
    3
    
    ...
    spec:
      host: def.abc.com
      tls:
        termination: "reencrypt"
        ...
      wildcardPolicy: "Subdomain"
    Copy to Clipboard Toggle word wrap

    1
    必需。Max-age 测量 HSTS 策略生效的时间长度,以秒为单位。如果设置为 0,它将对策略进行求反。
    2
    可选。包含时,includeSubDomains 告知客户端主机的所有子域都必须与主机具有相同的 HSTS 策略。
    3
    可选。当 max-age 大于 0 时,您可以在 haproxy.router.openshift.io/hsts_header 中添加 preload,以允许外部服务将这个站点包括在 HSTS 预加载列表中。例如,Google 等站点可以构造设有 preload 的站点的列表。浏览器可以使用这些列表来确定哪些站点可以通过 HTTPS 通信,即使它们与站点交互之前也是如此。如果没有设置 preload,浏览器必须已经通过 HTTPS 与站点交互(至少一次)才能获取标头。

要禁用 HTTP 严格传输安全性 (HSTS),您可以将路由注解中的 max-age 值设置为 0

先决条件

  • 您可以使用具有项目的管理员特权的用户登陆到集群。
  • 已安装 OpenShift CLI(oc)。

流程

  • 要禁用 HSTS,请输入以下命令将路由注解中的 max-age 值设置为 0

    $ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
    Copy to Clipboard Toggle word wrap
    提示

    您还可以应用以下 YAML 来创建配置映射:

    根据每个路由禁用 HSTS 的示例

    metadata:
      annotations:
        haproxy.router.openshift.io/hsts_header: max-age=0
    Copy to Clipboard Toggle word wrap

  • 要为命名空间中的所有路由禁用 HSTS,请输入以下命令:

    $ oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
    Copy to Clipboard Toggle word wrap

验证

  1. 要查询所有路由的注解,请输入以下命令:

    $ oc get route  --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
    Copy to Clipboard Toggle word wrap

    输出示例

    Name: routename HSTS: max-age=0
    Copy to Clipboard Toggle word wrap

1.2.1.3. 强制每个域 HTTP 严格传输安全性

要为安全路由强制实施 HTTP Strict Transport Security (HSTS),在 Ingress spec 中添加 requiredHSTSPolicies 记录来捕获 HSTS 策略的配置。

如果您将 requiredHSTSPolicy 配置为强制 HSTS,则任何新创建的路由都必须配置有兼容的 HSTS 策略注解。

注意

要使用不合规的 HSTS 路由处理升级的集群,您可以在源更新清单并应用更新。

注意

您无法使用 oc expose routeoc create route 命令在强制 HSTS 的域中添加路由,因为这些命令的 API 不接受注解。

重要

HSTS 无法应用到不安全或非 TLS 路由,即使 HSTS 全局请求了 HSTS。

先决条件

  • 您可以使用具有项目的管理员特权的用户登陆到集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令来编辑 Ingress 配置 YAML,并根据需要更新字段:

    $ oc edit ingresses.config.openshift.io/cluster
    Copy to Clipboard Toggle word wrap

    HSTS 策略示例

    apiVersion: config.openshift.io/v1
    kind: Ingress
    metadata:
      name: cluster
    spec:
      domain: 'hello-openshift-default.apps.username.devcluster.openshift.com'
      requiredHSTSPolicies: 
    1
    
      - domainPatterns: 
    2
    
        - '*hello-openshift-default.apps.username.devcluster.openshift.com'
        - '*hello-openshift-default2.apps.username.devcluster.openshift.com'
        namespaceSelector: 
    3
    
          matchLabels:
            myPolicy: strict
        maxAge: 
    4
    
          smallestMaxAge: 1
          largestMaxAge: 31536000
        preloadPolicy: RequirePreload 
    5
    
        includeSubDomainsPolicy: RequireIncludeSubDomains 
    6
    
      - domainPatterns:
        - 'abc.example.com'
        - '*xyz.example.com'
        namespaceSelector:
          matchLabels: {}
        maxAge: {}
        preloadPolicy: NoOpinion
        includeSubDomainsPolicy: RequireNoIncludeSubDomains
    Copy to Clipboard Toggle word wrap

    1
    必需。requiredHSTSPolicies 会被按顺序验证,并应用第一个匹配的 domainPatterns
    2
    必需。您必须至少指定一个 domainPatterns 主机名。可以列出任意数量的域。您可以为不同的 domainPatterns 包括多个强制选项部分。
    3
    可选。如果包含 namespaceSelector,它必须与路由所在项目的标签匹配,以便在路由上强制执行设定 HSTS 策略。仅与 namespaceSelector 而不是 domainPatterns 匹配的路由不会被验证。
    4
    必需。Max-age 测量 HSTS 策略生效的时间长度,以秒为单位。此策略设置允许强制实施最小和最大的 max-age
    • largestMaxAge 值必须在 02147483647 之间。它可以不指定,这意味着不强制实施上限。
    • smallestMaxAge 值必须在 02147483647 之间。输入 0 来禁用 HSTS 以进行故障排除,或者如果您不需要禁用 HSTS,输入 1。它可以不知道,这意味着不强制实施较低限制。
    5
    可选。在 haproxy.router.openshift.io/hsts_header 中包含 preload 会使外部服务将此站点包括在 HSTS 预加载列表中。浏览器可以使用这些列表来决定哪些站点可通过 HTTPS 进行通信,然后再与站点交互。如果没有设置 preload,浏览器需要至少与站点交互一次,才能获取该标头。可使用以下方法之一设置 preload
    • RequirePreloadRequiredHSTSPolicy 需要 preload
    • RequireNoPreload:preloadRequiredHSTSPolicy 禁止。
    • NoOpinionpreloadRequiredHSTSPolicy 没有关系。
    6
    可选。includeSubDomainsPolicy 可使用以下之一设置:
    • RequireIncludeSubDomains: RequiredHSTSPolicy 需要 includeSubDomains
    • RequireNoIncludeSubDomains: includeSubDomainsRequiredHSTSPolicy 禁止。
    • NoOpinion : includeSubDomainsRequiredHSTSPolicy 没有关系。
  2. 您可以通过输入 oc annotate command,将 HSTS 应用到集群或特定命名空间中的所有路由。

    • 要将 HSTS 应用到集群中的所有路由,请输入 oc annotate command。例如:

      $ oc annotate route --all --all-namespaces --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"
      Copy to Clipboard Toggle word wrap
    • 要将 HSTS 应用到特定命名空间中的所有路由,请输入 oc annotate command。例如:

      $ oc annotate route --all -n my-namespace --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"
      Copy to Clipboard Toggle word wrap

验证

您可以查看您配置的 HSTS 策略。例如:

  • 要查看所需的 HSTS 策略的 maxAge 设置,请输入以下命令:

    $ oc get clusteroperator/ingress -n openshift-ingress-operator -o jsonpath='{range .spec.requiredHSTSPolicies[*]}{.spec.requiredHSTSPolicies.maxAgePolicy.largestMaxAge}{"\n"}{end}'
    Copy to Clipboard Toggle word wrap
  • 要查看所有路由上的 HSTS 注解,请输入以下命令:

    $ oc get route  --all-namespaces -o go-template='{{range .items}}{{if .metadata.annotations}}{{$a := index .metadata.annotations "haproxy.router.openshift.io/hsts_header"}}{{$n := .metadata.name}}{{with $a}}Name: {{$n}} HSTS: {{$a}}{{"\n"}}{{else}}{{""}}{{end}}{{end}}{{end}}'
    Copy to Clipboard Toggle word wrap

    输出示例

    Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomains
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat