使用 IAM 保护对资源的访问


Kubernetes 用户和服务账号需要拥有管理 Config Connector 资源的权限。借助 Config Connector,项目的控制平面可以由使用 Kubernetes 基于角色的访问控制 (RBAC) 的身份管理。您还可以参考 Identity and Access Management (IAM) 政策。

资源参考文档中列出了可以引用 IAMPolicy 和 IAMPolicyMember 的资源。这些资源具有“可以由 IAMPolicy/IAMPolicyMember 引用”属性。

本主题介绍如何使用 Identity and Access Management 保护对 Google Cloud 资源的访问。

准备工作

要完成此页面上的步骤,首先在您的集群中安装 Config Connector。

使用 RBAC 保护控制平面访问

在本例中,您将创建一个服务账号并向其授予管理 PubSubTopic 的权限。该服务账号无法管理其他类型的 Config Connector 资源。

  1. 创建一个名为 pubsub-topic-service-account.yaml 的文件,其中包含以下内容:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: pubsub-topic-service-account
      namespace: default
    

    应用该文件来创建 pubsub-topic-service-account 服务账号:

    kubectl apply -f pubsub-topic-service-account.yaml --namespace CC_NAMESPACE

    CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

  2. 通过验证以下命令的输出是否包含 no,来确认 pubsub-topic-service-account 无法创建 PubSubTopic 资源:

    kubectl auth can-i get pubsubtopics --as=system:serviceaccount:default:pubsub-topic-service-account
  3. 接下来,创建一个允许创建 Pub/Sub 主题的 ClusterRole

    ClusterRole 只能管理在 rules.apiGroupsrules.resources 中指定了值的资源。如需查找 apiGroupsresources 的值,请参阅您的资源的参考文档

    创建一个名为 pubsub-topic-editor-role.yaml 的文件,其中包含以下内容:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: null
      name: pubsub-topic-editor
    rules:
    - apiGroups:
      - pubsub.cnrm.cloud.google.com
      resources:
      - pubsubtopics
      verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    

    应用 pubsub-topic-editor.yaml 来创建 ClusterRole

    kubectl apply -f pubsub-topic-editor-role.yaml --namespace CC_NAMESPACE

    CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

  4. 接下来,在 ClusterRole 和您的服务账号之间创建一个 RoleBinding。创建一个名为 pubsub-topic-editor-rolebinding.yaml 的文件,其中包含以下内容:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: pubsub-topic-editor-rolebinding.
    subjects:
    - kind: ServiceAccount
      name: pubsub-topic-service-account
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: pubsub-topic-editor
    
  5. pubsub-topic-editor-rolebinding.yaml 应用到您的集群。

    kubectl apply -f pubsub-topic-editor-rolebinding.yaml --namespace CC_NAMESPACE

    CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

  6. 通过确认以下命令的输出为 yes,来确认允许 pubsub-topic-service-account 创建 PubSubTopic 资源:

    kubectl auth can-i get pubsubtopics \
      --as=system:serviceaccount:default:pubsub-topic-service-account

清理

使用 kubectl delete 移除服务账号、IAM 角色和角色绑定。

kubectl delete -f pubsub-topic-editor-rolebinding.yaml --namespace <var>CC_NAMESPACE</var>
kubectl delete -f pubsub-topic-editor-role.yaml --namespace <var>CC_NAMESPACE</var>
kubectl delete -f pubsub-topic-service-account.yaml --namespace <var>CC_NAMESPACE</var>

CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

使用 IAM 政策保护数据平面

在本例中,您将使用先前授予的权限来创建 PubSubTopic,并使用 IAMPolicyMember 资源限制对它的访问。

  1. 创建一个名为 pubsub-topic-sample.yaml 的文件,其中包含以下内容:

    apiVersion: pubsub.cnrm.cloud.google.com/v1beta1
    kind: PubSubTopic
    metadata:
      name: pubsubtopic-sample
    

    使用 kubectl 应用 pubsub-topic-sample.yaml

    kubectl apply -f pubsub-topic-sample.yaml --namespace CC_NAMESPACE

    CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

  2. 创建一个名为 iampolicymember.yaml 的文件,其中包含以下内容,并将 EMAIL_ADDRESS 替换为您的 Google Cloud 账号的电子邮件地址:

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: iampolicymember-sample
    spec:
      resourceRef:
        apiVersion: pubsub.cnrm.cloud.google.com/v1beta1
        kind: PubSubTopic
        name: pubsubtopic-sample
      role: roles/pubsub.admin
      member: "user:EMAIL_ADDRESS"
    
  3. 应用 iampolicymember.yaml

    kubectl apply -f iampolicymember.yaml  --namespace CC_NAMESPACE 

    CC_NAMESPACE 替换为 Config Connector 从其管理资源的命名空间。

  4. 通过运行以下命令并在输出中查找您的电子邮件地址,将 PROJECT_ID 替换为您的项目 ID,来确认已在 Google Cloud 中应用该政策:

    gcloud beta pubsub topics get-iam-policy projects/PROJECT_ID/topics/pubsubtopic-sample

现在可以使用 IAMPolicyMember 保护对 Pub/Sub 主题的访问。

清理

使用 kubectl delete 从 Google Cloud 项目中移除 Pub/Sub 主题和 IAMPolicyMember。

kubectl delete -f iampolicymember.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-sample.yaml --namespace CC_NAMESPACE

后续步骤

使用 Secret 将信息安全地传递给 Google Cloud 资源。