如何拒绝kubernetes中的docker注册表?

时间:2019-01-31 14:48:22

标签: docker kubernetes

除了我自己的之外,我想拒绝所有泊坞窗注册表。我正在寻找有关docker注册表及其映像的政策。

例如,我的注册表名称是registry.my.com。我想让kubernetes仅从registry.my.com提取/运行图像,所以:

image: prometheus:2.6.1

或任何其他应被拒绝,而:

image: registry.my.com/prometheus:2.6.1

不应该。

有办法吗?

2 个答案:

答案 0 :(得分:2)

Admission Controllers是您要寻找的。

准入控制器拦截操作以验证api服务器提交操作之前应该发生的情况。

一个实例是ImagePolicyWebhook,承认控制器来验证截距图像操作是否应该被允许还是被拒绝。

它将使用有效负载调用REST端点,例如:

{  
  "apiVersion":"imagepolicy.k8s.io/v1alpha1",
  "kind":"ImageReview",
  "spec":{  
    "containers":[  
      {  
        "image":"myrepo/myimage:v1"
      },
      {  
        "image":"myrepo/myimage@sha256:beb6bd6a68f114c1dc2ea4b28db81bdf91de202a9014972bec5e4d9171d90ed"
      }
    ],
    "annotations":[  
      "mycluster.image-policy.k8s.io/ticket-1234": "break-glass"
    ],
    "namespace":"mynamespace"
  }
}

和带有允许的API答案:

{
  "apiVersion": "imagepolicy.k8s.io/v1alpha1",
  "kind": "ImageReview",
  "status": {
    "allowed": true
  }
}

拒绝

{
  "apiVersion": "imagepolicy.k8s.io/v1alpha1",
  "kind": "ImageReview",
  "status": {
    "allowed": false,
    "reason": "image currently blacklisted"
  }
}

在端点可能是一个lambda函数或集群中运行的容器。

此GitHub库github.com/flavio/kube-image-bouncer实现使用ImagePolicyWebhook拒绝容器使用标签 “最新” 的样品。

还有使用该标志的选项的 registry-whitelist 在启动时到通过逗号分隔允许登记的列表,这将是由ValidatingAdmissionWebhook来验证使用如果注册表被列入白名单。

另一种方法是在项目Open Policy Agent [OPA]。

OPA是一种灵活的引擎,用于根据规则创建策略以匹配资源并根据这些表达式的结果进行决策。这是一个变异和验证的Webhook,由上述的准入控制器调用以匹配Kubernetes API服务器的请求。总而言之,该操作将与上述操作类似,唯一的区别是规则是作为配置而不是代码编写的。上面重写器以使用OPA的同一示例将与此类似:

package admission

import data.k8s.matches

deny[{
    "id": "container-image-whitelist",  # identifies type of violation
    "resource": {
        "kind": "pods",                 # identifies kind of resource
        "namespace": namespace,         # identifies namespace of resource
        "name": name                    # identifies name of resource
    },
    "resolution": {"message": msg},     # provides human-readable message to display
}] {
    matches[["pods", namespace, name, matched_pod]]
    container = matched_pod.spec.containers[_]
    not re_match("^registry.acmecorp.com/.+$", container.image) # The actual validation
    msg := sprintf("invalid container registry image %q", [container.image])
}

以上内容翻译为:拒绝容器映像与以下注册表registry.acmecorp.com

不匹配的任何Pod

答案 1 :(得分:1)

当前,您无法使用一个命令启用或禁用某些功能,但是可以使用准入控制器。

如果您在Redhat平台上并且仅在RHEL上运行docker或kubernetes节点,并且以RHEL docker作为容器运行时,则可以在此处将注册表白名单。

  

将Docker注册表白名单

     

您可以指定Docker注册表的白名单,从而可以   策划一组可供下载的图像和模板   由OpenShift Container Platform用户使用。此策展台可以放置   在一个或多个Docker注册表中,然后添加到白名单中。   使用白名单时,仅可访问指定的注册表   在OpenShift容器平台中,所有其他注册表都在   默认情况下拒绝访问。

     

要配置白名单:

     

编辑/etc/sysconfig/docker文件以阻止所有注册表:

BLOCK_REGISTRY='--block-registry=all'
     

您可能需要取消注释BLOCK_REGISTRY行。

     

在同一文件中,添加要允许其访问的注册表:

ADD_REGISTRY='--add-registry=<registry1> --add-registry=<registry2>'
Allowing Access to Registries
ADD_REGISTRY='--add-registry=registry.access.redhat.com'

还有一个github项目:

https://github.com/flavio/kube-image-bouncer

您可以用来将注册表白名单。我认为注册表白名单已经在其中实现了,只需要在运行二进制文件时为其提供列表即可。