【问题标题】:Limit access of services deployed in Kubernetes namespace限制部署在 Kubernetes 命名空间中的服务的访问
【发布时间】:2022-01-25 19:12:44
【问题描述】:

假设我们是 Kubernetes 集群的所有者,并且我们为组织中的其他用户授予对各个命名空间的访问权限,因此他们不应该知道其他命名空间中发生了什么。

如果用户 A 将某个资源(如 Grafana-Prometheus 监控堆栈)部署到命名空间 A,我们如何确保他无法通过监控堆栈看到来自命名空间 B 的任何内容,而他不应该有任何访问权限。

当然,无论如何我们都必须限制用户 A 的权限,但是我们如何自动限制它在命名空间 A 中部署的资源的权限呢?如果您对一些 Kubernetes 配置示例有任何建议,那就太好了。

【问题讨论】:

    标签: kubernetes yaml namespaces rbac user-roles


    【解决方案1】:

    这个问题最重要的方面是控制将在 Pod 中使用的服务帐户的访问权限以及限制命名空间内流量的网络策略。

    因此我们得出了这个算法:

    先决条件: 创建用户和命名空间

    sudo useradd user-a
    kubectl create ns ns-user-a
    
    1. 限制 user-a 对命名空间 ns-user-a 的访问权限。
    kubectl create clusterrole permission-users --verb=* --resource=*
    kubectl create rolebinding permission-users-a --clusterrole=permission-users --user=user-a --namespace=ns-user-a
    
    1. 限制命名空间ns-user-a的所有服务账户访问权限。
    kubectl create clusterrole permission-serviceaccounts --verb=* --resource=*
    kubectl create rolebinding permission-serviceaccounts --clusterrole=permission-serviceaccounts --namespace=ns-user-a --group=system:serviceaccounts:ns-user-a
    kubectl auth can-i create pods  --namespace=ns-user-a --as-group=system:serviceaccounts:ns-user-a --as sa
    
    1. 命名空间 ns-user-a 中的网络策略,用于限制来自其他命名空间的传入流量。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-from-other-namespaces
      namespace: ns-user-a
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - from:
        - podSelector: {}
    

    编辑:允许来自选择性命名空间的流量

    使用自定义标签为监控命名空间分配标签。

    kubectl label ns monitoring nsname=monitoring
    

    或者,使用以下 kubernetes 保留的标签,以确保没有人可以编辑或更新此标签。所以按照惯例,这个标签应该将“monitoring”作为“monitoring”命名空间的赋值。

    https://kubernetes.io/docs/reference/labels-annotations-taints/#kubernetes-io-metadata-name

    kubernetes.io/metadata.name
    
    

    应用网络策略以允许来自内部和监控命名空间的流量。

    注意:网络策略总是累加的。因此,您可以保留两者,也可以只保留新的。出于示例目的,我将两者都保留在这里。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-only-monitoring-and-inernal
      namespace: ns-user-a
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - from:
        - podSelector: {}    # allows traffic from ns-user-a namespace (same as earlier)
        - namespaceSelector: # allows traffic from monitoring namespace
            matchLabels:
              kubernetes.io/metadata.name: monitoring
    

    【讨论】:

    • 非常感谢您的回答。你有一些我可以在这里尝试使用的代码 sn-ps 吗?
    • @tobias 添加了一些示例。
    • 谢谢 Rajesh,你能否告诉我如何将传入流量限制到其他几个命名空间,所以我们先验地阻止它,但少数命名空间允许传入流量,如监控命名空间。那太棒了。
    • @tobias 添加了请求的示例。检查->“编辑:允许来自选择性命名空间的流量”
    • 谢谢 Rajesh,还有一个问题。万一某个恶毒的家伙来了,他的命名空间使用了监控标签,他不也可以访问命名空间 ns-user-a 的资源吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2018-12-11
    相关资源
    最近更新 更多