在 K8s 环境中使用端口转发时限制对 localhost 的访问

问题描述 投票:0回答:2

我有一个 HTTP 服务器在 K8s 环境的 pod 中运行。服务器公开 4 个端点。现在我想要的是,如果用户使用端口转发来访问本地主机上的端点,则限制这 4 个 API 之一。本质上,我不让任何人(“kubeclt”用户)通过端口转发访问某个端点。

我正在考虑在代码中实现一个中间件,它会根据 URL 拦截并拒绝对该 ndpoint 的调用,但当有人直接

kubectl exec
进入 pod 并直接使用我不想要的 curl 时,它也会阻止所有调用。 (我们能否确定用户是否从 pod 内部进行了端口转发?

我想知道是否有办法可以做到这一点? 任何建议都会被采纳。谢谢!

kubernetes server portforwarding
2个回答
0
投票

使用 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 容器作为实际应用程序的网关。


0
投票
RBAC

和您的 安全上下文控制,这可能会有所帮助。 使用

RBAC(基于角色的访问控制)您可以控制谁应该访问哪个资源,没有足够权限的用户即使是集群管理员也无法访问或编辑您的资源。 以下是配置 RBAC 的清单示例,取自

kubernetes 官方文档

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
    
© www.soinside.com 2019 - 2024. All rights reserved.