我有一个 HTTP 服务器在 K8s 环境的 pod 中运行。服务器公开 4 个端点。现在我想要的是,如果用户使用端口转发来访问本地主机上的端点,则限制这 4 个 API 之一。本质上,我不让任何人(“kubeclt”用户)通过端口转发访问某个端点。
我正在考虑在代码中实现一个中间件,它会根据 URL 拦截并拒绝对该 ndpoint 的调用,但当有人直接
kubectl exec
进入 pod 并直接使用我不想要的 curl 时,它也会阻止所有调用。 (我们能否确定用户是否从 pod 内部进行了端口转发?)
我想知道是否有办法可以做到这一点? 任何建议都会被采纳。谢谢!
使用 Kubernetes 内置的 RBAC(Role Based Access Control)可以实现端口转发控制。您可以首先授予或撤销用户的访问权限,以便能够使用端口转发。
下面是一个示例,它授予此类访问权限并且可以删除:
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: my-namespace
name: port-forward-access
rules:
- apiGroups: [""]
resources: ["pods/portforward"]
verbs: ["create"]
参见:https://github.com/kubernetes/kubernetes/issues/110999
限制这 4 个 API 之一
但是,当您要求“限制这 4 个 API 之一”时,我必须说这是公开这些端点的应用程序,应在应用程序端将其配置为仅允许部分流量,例如仅允许本地主机。我建议不要尝试使用 Kubernetes 来实现这一目标,从而使事情变得复杂。 需要记住的一个关键事项是,pod 被认为是 Kubernetes 对象模型中的最小单元。所以完成里面操作的东西,只暴露可以暴露的东西。
此外,如果无法从您所说的 HTTP 服务器内实现,请考虑将服务网格或 sidecar 容器作为实际应用程序的网关。
和您的 安全上下文控制,这可能会有所帮助。 使用
RBAC(基于角色的访问控制)您可以控制谁应该访问哪个资源,没有足够权限的用户即使是集群管理员也无法访问或编辑您的资源。 以下是配置 RBAC 的清单示例,取自
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: role-grantor
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["rolebindings"]
verbs: ["create"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["clusterroles"]
verbs: ["bind"]
# omit resourceNames to allow binding any ClusterRole
resourceNames: ["admin","edit","view"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: role-grantor-binding
namespace: user-1-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: role-grantor
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: user-1
如果您想在 pod 安全上下文中添加额外的安全限制层,您可以使用
AppArmor
来限制程序进行更改,并使用
readOnlyRootFilesystem
选项来限制从 pod 内更改配置文件的访问。这些将帮助您防止攻击者使用 Pod 中部署的程序修改您的配置。以下是在 kubernetes 中设置安全上下文的清单示例,取自官方文档。
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox:1.28
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
readOnlyRootFilesystem: true