Asegura el acceso a los recursos con IAM

Los usuarios de Kubernetes y las cuentas de servicio necesitan permisos para administrar los recursos de Config Connector. Con Config Connector, las identidades que usan el control de acceso basado en roles (RBAC) de Kubernetes pueden administrar el plano de control de tu proyecto. También puedes hacer referencia a las políticas de Identity and Access Management (IAM).

Los recursos que pueden hacer referencia a IAMPolicy y a IAMPolicyMember se enumeran en la referencia de recursos. Estos recursos tienen la propiedad “Puede ser referenciado por IAMPolicy/IAMPolicyMember”.

En este tema, se explica cómo proteger el acceso a los recursos de Google Cloud con Identity and Access Management.

Antes de comenzar

Instala Config Connector en tu clúster.

Asegura el acceso al plano de control con RBAC

En este ejemplo, creas una cuenta de servicio y le otorgas permisos para administrar un PubSubTopic. Esta cuenta de servicio no puede administrar otros tipos de recursos de Config Connector.

  1. Crea un archivo llamado pubsub-topic-service-account.yaml con el siguiente contenido:

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

    Aplica esto para crear la cuenta de servicio pubsub-topic-service-account:

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

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

  2. Confirma que pubsub-topic-service-account no puedes crear recursos PubSubTopic verificando que la salida del siguiente comando contiene no:

    kubectl auth can-i get pubsubtopics --as=system:serviceaccount:default:pubsub-topic-service-account
  3. A continuación, crea un ClusterRole que permita la creación de temas Pub/Sub.

    ClusterRole solo puede administrar recursos que tengan valores especificados en rules.apiGroups y rules.resources. Si deseas encontrar valores para apiGroups y resources, consulta la referencia de los recursos.

    Crea un archivo llamado pubsub-topic-editor-role.yaml con los siguientes contenidos:

    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
    

    Aplica pubsub-topic-editor.yaml para crear el ClusterRole:

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

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

  4. A continuación, crea una función RoleBinding entre ClusterRole y la cuenta de servicio. Crea un archivo llamado pubsub-topic-editor-rolebinding.yaml con el siguiente contenido:

    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. Aplica pubsub-topic-editor-rolebinding.yaml al clúster.

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

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

  6. Confirma que pubsub-topic-service-account tienes permiso para crear recursos PubSubTopic confirmando que la salida del siguiente comando es yes:

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

Limpieza

Usa kubectl delete para quitar la cuenta de servicio, la función de IAM y la Rolebinding.

kubectl delete -f pubsub-topic-editor-rolebinding.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-editor-role.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-service-account.yaml --namespace CC_NAMESPACE

Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

Asegura el plano de datos con las políticas de IAM

En este ejemplo, usa los permisos otorgados antes para crear un PubSubTopic y limitar el acceso a él con un recurso IAMPolicyMember.

  1. Crea un archivo llamado pubsub-topic-sample.yaml con el siguiente contenido:

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

    Aplica pubsub-topic-sample.yaml con kubectl:

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

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

  2. Crea un archivo llamado iampolicymember.yaml con el siguiente contenido, reemplaza EMAIL_ADDRESS por la dirección de correo electrónico de tu cuenta de 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. Aplica iampolicymember.yaml.

    kubectl apply -f iampolicymember.yaml  --namespace CC_NAMESPACE 

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

  4. Confirma que la política se haya aplicado a Google Cloud . Para ello, ejecuta este comando y busca tu dirección de correo electrónico en el resultado. Reemplaza PROJECT_ID por el ID de tu proyecto:

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

El acceso a los temas Pub/Sub ahora está protegido con un IAMPolicyMember.

Realiza una limpieza

Usa kubectl delete para quitar el tema de Pub/Sub y el IAMPolicyMember de tu proyecto de Google Cloud .

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

Prácticas recomendadas de seguridad para el aislamiento multiusuario

Para ayudar a evitar la elevación de privilegios no autorizada y aplicar el aislamiento de los usuarios, sigue estas prácticas recomendadas:

  • Aplica el modo de espacio de nombres: evita el modo de clúster en entornos multiusuario. En el modo de clúster, todos los espacios de nombres comparten una sola cuenta de servicio de IAM. Cualquier usuario que pueda crear recursos de Config Connector en cualquier espacio de nombres puede actuar con los permisos de IAM completos de esa cuenta de servicio.

  • Restringe el RBAC para los recursos de IAM: limita los permisos de creación y modificación de los recursos IAMPolicy, IAMPartialPolicy y IAMPolicyMember con el control de acceso basado en roles (RBAC) de Kubernetes. Si los desarrolladores tienen acceso de escritura amplio a estos recursos, pueden modificar las vinculaciones de IAM de Google Cloud .

  • Limita el alcance de las vinculaciones de IAM para la federación de identidades para cargas de trabajo para GKE: configura estas vinculaciones de forma estricta para las ServiceAccounts de Kubernetes designadas en espacios de nombres específicos. En el modo con espacio de nombres, vincula cada cuenta de servicio de IAM solo a la ServiceAccount de Kubernetes de Config Connector para su espacio de nombres:

    gcloud iam service-accounts add-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[cnrm-system/cnrm-controller-manager-CC_NAMESPACE]" \
        --role="roles/iam.workloadIdentityUser"
    

    Reemplaza lo siguiente:

    • GSA_NAME: Es el nombre de la cuenta de servicio de IAM que Config Connector usa para el espacio de nombres.
    • PROJECT_ID: Es el ID del proyecto que contiene tu clúster y la cuenta de servicio de IAM.
    • CC_NAMESPACE: Es el espacio de nombres desde el que Config Connector administra los recursos.

    No otorgues el rol roles/iam.workloadIdentityUser a un conjunto de principales, como todos los Pods en el espacio de nombres cnrm-system. En el modo con espacio de nombres, los controladores de Config Connector para todos los espacios de nombres se ejecutan en cnrm-system, por lo que este tipo de vinculación permite que el controlador de cada espacio de nombres actúe en nombre de la cuenta de servicio de IAM.

¿Qué sigue?

Usa Secrets para pasar información de forma segura a los recursos de Google Cloud .