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 或传递路由上无效。
1.2.1.1. 根据每个路由启用 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;\ includeSubDomains;preload"
$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000;\1 includeSubDomains;preload"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 在本例中,最长期限设置为
31536000ms,大约为 8.5 小时。
注意在这个示例中,等号 (
=) 包括在引号里。这是正确执行注解命令所必需的。配置了注解的路由示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 与站点交互(至少一次)才能获取标头。
1.2.1.2. 根据每个路由禁用 HTTP 严格传输安全性 复制链接链接已复制到粘贴板!
要禁用 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"
$ oc annotate route <route_name> -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来创建配置映射:
根据每个路由禁用 HSTS 的示例
metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=0metadata: annotations: haproxy.router.openshift.io/hsts_header: max-age=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为命名空间中的所有路由禁用 HSTS,请输入以下命令:
oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"
$ oc annotate route --all -n <namespace> --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要查询所有路由的注解,请输入以下命令:
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}}'$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Name: routename HSTS: max-age=0
Name: routename HSTS: max-age=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2.1.3. 强制每个域 HTTP 严格传输安全性 复制链接链接已复制到粘贴板!
要为安全路由强制实施 HTTP Strict Transport Security (HSTS),在 Ingress spec 中添加 requiredHSTSPolicies 记录来捕获 HSTS 策略的配置。
如果您将 requiredHSTSPolicy 配置为强制 HSTS,则任何新创建的路由都必须配置有兼容的 HSTS 策略注解。
要使用不合规的 HSTS 路由处理升级的集群,您可以在源更新清单并应用更新。
您无法使用 oc expose route 或 oc create route 命令在强制 HSTS 的域中添加路由,因为这些命令的 API 不接受注解。
HSTS 无法应用到不安全或非 TLS 路由,即使 HSTS 全局请求了 HSTS。
先决条件
- 您可以使用具有项目的管理员特权的用户登陆到集群。
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令来编辑 Ingress 配置 YAML,并根据需要更新字段:
oc edit ingresses.config.openshift.io/cluster
$ oc edit ingresses.config.openshift.io/clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow HSTS 策略示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 必需。
requiredHSTSPolicies会被按顺序验证,并应用第一个匹配的domainPatterns。 - 2
- 必需。您必须至少指定一个
domainPatterns主机名。可以列出任意数量的域。您可以为不同的domainPatterns包括多个强制选项部分。 - 3
- 可选。如果包含
namespaceSelector,它必须与路由所在项目的标签匹配,以便在路由上强制执行设定 HSTS 策略。仅与namespaceSelector而不是domainPatterns匹配的路由不会被验证。 - 4
- 必需。
Max-age测量 HSTS 策略生效的时间长度,以秒为单位。此策略设置允许强制实施最小和最大的max-age。-
largestMaxAge值必须在0到2147483647之间。它可以不指定,这意味着不强制实施上限。 -
smallestMaxAge值必须在0到2147483647之间。输入0来禁用 HSTS 以进行故障排除,或者如果您不需要禁用 HSTS,输入1。它可以不知道,这意味着不强制实施较低限制。
-
- 5
- 可选。在
haproxy.router.openshift.io/hsts_header中包含preload会使外部服务将此站点包括在 HSTS 预加载列表中。浏览器可以使用这些列表来决定哪些站点可通过 HTTPS 进行通信,然后再与站点交互。如果没有设置preload,浏览器需要至少与站点交互一次,才能获取该标头。可使用以下方法之一设置preload:-
RequirePreload:RequiredHSTSPolicy需要preload。 -
RequireNoPreload:preload被RequiredHSTSPolicy禁止。 -
NoOpinion:preload与RequiredHSTSPolicy没有关系。
-
- 6
- 可选。
includeSubDomainsPolicy可使用以下之一设置:-
RequireIncludeSubDomains:RequiredHSTSPolicy需要includeSubDomains。 -
RequireNoIncludeSubDomains:includeSubDomains被RequiredHSTSPolicy禁止。 -
NoOpinion:includeSubDomains与RequiredHSTSPolicy没有关系。
-
您可以通过输入
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"
$ oc annotate route --all --all-namespaces --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将 HSTS 应用到特定命名空间中的所有路由,请输入
oc annotate command。例如:oc annotate route --all -n my-namespace --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"
$ oc annotate route --all -n my-namespace --overwrite=true "haproxy.router.openshift.io/hsts_header"="max-age=31536000"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
您可以查看您配置的 HSTS 策略。例如:
要查看所需的 HSTS 策略的
maxAge设置,请输入以下命令:oc get clusteroperator/ingress -n openshift-ingress-operator -o jsonpath='{range .spec.requiredHSTSPolicies[*]}{.spec.requiredHSTSPolicies.maxAgePolicy.largestMaxAge}{"\n"}{end}'$ oc get clusteroperator/ingress -n openshift-ingress-operator -o jsonpath='{range .spec.requiredHSTSPolicies[*]}{.spec.requiredHSTSPolicies.maxAgePolicy.largestMaxAge}{"\n"}{end}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要查看所有路由上的 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}}'$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomains
Name: <_routename_> HSTS: max-age=31536000;preload;includeSubDomainsCopy to Clipboard Copied! Toggle word wrap Toggle overflow