【问题标题】:How allow pod from default namespace, read secret from other namespace [duplicate]如何允许来自默认命名空间的 pod,从其他命名空间读取秘密 [重复]
【发布时间】:2022-10-07 13:36:25
【问题描述】:

在 Azure Kubernetes 中,我希望在默认命名空间中有一个带有 jenkins 的 pod,它需要从我的应用程序工作区中读取机密。

当我尝试时,我得到下一个错误:

Error from server (Forbidden): secrets \"myapp-mongodb\" is forbidden: User \"system:serviceaccount:default:jenkinspod\" cannot get resource \"secrets\" in API group \"\" in the namespace \"myapp\"

我如何能够访问这个 jenkins pod 以读取 \'myapp\' 命名空间中的秘密

  • 分配给 pod 的服务帐户的角色是什么?

标签: kubernetes azure-aks kubernetes-secrets


【解决方案1】:

secret 是一个命名空间资源,可以通过适当的 rbac 权限访问。但是,任何不当的 rbac 权限都可能导致泄漏。

您必须 role bind pod 的关联服务帐户。这是一个完整的例子。在此示例中,我为角色绑定创建了一个新服务帐户。但是,您可以根据需要使用默认的 service account

第 1 步:创建一个名为 demo-namespace 的命名空间

kubectl create ns demo-namespace

第二步:在demo-namespace 中创建一个秘密:

kubectl create  secret generic  other-secret -n demo-namespace  --from-literal foo=bar
secret/other-secret created

第 2 步:在 default 命名空间中创建一个服务帐户(my-custom-sa)。

kubectl create sa my-custom-sa

第 3 步:验证默认情况下,您在上一步中创建的服务帐户无权访问 demo-namespace 中存在的机密。

kubectl auth can-i get secret -n demo-namespace --as system:serviceaccount:default:my-custom-sa
no

第 4 步:从 demo-namespace 命名空间创建具有 getlist 机密权限的集群角色。

kubectl create clusterrole role-for-other-user --verb get,list --resource secret
clusterrole.rbac.authorization.k8s.io/role-for-other-user created

step-5:创建一个rolebinding来绑定上一步创建的集群角色。

 kubectl create  rolebinding role-for-other-user -n demo-namespace --serviceaccount default:my-custom-sa --clusterrole  role-for-other-user
 rolebinding.rbac.authorization.k8s.io/role-for-other-user created

第 6 步:验证默认 ns 中的服务帐户现在是否可以访问 demo-namespace 的机密。 (注意与步骤 3 的区别)

kubectl auth can-i get secret -n demo-namespace --as system:serviceaccount:default:my-custom-sa
yes

step-7:在默认命名空间中创建一个 pod 并挂载您之前创建的服务帐户。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-pod
  name: my-pod
spec:
  serviceAccountName: my-custom-sa
  containers:
  - command:
    - sleep
    - infinity
    image: bitnami/kubectl
    name: my-pod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

第 7 步:验证您是否可以从默认命名空间中的 pod 中读取 demo-namespace 的秘密。

 curl -sSk -H "Authorization: Bearer $(cat /run/secrets/kubernetes.io/serviceaccount/token)"       https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/demo-namespace/secrets
{
  "kind": "SecretList",
  "apiVersion": "v1",
  "metadata": {
    "resourceVersion": "668709"
  },
  "items": [
    {
      "metadata": {
        "name": "other-secret",
        "namespace": "demo-namespace",
        "uid": "5b3b9dba-be5d-48cc-ab16-4e0ceb3d1d72",
        "resourceVersion": "662043",
        "creationTimestamp": "2022-08-19T14:51:15Z",
        "managedFields": [
          {
            "manager": "kubectl-create",
            "operation": "Update",
            "apiVersion": "v1",
            "time": "2022-08-19T14:51:15Z",
            "fieldsType": "FieldsV1",
            "fieldsV1": {
              "f:data": {
                ".": {},
                "f:foo": {}
              },
              "f:type": {}
            }
          }
        ]
      },
      "data": {
        "foo": "YmFy"
      },
      "type": "Opaque"
    }
  ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多