Benutzerdefinierte Regeln mit Rego schreiben

In diesem Dokument wird beschrieben, wie Sie benutzerdefinierte Regeln mit der Rego-Richtliniensprache schreiben. Sie können diese Regeln im Workload Manager verwenden, um Ihre Arbeitslasten anhand der für Ihre Organisation definierten Best Practices zu bewerten.

Weitere Informationen finden Sie unter Informationen zu benutzerdefinierten Regeln im Workload Manager.

Hinweis

Benutzerdefinierte Regeln mit Rego schreiben

Google stellt ein GitHub-Beispiel-Repository mit einer Reihe vordefinierter Regeln zur Verfügung, mit denen Sie Ihre Arbeitslasten bewerten können. Diese Beispiele decken mehrere Anwendungsfälle ab. Wählen Sie Regeln aus dem Repository aus oder erstellen Sie eine Regeldatei (.rego), in der Ihre Bewertungsanforderungen beschrieben werden.

Eine benutzerdefinierte Regel besteht aus den folgenden Abschnitten:

  • Metadaten In den folgenden Feldern werden die Metadaten der Regel definiert:

    • DETAILS: eine kurze Beschreibung der Regel.
    • SEVERITY: ein vom Nutzer definierter Wert, der den Schweregrad der Verletzung der Regel definiert. Beispiel: HIGH, CRITICAL, MEDIUM oder LOW.
    • ASSET_TYPE: eines der unterstützten Assets. Weitere Informationen finden Sie unter Unterstützte Datenquellen.
    • TAGS: ein oder mehrere Tags für die Regel. Mit diesen Tags können die Regeln gefiltert werden.
  • Paketdeklaration Beispiel: templates.google.compute.instance.label.

  • Importanweisungen Beispiel: data.validator.google.lib as lib.

  • Regeldefinitionen : eine Reihe von Anweisungen, die die Regel definieren.

Beispielregeln

Die folgenden Beispielregeln sind im GitHub-Repository GoogleCloudPlatform/workload-manager verfügbar. Sie können diese Regeln unverändert in Ihren Cloud Storage-Bucket hochladen und damit Ihre Bewertungen ausführen. Alternativ können Sie die Regeln gemäß den Richtlinien Ihrer Organisation ändern und die Dateien dann in einen Cloud Storage-Bucket hochladen.

  • Beispiel 1: sorgt dafür, dass für Ihre VMs mindestens ein Label vorhanden ist.
  • Beispiel 2: sorgt dafür, dass Ihre Arbeitslast nicht das Compute Engine-Standarddienstkonto verwendet.
  • Beispiel 3: sorgt dafür, dass VMs in Ihrer Arbeitslast keine externe IP-Adresse verwenden.

Eine vollständige Liste der Beispielregeln, die Sie im Arbeitslastmanager verwenden können, finden Sie im GoogleCloudPlatform/workload-manager GitHub-Repository.

Beispiel 1

Sorgt dafür, dass für die Compute Engine-Ressourcen mindestens ein Tag vorhanden ist.

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

Beispiel 2

Sorgt dafür, dass Ihre Arbeitslast nicht das Compute Engine-Standarddienstkonto verwendet.

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

Beispiel 3

Sorgt dafür, dass VMs in Ihrer Arbeitslast keine externe IP-Adresse verwenden.

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

Regel in einen Cloud Storage-Bucket hochladen

Nachdem Sie die Datei .rego erstellt haben, laden Sie sie in einen Cloud Storage-Bucket hoch. Die oberste Ebene Ihres Cloud Storage-Bucket muss die Ordner /lib und /rules enthalten:

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

Nächste Schritte