13.7. 防止 CLI 版本与用户代理不匹配


OpenShift Container Platform 实施了一个用户代理,可用于防止应用程序开发人员的 CLI 访问 OpenShift Container Platform API。

OpenShift Container Platform CLI 的用户代理由 OpenShift Container Platform 中的一组值组成:

<command>/<version>+<git_commit> (<platform>/<architecture>) <client>/<git_commit>

例如,在以下情况下:

  • <command> = oc
  • <version> = 客户端版本。例如: v3.3.0。对位于 /api 的 Kubernetes API 发出的请求会接收 Kubernetes 版本,对位于 /oapi 的 OpenShift Container Platform API 发出的请求则会接收 OpenShift Container Platform 版本(如 oc version 所指定)
  • <platform> = linux
  • <architecture> = amd64
  • <client> = openshiftkubernetes,具体取决于请求的目标是位于 /api 的 Kubernetes API 还是位于 /oapi 的 OpenShift Container Platform API
  • <git_commit> = 客户端版本的 Git 提交(例如 f034127

用户代理将是:

oc/v3.3.0+f034127 (linux/amd64) openshift/f034127

您必须在 master 配置文件 /etc/origin/master/master-config.yaml 中配置用户代理。要应用配置,重启 API 服务器:

$ /usr/local/bin/master-restart api

作为 OpenShift Container Platform 管理员,您可以使用 master 配置中的 userAgentMatching 配置设置来防止客户端访问 API。因此,如果客户端使用特定的库或二进制代码,则阻止它们访问 API。

以下用户代理示例拒绝 Kubernetes 1.2 客户端二进制文件、OpenShift Origin 1.1.3 二进制文件,以及 POST 和 PUT httpVerbs

policyConfig:
  userAgentMatchingConfig:
    defaultRejectionMessage: "Your client is too old.  Go to https://example.org to update it."
    deniedClients:
    - regex: '\w+/v(?:(?:1\.1\.1)|(?:1\.0\.1)) \(.+/.+\) openshift/\w{7}'
    - regex: '\w+/v(?:1\.1\.3) \(.+/.+\) openshift/\w{7}'
      httpVerbs:
      - POST
      - PUT
    - regex: '\w+/v1\.2\.0 \(.+/.+\) kubernetes/\w{7}'
      httpVerbs:
      - POST
      - PUT
    requiredClients: null

管理员也可以拒绝与预期客户端不完全匹配的客户端:

policyConfig:
  userAgentMatchingConfig:
    defaultRejectionMessage: "Your client is too old.  Go to https://example.org to update it."
    deniedClients: []
    requiredClients:
    - regex: '\w+/v1\.1\.3 \(.+/.+\) openshift/\w{7}'
    - regex: '\w+/v1\.2\.0 \(.+/.+\) kubernetes/\w{7}'
      httpVerbs:
      - POST
      - PUT

要拒绝将原本包含在一组允许的客户端中的客户端,请结合使用 deniedClientsrequiredClients 值。以下示例允许除 1.13 之外的所有 1.X 客户端二进制文件:

policyConfig:
  userAgentMatchingConfig:
    defaultRejectionMessage: "Your client is too old.  Go to https://example.org to update it."
    deniedClients:
    - regex: '\w+/v1\.13.0\+\w{7} \(.+/.+\) openshift/\w{7}'
    - regex: '\w+/v1\.13.0\+\w{7} \(.+/.+\) kubernetes/\w{7}'
    requiredClients:
    - regex: '\w+/v1\.[1-9][1-9].[0-9]\+\w{7} \(.+/.+\) openshift/\w{7}'
    - regex: '\w+/v1\.[1-9][1-9].[0-9]\+\w{7} \(.+/.+\) kubernetes/\w{7}'
注意

当客户端的用户代理与配置不匹配时,会出现错误。要确保变异请求匹配,强制白名单。规则映射到特定的操作动词,因此您可以在允许非处理请求时对请求进行攻击。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.