限制部署在 Kubernetes 命名空间中的服务的访问

Limit access of services deployed in Kubernetes namespace

假设我们是 Kubernetes 集群的所有者,并且我们允许组织中的其他用户访问各个命名空间,因此他们不应该知道其他命名空间中发生的事情。

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

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

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

因此我们得出这个算法:

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

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