Escribir reglas personalizadas con Rego

En este documento se describe cómo escribir reglas personalizadas con el lenguaje de políticas Rego. Puedes usar estas reglas en Gestor de cargas de trabajo para evaluar tus cargas de trabajo en comparación con las prácticas recomendadas definidas para tu organización.

Para obtener más información, consulta Acerca de las reglas personalizadas en Gestor de cargas de trabajo.

Antes de empezar

Escribir reglas personalizadas con Rego

Google proporciona un repositorio de ejemplo de GitHub con un conjunto de reglas predefinidas que puedes usar para evaluar tus cargas de trabajo. Estas muestras abarcan varios casos prácticos. Selecciona reglas del repositorio o crea un archivo de reglas (.rego) que describa tus requisitos de evaluación.

Una regla personalizada tiene las siguientes secciones:

  • Metadatos. Los siguientes campos definen los metadatos de la regla:

    • DETAILS: una breve descripción de la regla.
    • SEVERITY: valor definido por el usuario que define la gravedad de la infracción de la regla. Por ejemplo, HIGH, CRITICAL, MEDIUM o LOW.
    • ASSET_TYPE: uno de los recursos admitidos. Consulta las fuentes de datos admitidas.
    • TAGS: una o varias etiquetas de la regla. Estas etiquetas ayudan a filtrar las reglas.
  • Declaración de paquete. Por ejemplo, templates.google.compute.instance.label.

  • Importar extractos. Por ejemplo, data.validator.google.lib as lib.

  • Definiciones de reglas: un conjunto de instrucciones que definen la regla.

Ejemplos de reglas

Las siguientes reglas de ejemplo están disponibles en el repositorio de GitHub GoogleCloudPlatform/workload-manager. Puedes subir estas reglas tal cual a tu segmento de Cloud Storage y usarlas para llevar a cabo tus evaluaciones. También puedes modificar las reglas según las políticas de tu organización y, a continuación, subir los archivos a un segmento de Cloud Storage.

  • Ejemplo 1: asegura que haya al menos una etiqueta para tus VMs.
  • Ejemplo 2: se asegura de que tu carga de trabajo no use la cuenta de servicio predeterminada de Compute Engine.
  • Ejemplo 3: se asegura de que las VMs de tu carga de trabajo no usen una dirección IP externa.

Para ver una lista completa de reglas de ejemplo que puedes usar en Workload Manager, consulta el repositorio de GitHub GoogleCloudPlatform/workload-manager.

Ejemplo 1

Asegura que haya al menos una etiqueta para los recursos de Compute Engine.

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

########################################################################
# DETAILS:  MUST have atleast one tag
# SEVERITY: Medium
# ASSET_TYPE: compute.googleapis.com/Instance
# TAGS: Tags, Cost, Management, Compute Engine
########################################################################

package google.compute.instance.tags

import data.validator.google.lib as lib
import data.validator.google.lib.parameters as gparam
import future.keywords

asset := input.asset

params:= lib.get_default(gparam.global_parameters,"compute",{})

deny [{"msg": message, "details": metadata}] {

	# Check if resource is in exempt list
	exempt_list := lib.get_default(params, "exemptions", [])
	exempt := {asset.name} & {ex | ex := exempt_list[_]}
	not count(exempt) != 0

	tags := lib.get_default(asset.resource.data, "tags", {"items": []})
	count(tags.items) == 0

	message:="Compute resource is missing tags. Ensure appropriate tags are applied."

	metadata:={"name": asset.name}
}

Ejemplo 2

Asegura que tu carga de trabajo no use la cuenta de servicio predeterminada de Compute Engine

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

########################################################################
# DETAILS:  MUST NOT use default service account
# SEVERITY: Medium
# ASSET_TYPE: compute.googleapis.com/Instance
# TAGS: Defaults, Management, Compute Engine
########################################################################

package google.compute.defaultserviceAccount

import data.validator.google.lib as lib
import data.validator.google.lib.parameters as gparam
import future.keywords

asset := input.asset

input_enriched := object.union({"resource": {"data": {"serviceAccounts": []}}}, asset)

params := lib.get_default(gparam.global_parameters, "compute", {})

deny[{
	"msg": "Disallowed default service account",
	"details": {"name": asset.name},
}] {

	account = input_enriched.resource.data.serviceAccounts[_]
	endswith(account.email, params.default_sa)
}

Ejemplo 3

Asegura que las VMs de tu carga de trabajo no usen una dirección IP externa.

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

########################################################################
# DETAILS:  Ensure VMs dont have External IP
# SEVERITY: High
# ASSET_TYPE: compute.googleapis.com/Instance
# TAGS: Security, Network, Compute Engine, External IP, VM, Virtual Machine
########################################################################

package google.compute.instance.approved.external.ip

import data.validator.google.lib as lib
import data.validator.google.lib.parameters as gparam
import future.keywords

asset := input.asset

params := lib.get_default(gparam.global_parameters, "compute", {})

deny [{"msg": message, "details": metadata}] {

	# Check if resource is in exempt list
	exempt_list := lib.get_default(params, "exemptions", [])
	exempt := {asset.name} & {ex | ex := exempt_list[_]}
	not count(exempt) != 0

	# Find network access config block w/ external IP
	instance := asset.resource.data
	access_config := instance.networkInterfaces[_].accessConfigs
	count(access_config) > 0

	message := sprintf("%v : VM Instance has external IP. current config: %v",[asset.name, access_config])
	metadata := {"name": asset.name}
}

Subir la regla a un segmento de Cloud Storage

Una vez que hayas creado el archivo .rego, súbelo a un segmento de Cloud Storage. El nivel superior de tu segmento de Cloud Storage debe incluir las carpetas /lib y /rules:

  • lib
    • parameters.rego
    • utils.rego
  • /rules
    • rule_name1.rego
    • rule_name2.rego

Siguientes pasos