限制部署在 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
- 限制 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
- 限制命名空间 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
- 命名空间 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
假设我们是 Kubernetes 集群的所有者,并且我们允许组织中的其他用户访问各个命名空间,因此他们不应该知道其他命名空间中发生的事情。
如果用户 A 将某个资源(如 Grafana-Prometheus 监控堆栈)部署到名称空间 A,我们如何确保他无法通过监控堆栈看到名称空间 B 中的任何内容,他不应访问该名称空间。
当然,无论如何我们都要限制用户A的权限,但是我们如何自动限制其在命名空间A中部署的资源的权限呢?如果您对一些 Kubernetes 配置示例有任何建议,那就太好了。
这个问题最重要的方面是控制将在 Pods 中使用的服务帐户的访问权限和限制命名空间内流量的网络策略。
因此我们得出这个算法:
先决条件: 创建用户和命名空间
sudo useradd user-a
kubectl create ns ns-user-a
- 限制 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
- 限制命名空间 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
- 命名空间 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