Cómo ver los datos personalizados de las políticas del SO de tu organización

En este documento, se describe cómo usar VM Manager, Cloud Asset Inventory y BigQuery para ver datos personalizados y mensajes de error de aplicación de políticas del SO en toda tu organización. Usa este flujo de trabajo cuando necesites informes a nivel de la organización sobre configuraciones personalizadas de VM, resultados de secuencias de comandos o fallas en la ejecución de políticas que los estados de cumplimiento estándares no capturan.

Para recopilar datos personalizados, configura un outputFilePath en tu política de SO, que es la ruta de acceso local en la VM en la que tu secuencia de comandos de política escribe texto personalizado o resultados en formato JSON. VM Manager lee el resultado de esta ruta de acceso y lo almacena en el informe de asignación de política del SO. Luego, puedes exportar estos informes a BigQuery con Cloud Asset Inventory para consultar los resultados en toda tu flota de VM.

Antes de comenzar

Roles obligatorios

Para obtener los permisos que necesitas para exportar datos de recursos a BigQuery y consultar datos de políticas del SO personalizadas, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto, la carpeta o la organización:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para exportar datos de recursos a BigQuery y consultar datos de políticas del SO personalizadas. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para exportar datos de recursos a BigQuery y consultar datos de políticas del SO personalizadas:

  • cloudasset.assets.exportOSInventories
  • cloudasset.assets.exportResource
  • bigquery.datasets.get
  • bigquery.tables.create
  • bigquery.tables.update
  • bigquery.tables.get
  • bigquery.jobs.create

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Políticas del SO de ejemplo

Antes de exportar y consultar datos personalizados en BigQuery, debes crear y asignar una política del SO que recopile resultados personalizados de tus VMs. Para obtener más información, consulta Crea una asignación de política del SO.

Para recopilar datos personalizados, define una política de SO con un recurso exec que incluya las siguientes secciones:

  • validate: Verifica si la VM coincide con el estado seleccionado. En las siguientes políticas de ejemplo, la secuencia de comandos validate sale con el código 101 para indicar que el recurso no coincide con el estado seleccionado. Este código de salida activa la secuencia de comandos enforce en cada evaluación.
  • enforce: Especifica el campo outputFilePath, ejecuta el comando personalizado, escribe el resultado en la ruta de acceso especificada y sale con el código 100 para indicar que la aplicación se realizó correctamente.

Política del SO que genera una cadena

La siguiente política del SO de ejemplo genera una cadena que contiene la versión del kernel de la instancia de VM:

id: return-kernel-version-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.txt
          script: uname -r > policy-output.txt && exit 100

Política del SO que genera un archivo JSON

La siguiente política de SO de ejemplo genera un objeto JSON que contiene el nombre del sistema operativo y la versión del kernel:

id: return-kernel-version-js-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version-js
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.json
          script: |-
            k=$(uname -r)
            o=$(uname -a)
            echo "{ \"name\": \""$o"\", \"kernel\": \""$k"\" }" > policy-output.json
            exit 100

Exporta datos de VM Manager a BigQuery

Después de que VM Manager aplica tu política del SO, Cloud Asset Inventory recopila los informes resultantes del inventario del SO y de la asignación de políticas del SO en toda tu organización. Cuando exportas estos datos a BigQuery con la marca --per-asset-type, Cloud Asset Inventory crea una tabla independiente para cada tipo de recurso. La tabla <prefix>_osconfig_googleapis_com_OSPolicyAssignmentReport resultante almacena los resultados de tu política personalizada y los mensajes de error de aplicación.

Para exportar datos de inventario y recursos del SO a BigQuery, sigue estos pasos:

  1. Para identificar el ID de organización, ejecuta el siguiente comando:

    gcloud projects get-ancestors PROJECT_ID
    

    Reemplaza PROJECT_ID con el ID del proyecto.

  2. Para exportar los datos de inventario del SO que VM Manager recopila de tus instancias de VM, ejecuta el siguiente comando:

    gcloud asset export \
        --content-type=os-inventory \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"
    

    Reemplaza los siguientes marcadores de posición por tus valores:

    • ORGANIZATION_ID: Tu ID de organización.
    • BQ_PROJECT_ID: Es el ID del proyecto que contiene tu conjunto de datos de BigQuery.
    • DATASET_ID: Es el ID de tu conjunto de datos de BigQuery (por ejemplo, cai_exp).
  3. Para exportar los metadatos del recurso, incluidos los informes de asignación de políticas del SO, a BigQuery, ejecuta el siguiente comando:

    gcloud asset export \
        --content-type=resource \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"
    

    Reemplaza los siguientes marcadores de posición por tus valores:

    • ORGANIZATION_ID: Es el ID de tu organización.
    • BQ_PROJECT_ID: Es el ID del proyecto que contiene tu conjunto de datos de BigQuery.
    • DATASET_ID: Es el ID de tu conjunto de datos de BigQuery (por ejemplo, cai_exp).

    Cuando se completa la exportación, Cloud Asset Inventory crea la tabla res_osconfig_googleapis_com_OSPolicyAssignmentReport en tu conjunto de datos de BigQuery. Para obtener más información, consulta Exporta una instantánea del activo.

Consulta datos de políticas del SO personalizadas en BigQuery

Después de exportar los datos de tus recursos a BigQuery, puedes consultar la tabla res_osconfig_googleapis_com_OSPolicyAssignmentReport para ver los resultados personalizados y los mensajes de error de aplicación de tus políticas del SO.

Para ejecutar una consulta en BigQuery, sigue estos pasos:

  1. En la consola de Cloud de Confiance , ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega una de las siguientes consultas en SQL:

    • Resultado del texto de la búsqueda:

      La siguiente consulta devuelve la versión del kernel que recopila la política del SO para cada instancia de VM:

      SELECT
        resource.data.instance as instance,
        ANY_VALUE(
          SAFE_CONVERT_BYTES_TO_STRING(FROM_BASE64(REPLACE(REPLACE(
            resource_compliances.execResourceOutput.enforcementOutput
            , '-', '+'), '_', '/')))
          HAVING MAX updateTime) as compliance_results
      FROM
        `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
        UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
        UNNEST(resource_compliances.configSteps) as config_steps
      WHERE
        resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-policy"
        AND resource_compliances.osPolicyResourceId = "return-kernel-version"
        AND config_steps.type = "VALIDATION"
      GROUP BY
        instance
      

      Reemplaza DATASET_ID por el ID de tu conjunto de datos de BigQuery (por ejemplo, cai_exp).

      El resultado de la consulta es similar a la siguiente tabla:

      instance compliance_results
      ubuntu-1 5.15.0-1036-gcp
      ubuntu-2 5.15.0-1044-gcp
      rhel9-1 5.14.0-162.18.1.el9_1.x86_64
    • Salida de JSON de la consulta:

      La siguiente consulta extrae los campos name y kernel del resultado JSON y los devuelve como columnas separadas para cada instancia de VM:

      WITH compliance_history AS (
        SELECT
          updateTime,
          resource.data.instance,
          SAFE_CONVERT_BYTES_TO_STRING(
            FROM_BASE64(
              REPLACE(
                REPLACE(
                  resource_compliances.execResourceOutput.enforcementOutput, '-', '+'
                ), '_', '/'
              )
            )
          ) as compliance_results
        FROM
          `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
          UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
          UNNEST(resource_compliances.configSteps) as config_steps
        WHERE
          resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-js-policy"
          AND resource_compliances.osPolicyResourceId = "return-kernel-version-js"
          AND config_steps.type = "VALIDATION"
      ),
      compliance_latest AS (
        SELECT
          instance,
          ANY_VALUE(compliance_results HAVING MAX updateTime) as compliance_results
        FROM compliance_history
        GROUP BY instance
      )
      SELECT
        instance,
        JSON_EXTRACT_SCALAR(compliance_results, "$.name") as os_name,
        JSON_EXTRACT_SCALAR(compliance_results, "$.kernel") as kernel_version
      FROM compliance_latest
      

      Reemplaza DATASET_ID por el ID de tu conjunto de datos de BigQuery (por ejemplo, cai_exp).

      El resultado de la consulta es similar a la siguiente tabla:

      instance os_name kernel_version
      ubuntu-1 Linux ubuntu-1 5.15.0-1036-gcp #39-Ubuntu SMP 5.15.0-1036-gcp
      rhel9-1 Linux rhel9-1 5.14.0-162.18.1.el9_1.x86_64 #1 SMP 5.14.0-162.18.1.el9_1.x86_64
  3. Para ejecutar la consulta, haz clic en Ejecutar.

Para obtener más información, consulta Ejecuta una consulta.

Revisa los mensajes de error de aplicación

Cuando un recurso de política de SO no supera la validación o la aplicación, VM Manager registra el mensaje de error en el campo configSteps.errorMessage de la tabla res_osconfig_googleapis_com_OSPolicyAssignmentReport. Puedes consultar este campo en BigQuery para solucionar problemas de fallas en la ejecución de políticas en toda tu organización.

La siguiente consulta devuelve los mensajes de error de validación o aplicación más recientes para cada instancia de VM:

SELECT
  resource.data.instance AS instance,
  resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId AS policy_id,
  resource_compliances.osPolicyResourceId AS resource_id,
  config_steps.type AS step_type,
  ANY_VALUE(config_steps.errorMessage HAVING MAX updateTime) AS error_message
FROM
  `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
  UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) AS resource_compliances,
  UNNEST(resource_compliances.configSteps) AS config_steps
WHERE
  config_steps.errorMessage IS NOT NULL
  AND config_steps.errorMessage != ""
GROUP BY
  instance,
  policy_id,
  resource_id,
  step_type

Reemplaza DATASET_ID por el ID de tu conjunto de datos de BigQuery (por ejemplo, cai_exp).

El resultado de la consulta es similar a la siguiente tabla:

instance policy_id resource_id step_type error_message
ubuntu-2 return-kernel-version-policy return-kernel-version DESIRED_STATE_ENFORCEMENT Error running enforce script: exit status 1

¿Qué sigue?

Para obtener más información sobre cómo administrar las políticas de SO y analizar los datos de cumplimiento, consulta los siguientes recursos: