Écrire des règles personnalisées à l'aide de Rego

Ce document explique comment écrire des règles personnalisées à l'aide du langage de règles Rego. Vous pouvez utiliser ces règles dans Workload Manager pour évaluer vos charges de travail par rapport aux bonnes pratiques définies pour votre organisation.

Pour en savoir plus, consultez À propos des règles personnalisées dans Workload Manager.

Avant de commencer

Écrire des règles personnalisées à l'aide de Rego

Google fournit un exemple de dépôt GitHub avec un ensemble de règles prédéfinies que vous pouvez utiliser pour évaluer vos charges de travail. Ces exemples couvrent plusieurs cas d'utilisation. Sélectionnez des règles dans le dépôt ou créez un fichier de règles (.rego) qui décrit vos exigences d'évaluation.

Une règle personnalisée comporte les sections suivantes :

  • Métadonnées Les champs suivants définissent les métadonnées de la règle :

    • DETAILS : brève description de la règle.
    • SEVERITY : valeur définie par l'utilisateur qui définit la gravité du non-respect de la règle. Par exemple, HIGH, CRITICAL, MEDIUM, ou LOW.
    • ASSET_TYPE : l'un des composants acceptés. Consultez Sources de données compatibles.
    • TAGS : un ou plusieurs tags pour la règle. Ces balises permettent de filtrer les règles.
  • Déclaration de package Exemple :templates.google.compute.instance.label

  • Instructions d'importation. Exemple :data.validator.google.lib as lib

  • Définitions des règles : ensemble d'instructions qui définissent la règle.

Exemples de règles

Les exemples de règles suivants sont disponibles dans le dépôt GitHub GoogleCloudPlatform/workload-manager. Vous pouvez importer ces règles telles quelles dans votre bucket Cloud Storage et les utiliser pour exécuter vos évaluations. Vous pouvez également modifier les règles en fonction des règles de votre organisation, puis importer les fichiers dans un bucket Cloud Storage.

  • Exemple 1 : s'assurer qu'il existe au moins un libellé pour vos VM.
  • Exemple 2 : garantit que votre charge de travail n'utilise pas le compte de service Compute Engine par défaut.
  • Exemple 3 : garantit que les VM de votre charge de travail n'utilisent pas d'adresse IP externe.

Pour obtenir la liste complète des exemples de règles que vous pouvez utiliser dans Workload Manager, consultez le dépôt GitHub GoogleCloudPlatform/workload-manager.

Exemple 1

Garantit qu'il existe au moins un tag pour les ressources 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}
}

Exemple 2

Garantit que votre charge de travail n'utilise pas le compte de service Compute Engine par défaut

# 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)
}

Exemple 3

Garantit que les VM de votre charge de travail n'utilisent pas d'adresse IP externe.

# 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}
}

Importer la règle dans un bucket Cloud Storage

Une fois le fichier .rego créé, importez-le dans un bucket Cloud Storage. Le niveau supérieur de votre bucket Cloud Storage doit inclure les dossiers /lib et /rules :

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

Étapes suivantes