Programar regras personalizadas usando o Rego

Este documento descreve como escrever regras personalizadas usando a linguagem de política Rego. É possível usar essas regras no Workload Manager para avaliar as cargas de trabalho de acordo com as práticas recomendadas definidas para sua organização.

Para mais informações, consulte Sobre as regras personalizadas no Gerenciador de cargas de trabalho.

Antes de começar

Programar regras personalizadas usando o Rego

O Google oferece um repositório de exemplo do GitHub com um conjunto de regras predefinidas que podem ser usadas para avaliar seus workloads. Esses exemplos abrangem vários casos de uso. Selecione regras do repositório ou crie um arquivo de regra (.rego) que descreva seus requisitos de avaliação.

Uma regra personalizada tem as seguintes seções:

  • Metadados. Os campos a seguir definem os metadados da regra:

    • DETAILS: uma breve descrição da regra.
    • SEVERITY: um valor definido pelo usuário que define a gravidade da violação da regra. Por exemplo, HIGH, CRITICAL, MEDIUM ou LOW.
    • ASSET_TYPE: um dos recursos compatíveis. Consulte Fontes de dados compatíveis.
    • TAGS: uma ou mais tags para a regra. Essas tags ajudam a filtrar as regras.
  • Declaração de pacote. Por exemplo, templates.google.compute.instance.label.

  • Declarações de importação. Por exemplo, data.validator.google.lib as lib.

  • Definições de regras: um conjunto de instruções que define a regra.

Exemplos de regras

As regras de exemplo a seguir estão disponíveis no repositório do GitHub GoogleCloudPlatform/workload-manager. Você pode fazer upload dessas regras no seu bucket do Cloud Storage e usá-las para executar as avaliações. Como alternativa, modifique as regras de acordo com as políticas da sua organização e faça upload dos arquivos em um bucket do Cloud Storage.

  • Exemplo 1: garante que haja pelo menos um rótulo para suas VMs.
  • Exemplo 2: garante que a carga de trabalho não use a conta de serviço padrão do Compute Engine.
  • Exemplo 3: garante que as VMs na carga de trabalho não usem um endereço IP externo.

Para conferir uma lista completa de regras de amostra que podem ser usadas no Workload Manager, consulte o repositório GoogleCloudPlatform/workload-manager do GitHub.

Exemplo 1

Garante que haja pelo menos uma tag para os recursos do 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}
}

Exemplo 2

Garante que a carga de trabalho não use a conta de serviço padrão do 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)
}

Exemplo 3

Garante que as VMs na carga de trabalho não usem um endereço IP externo.

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

Fazer upload da regra para um bucket do Cloud Storage

Depois de criar o arquivo .rego, faça o upload dele para um bucket do Cloud Storage. O nível superior do bucket do Cloud Storage precisa incluir as pastas /lib e /rules:

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

A seguir