Crear recursos de Google Cloud que cumplan las políticas


En este tutorial se muestra cómo pueden usar los administradores de plataformas las políticas de Policy Controller para controlar cómo se crean los recursos Google Cloud con Config Connector.

Esta página está dirigida a administradores y operadores de TI que quieran asegurarse de que todos los recursos que se ejecutan en la plataforma en la nube cumplen los requisitos de cumplimiento de la organización proporcionando y manteniendo la automatización para auditar o aplicar, y que gestionan el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud

En las instrucciones de este tutorial se presupone que tienes conocimientos básicos de Kubernetes o Google Kubernetes Engine (GKE). En el tutorial, definirás una política que restringe las ubicaciones permitidas para los segmentos de Cloud Storage.

Policy Controller comprueba, audita y aplica el cumplimiento de los recursos de tu clúster de Kubernetes con políticas relacionadas con la seguridad, las normativas o las reglas empresariales. Policy Controller se basa en el proyecto de código abierto OPA Gatekeeper.

Config Connector crea y gestiona el ciclo de vida de los Google Cloud recursos describiéndolos como recursos personalizados de Kubernetes. Para crear un Google Cloud recurso, crea un recurso de Kubernetes en un espacio de nombres que gestione Config Connector. En el siguiente ejemplo se muestra cómo describir un segmento de Cloud Storage con Config Connector:

apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
  name: my-bucket
spec:
  location: us-east1

Al gestionar tus Google Cloud recursos con Config Connector, puedes aplicar políticas de Policy Controller a esos recursos a medida que los creas en tu clúster de Google Kubernetes Engine. Estas políticas te permiten evitar o denunciar acciones que creen o modifiquen recursos de forma que infrinjan tus políticas. Por ejemplo, puedes aplicar una política que restrinja las ubicaciones de los segmentos de Cloud Storage.

Este enfoque, basado en el modelo de recursos de Kubernetes (KRM), te permite usar un conjunto coherente de herramientas y flujos de trabajo para gestionar tanto recursos de Kubernetes como de Google Cloud . En este tutorial se muestra cómo puedes completar las siguientes tareas:

  • Define políticas que rijan tus Google Cloud recursos.
  • Implementa controles que impidan que los desarrolladores y administradores creen recursos de Google Cloud que infrinjan tus políticas.
  • Implementa controles que auditen tus recursos de Google Cloud en función de tus políticas, aunque hayas creado esos recursos fuera de Config Connector.
  • Proporcionar comentarios rápidos a los desarrolladores y administradores a medida que crean y actualizan definiciones de recursos.
  • Valida las definiciones de recursos Google Cloud con tus políticas antes de intentar aplicar las definiciones a un clúster de Kubernetes.

Objetivos

  • Crea un clúster de GKE que incluya el complemento Config Connector.
  • Instala Policy Controller.
  • Crea una política para restringir las ubicaciones permitidas de los segmentos de Cloud Storage.
  • Verifica que la política impida la creación de segmentos de Cloud Storage en ubicaciones no permitidas.
  • Evalúa el cumplimiento de las políticas de la definición de los segmentos de Cloud Storage durante el desarrollo.
  • Audita los segmentos de Cloud Storage para comprobar que cumplen las políticas.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  4. En Cloud Shell, define el proyecto Google Cloud que quieras usar en este tutorial:

    gcloud config set project PROJECT_ID
    

    Sustituye PROJECT_ID por el Google Cloud ID del proyecto de tu proyecto. Cuando ejecutas este comando, Cloud Shell crea una variable de entorno exportada llamada GOOGLE_CLOUD_PROJECT que contiene tu ID de proyecto. Si no usas Cloud Shell, puedes crear la variable de entorno con este comando:

    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
    
  5. Habilita la API de GKE:

    gcloud services enable container.googleapis.com
    
  6. Habilita la API Policy Controller:

    gcloud services enable anthospolicycontroller.googleapis.com
    
  7. Crea un directorio para almacenar los archivos creados en este tutorial:

    mkdir -p ~/cnrm-gatekeeper-tutorial
    
  8. Ve al directorio que has creado:

    cd ~/cnrm-gatekeeper-tutorial
    
  9. Crear un clúster de GKE

    1. En Cloud Shell, crea un clúster de GKE con el complemento Config Connector y Workload Identity Federation para GKE:

      gcloud container clusters create CLUSTER_NAME \
        --addons ConfigConnector \
        --enable-ip-alias \
        --num-nodes 4 \
        --release-channel regular \
        --scopes cloud-platform \
        --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \
        --zone ZONE
      

      Haz los cambios siguientes:

      • CLUSTER_NAME: el nombre del clúster que quieras usar en este proyecto (por ejemplo, cnrm-gatekeeper-tutorial).
      • ZONE: una zona de Compute Engine cercana a tu ubicación, por ejemplo, asia-southeast1-b.

      El complemento Config Connector instala definiciones de recursos personalizadas (CRDs) para los Google Cloud recursos de tu clúster de GKE.

    2. Opcional: Si usas un clúster privado en tu entorno, añade una regla de cortafuegos que permita que el plano de control del clúster de GKE se conecte al webhook de Policy Controller:

      gcloud compute firewall-rules create allow-cluster-control-plane-tcp-8443 \
        --allow tcp:8443 \
        --network default \
        --source-ranges CONTROL_PLANE_CIDR \
        --target-tags NODE_TAG
      

      Haz los cambios siguientes:

      • CONTROL_PLANE_CIDR: el intervalo de IPs de tu plano de control del clúster de GKE. Por ejemplo, 172.16.0.16/28.
      • NODE_TAG: etiqueta aplicada a todos los nodos de tu clúster de GKE.

      Esta regla de cortafuegos opcional es necesaria para que el webhook de Policy Controller funcione cuando tu clúster use nodos privados.

    Configurar Config Connector

    El proyecto en el que instalas Config Connector se conoce como proyecto host. Google Cloud Los proyectos en los que usas Config Connector para gestionar recursos se denominan proyectos gestionados. En este tutorial, usas Config Connector para crear recursos en el mismo proyecto que tu clúster de GKE, de modo que el proyecto host y el proyecto gestionado sean el mismo.Google Cloud

    1. En Cloud Shell, crea una cuenta de servicio de Google para Config Connector:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
        --display-name "Config Connector Gatekeeper tutorial"
      

      Sustituye SERVICE_ACCOUNT_NAME por el nombre que quieras usar para esta cuenta de servicio. Por ejemplo, cnrm-gatekeeper-tutorial. Config Connector usa esta cuenta de servicio de Google para crear recursos en tu proyecto gestionado.

    2. Asigna el rol Administrador de Storage a la cuenta de servicio de Google:

      gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROiam.gserviceaccount.comJECT." \
        --role roles/storage.admin
      

      En este tutorial, usas el rol Administrador de Storage porque usas Config Connector para crear segmentos de Cloud Storage. En tu entorno, asigna los roles necesarios para gestionar los recursos que quieras crear para Config Connector. Google Cloud Para obtener más información sobre los roles predefinidos, consulta el artículo sobre la descripción de roles de la documentación de gestión de identidades y accesos.

    3. Crea un espacio de nombres de Kubernetes para los recursos de Config Connector que crearás en este tutorial:

      kubectl create namespace NAMESPACE
      

      Sustituye NAMESPACE por el espacio de nombres de Kubernetes que quieras usar en el tutorial. Por ejemplo, tutorial.

    4. Anota el espacio de nombres para especificar qué proyecto debe usar Config Connector para crear recursos (el proyecto gestionado): Google Cloud

      kubectl annotate namespace NAMESPACE \
          cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
      
    5. Crea un recurso ConfigConnectorContext que habilite Config Connector para el espacio de nombres de Kubernetes y lo asocie a la cuenta de servicio de Google que has creado:

      cat << EOF | kubectl apply -f -
      apiVersion: core.cnrm.cloud.google.com/v1beta1
      kind: ConfigConnectorContext
      metadata:
        name: configconnectorcontext.core.cnrm.cloud.google.com
        namespace: NAMESPACE
      spec:
        googleServiceAccount: SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
      EOF
      

      Cuando creas el recurso ConfigConnectorContext, Config Connector crea una cuenta de servicio de Kubernetes y un StatefulSet en el espacio de nombres cnrm-system para gestionar los recursos de Config Connector en tu espacio de nombres.

    6. Espera a que el pod del controlador de Config Connector de tu espacio de nombres:

      kubectl wait --namespace cnrm-system --for=condition=Ready pod \
        -l cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
      

      Cuando el pod esté listo, aparecerá la petición de Cloud Shell. Si recibes el mensaje error: no matching resources found, espera un minuto y vuelve a intentarlo.

    7. Vincula tu cuenta de servicio de Kubernetes de Config Connector a tu cuenta de servicio de Google creando una vinculación de política de gestión de identidades y accesos:

      gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
        --role roles/iam.workloadIdentityUser
      

      Este enlace permite que la cuenta de servicio de cnrm-controller-manager-NAMESPACE Kubernetes del espacio de nombres cnrm-system actúe como la cuenta de servicio de Google que has creado.

    Instalar Policy Controller

    Instala Policy Controller siguiendo las instrucciones de instalación.

    Usa un intervalo de auditoría de 60 segundos.

    Crear un Google Cloud recurso con Config Connector

    1. En Cloud Shell, crea un manifiesto de Config Connector que represente un segmento de Cloud Storage en la región us-central1:

      cat << EOF > tutorial-storagebucket-us-central1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-us-central1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: us-central1
        uniformBucketLevelAccess: true
      EOF
      
    2. Para crear el segmento de Cloud Storage, aplica el manifiesto:

      kubectl apply -f tutorial-storagebucket-us-central1.yaml
      
    3. Verifica que Config Connector haya creado el segmento de Cloud Storage:

      gcloud storage ls | grep tutorial
      

      El resultado debería ser similar al siguiente:

      gs://tutorial-us-central1-PROJECT_ID/
      

      Este resultado incluye PROJECT_ID, que es el ID de tu proyecto. Google Cloud

      Si no ves este resultado, espera un minuto y vuelve a realizar el paso.

    Crear una política

    Una política de Policy Controller consta de una plantilla de restricción y una restricción. La plantilla de restricciones contiene la lógica de la política. La restricción especifica dónde se aplica la política y los parámetros de entrada de la lógica de la política.

    1. En Cloud Shell, crea una plantilla de restricción que limite las ubicaciones de los segmentos de Cloud Storage:

      cat << EOF > tutorial-storagebucket-location-template.yaml
      apiVersion: templates.gatekeeper.sh/v1beta1
      kind: ConstraintTemplate
      metadata:
        name: gcpstoragelocationconstraintv1
      spec:
        crd:
          spec:
            names:
              kind: GCPStorageLocationConstraintV1
            validation:
              openAPIV3Schema:
                properties:
                  locations:
                    type: array
                    items:
                      type: string
                  exemptions:
                    type: array
                    items:
                      type: string
        targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package gcpstoragelocationconstraintv1
      
            allowedLocation(reviewLocation) {
                locations := input.parameters.locations
                satisfied := [ good | location = locations[_]
                                      good = lower(location) == lower(reviewLocation)]
                any(satisfied)
            }
      
            exempt(reviewName) {
                input.parameters.exemptions[_] == reviewName
            }
      
            violation[{"msg": msg}] {
                bucketName := input.review.object.metadata.name
                bucketLocation := input.review.object.spec.location
                not allowedLocation(bucketLocation)
                not exempt(bucketName)
                msg := sprintf("Cloud <St>orage bucket %v uses a disal<lo>wed location %v, allowed locations are %v", [bucketName, bucketLocation, input.parameters.locations])
            }
      
            violation[{"msg": msg}] {
                not input.parameters.locations
                bucketName := input.review.object.metadata.name
                msg := sprintf("No permitted locations provided in c<on>straint for Cloud Storage bucket %v", [bucketName])
            }
      EOF
      
    2. Aplica la plantilla para crear el segmento de Cloud Storage:

      kubectl apply -f tutorial-storagebucket-location-template.yaml
      
    3. Crea una restricción que solo permita los contenedores de las regiones de Singapur y Yakarta (asia-southeast1 y asia-southeast2). La restricción se aplica al espacio de nombres que has creado anteriormente. Exime al segmento de Cloud Storage predeterminado de Cloud Build.

      cat << EOF > tutorial-storagebucket-location-constraint.yaml
      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: GCPStorageLocationConstraintV1
      metadata:
        name: singapore-and-jakarta-only
      spec:
        enforcementAction: deny
        match:
          kinds:
          - apiGroups:
            - storage.cnrm.cloud.google.com
            kinds:
            - StorageBucket
          namespaces:
          - NAMESPACE
        parameters:
          locations:
          - asia-southeast1
          - asia-southeast2
          exemptions:
          - ${GOOGLE_CLOUD_PROJECT}_cloudbuild
      EOF
      
    4. Para limitar las zonas en las que pueden existir los contenedores, aplica la siguiente restricción:

      kubectl apply -f tutorial-storagebucket-location-constraint.yaml
      

    Verificar la política

    1. Crea un manifiesto que represente un segmento de Cloud Storage en una ubicación no permitida (us-west1):

      cat << EOF > tutorial-storagebucket-us-west1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-us-west1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: us-west1
        uniformBucketLevelAccess: true
      EOF
      
    2. Para crear el segmento de Cloud Storage, aplica el manifiesto:

      kubectl apply -f tutorial-storagebucket-us-west1.yaml
      

      El resultado debería ser similar al siguiente:

      Error from server ([singapore-and-jakarta-only] Cloud Storage bucket
      <tutorial-us-west1-PROJECT_ID> uses a disallowed location
      <us-west1>, allowed locations are ["asia-southeast1",
      "asia-southeast2"]): error when creating
      "tutorial-storagebucket-us-west1.yaml": admission webhook
      "validation.gatekeeper.sh" denied the request: [singapore-and-jakarta-only]
      Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a
      disallowed location <us-west1>, allowed locations are
      ["asia-southeast1", "asia-southeast2"]
      
    3. Opcional: Puedes ver un registro de la decisión de denegar la solicitud en los registros de auditoría de Cloud. Consulta los registros de actividad de administración de tu proyecto:

      gcloud logging read --limit=1 \
          "logName=\"projects/$GOOGLE_CLOUD_PROJECT/logs/cloudaudit.googleapis.com%2Factivity\""'
          resource.type="k8s_cluster"
          resource.labels.cluster_name="CLUSTER_NAME"
          resource.labels.location="ZONE"
          protoPayload.authenticationInfo.principalEmail!~"system:serviceaccount:cnrm-system:.*"
          protoPayload.methodName:"com.google.cloud.cnrm."
          protoPayload.status.code=7'
      

      El resultado debería ser similar al siguiente:

      insertId: 3c6940bb-de14-4d18-ac4d-9a6becc70828
      labels:
        authorization.k8s.io/decision: allow
        authorization.k8s.io/reason: ''
        mutation.webhook.admission.k8s.io/round_0_index_0: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"container-annotation-handler.cnrm.cloud.google.com","mutated":true}'
        mutation.webhook.admission.k8s.io/round_0_index_1: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"management-conflict-annotation-defaulter.cnrm.cloud.google.com","mutated":true}'
      logName: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
      operation:
        first: true
        id: 3c6940bb-de14-4d18-ac4d-9a6becc70828
        last: true
        producer: k8s.io
      protoPayload:
        '@type'-: type.googleapis.com/google.cloud.audit.AuditLog
        authenticationInfo:
          principalEmail: user@example.com
        authorizationInfo:
         permission: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
          resource: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
        methodName: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
        requestMetadata:
          callerIp: 203.0.113.1
          callerSuppliedUserAgent: kubectl/v1.21.1 (linux/amd64) kubernetes/5e58841
        resourceName: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
        serviceName: k8s.io
        status:
          code: 7
          message: Forbidden
      receiveTimestamp: '2021-05-21T06:56:24.940264678Z'
      resource:
        labels:
          cluster_name: CLUSTER_NAME
          location: CLUSTER_ZONE
          project_id: PROJECT_ID
        type: k8s_cluster
      timestamp: '2021-05-21T06:56:09.060635Z'

      El campo methodName muestra la operación que se ha intentado, el campo resourceName muestra el nombre completo del recurso de Config Connector y la sección status muestra que la solicitud no se ha completado correctamente, con el código de error 7 y el mensaje Forbidden.

    4. Crea un manifiesto que represente un segmento de Cloud Storage en una ubicación permitida (asia-southeast1):

      cat << EOF > tutorial-storagebucket-asia-southeast1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-asia-southeast1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: asia-southeast1
        uniformBucketLevelAccess: true
      EOF
      
    5. Para crear el segmento de Cloud Storage, aplica el manifiesto:

      kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
      

      El resultado debería ser similar al siguiente:

      storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
      

      Este resultado incluye PROJECT_ID, que es el ID de tu proyecto. Google Cloud

    6. Comprueba que Config Connector ha creado el segmento de Cloud Storage:

      gcloud storage ls | grep tutorial
      

      El resultado debería ser similar al siguiente:

      gs://tutorial-asia-southeast1-PROJECT_ID/
      gs://tutorial-us-central1-PROJECT_ID/
      

      Si no ves este resultado, espera un minuto y vuelve a realizar este paso.

    Restricciones de auditoría

    El controlador de auditoría de Policy Controller evalúa periódicamente los recursos en función de sus restricciones. El controlador detecta infracciones de políticas en los recursos creados antes de la restricción y en los recursos creados fuera de Config Connector.

    1. En Cloud Shell, consulta las infracciones de todas las restricciones que usen la plantilla de restricción GCPStorageLocationConstraintV1:

      kubectl get gcpstoragelocationconstraintv1 -o json \
        | jq '.items[].status.violations'
      

      El resultado debería ser similar al siguiente:

      [
        {
          "enforcementAction": "deny",
          "kind": "StorageBucket",
          "message": "Cloud Storage bucket <tutorial-us-central1-PROJECT_ID>
          uses a disallowed location <us-central1>, allowed locations are
          \"asia-southeast1\", \"asia-southeast2\"",
          "name": "tutorial-us-central1-PROJECT_ID",
          "namespace": "NAMESPACE"
        }
      ]
      

      Verás el segmento de Cloud Storage que has creado us-central1 antes de crear la restricción.

    Validar recursos durante el desarrollo

    Durante el desarrollo y las compilaciones de integración continua, es útil validar los recursos con respecto a las restricciones antes de aplicarlos al clúster de GKE. La validación proporciona comentarios rápidos y te permite descubrir problemas con los recursos y las restricciones en una fase temprana. En estos pasos se muestra cómo validar recursos con kpt. La herramienta de línea de comandos kpt te permite gestionar y aplicar manifiestos de recursos de Kubernetes.

    1. En Cloud Shell, ejecuta la gatekeeper función KRM con kpt:

      kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
      

      Una función de KRM es un programa que puede mutar o validar recursos de Kubernetes almacenados en el sistema de archivos local como archivos YAML. La función gatekeeper KRM valida los recursos de los segmentos de Cloud Storage de Config Connector con la política de Gatekeeper. La función gatekeeper KRM se empaqueta como una imagen de contenedor disponible en Artifact Registry.

      La función informa de que los archivos de manifiesto de los segmentos de Cloud Storage de las regiones us-central1 y us-west1 infringen la restricción.

      El resultado debería ser similar al siguiente:

      [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
      [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
        Results:
          [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-central1.yaml"
          [ERROR] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-west1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-west1.yaml"
        Stderr:
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-west1-PROJECT_IDT : Cloud Storage bucket <tutorial-us-west1-PROJECT_IDgt; uses a disallowed location <us-west1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
        Exit code: 1
      

    Validar recursos creados fuera de Config Connector

    Puedes validar los recursos que se hayan creado fuera de Config Connector exportándolos. Google Cloud Después de exportar los recursos, utilice una de las siguientes opciones para evaluar sus políticas de Policy Controller en comparación con los recursos exportados:

    • Valida los recursos con la función gatekeeper de KRM.

    • Importa los recursos en Config Connector.

    Para exportar los recursos, utilice Inventario de Recursos de Cloud.

    1. En Cloud Shell, habilita la API Cloud Asset:

      gcloud services enable cloudasset.googleapis.com
      
    2. Elimina los archivos de manifiesto de recursos de Kubernetes de los contenedores de Cloud Storage en us-central1 y us-west1:

      rm tutorial-storagebucket-us-*.yaml
      
    3. Exporta todos los recursos de Cloud Storage de tu proyecto actual y almacena el resultado en un archivo llamado export.yaml:

      gcloud beta resource-config bulk-export \
        --project $GOOGLE_CLOUD_PROJECT \
        --resource-format krm \
        --resource-types StorageBucket > export.yaml
      

      El resultado debería ser similar al siguiente:

      Exporting resource configurations to stdout...
      
      Export complete.
      
    4. Crea un flujo de procesamiento de kpt encadenando funciones de KRM. Esta canalización valida los recursos del directorio actual con la política de ubicación del segmento de Cloud Storage:

      kpt fn source . \
        | kpt fn eval - --image=gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=NAMESPACE \
        | kpt fn eval - --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
      

      Los recursos exportados no tienen ningún valor para el atributo de metadatos namespace. Esta canalización usa una función de KRM llamada set-namespace para definir el valor namespace de todos los recursos.

      El resultado es similar al siguiente y muestra infracciones de los recursos que ha exportado:

      [RUNNING] "gcr.io/kpt-fn/set-namespace:v0.1"
      [PASS] "gcr.io/kpt-fn/set-namespace:v0.1"
      [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
      [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
        Results:
          [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "export.yaml"
        Stderr:
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
        Exit code: 1
      

      Si tu proyecto de Google Cloud contiene segmentos de Cloud Storage que creaste antes de empezar este tutorial y su ubicación infringe la restricción, los segmentos creados anteriormente aparecerán en el resultado.

    Enhorabuena, has configurado correctamente una política que rige la ubicación permitida de los segmentos de Cloud Storage. El tutorial se ha completado. Ahora puedes seguir añadiendo tus propias políticas para otros recursos de Google Cloud.

    Solución de problemas

    Si Config Connector no crea los recursos esperados, Google Cloud usa el siguiente comando en Cloud Shell para ver los registros del gestor de controladores de Config Connector:

    kubectl logs --namespace cnrm-system --container manager \
      --selector cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
    

    Si Policy Controller no aplica las políticas correctamente, usa el siguiente comando para ver los registros del gestor de controladores:

    kubectl logs deployment/gatekeeper-controller-manager \
      --namespace gatekeeper-system
    

    Si Policy Controller no informa de infracciones en el campo status de los objetos de restricción, consulta los registros del controlador de auditoría con este comando:

    kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system
    

    Si tienes otros problemas con este tutorial, te recomendamos que consultes estos documentos:

    Limpieza

    Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. If the project that you plan to delete is attached to an organization, expand the Organization list in the Name column.
    3. In the project list, select the project that you want to delete, and then click Delete.
    4. In the dialog, type the project ID, and then click Shut down to delete the project.

    Eliminar los recursos

    Si quieres conservar el Google Cloud proyecto que has usado en este tutorial, elimina los recursos.

    1. En Cloud Shell, elimina la restricción de ubicación del segmento de Cloud Storage:

      kubectl delete -f tutorial-storagebucket-location-constraint.yaml
      
    2. Añada la anotación cnrm.cloud.google.com/force-destroy con el valor de cadena true a todos los recursos storagebucket del espacio de nombres gestionado por Config Connector:

      kubectl annotate storagebucket --all --namespace NAMESPACE \
        cnrm.cloud.google.com/force-destroy=true
      

      Esta anotación es una directiva que permite a Config Connector eliminar un segmento de Cloud Storage cuando eliminas el recurso storagebucket correspondiente en el clúster de GKE, incluso si el segmento contiene objetos.

    3. Elimina los recursos de Config Connector que representan los segmentos de Cloud Storage:

      kubectl delete --namespace NAMESPACE storagebucket --all
      
    4. Elimina el clúster de GKE:

      gcloud container clusters delete CLUSTER_NAME \
        --zone ZONE --async --quiet
      
    5. Elimina el enlace de política de identidad de carga de trabajo en Gestión de identidades y accesos:

      gcloud iam service-accounts remove-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
        --role roles/iam.workloadIdentityUser
      
    6. Elimina la vinculación del rol Administrador de Cloud Storage de la cuenta de servicio de Google:

      gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROiam.gserviceaccount.comJECT." \
        --role roles/storage.admin
      
    7. Elimina la cuenta de servicio de Google que has creado para Config Connector:

      gcloud iam service-accounts delete --quiet \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
      

    Siguientes pasos