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> =
openshift
或kubernetes
,具体取决于请求的目标是位于/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
要拒绝将原本包含在一组允许的客户端中的客户端,请结合使用 deniedClients
和 requiredClients
值。以下示例允许除 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}'
当客户端的用户代理与配置不匹配时,会出现错误。要确保变异请求匹配,强制白名单。规则映射到特定的操作动词,因此您可以在允许非处理请求时对请求进行攻击。