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 Gerenciador de cargas de trabalho para avaliar suas cargas de trabalho em relação às práticas recomendadas definidas para sua organização.

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

Antes de começar

Escrever regras personalizadas usando Rego

O Google oferece um repositório de amostra do GitHub com um conjunto de regras predefinidas que você pode usar para avaliar suas cargas de trabalho. Esses exemplos abrangem vários casos de uso. Selecione regras no 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 regra: um conjunto de instruções que define a regra.

Exemplo de regras

As regras de exemplo a seguir estão disponíveis no repositório do GitHub GoogleCloudPlatform/workload-manager. É possível fazer upload dessas regras como estão para seu bucket do Cloud Storage e usá-lo para executar as avaliações. Ou modifique as regras de acordo com as políticas da sua organização e faça upload dos arquivos para um bucket do Cloud Storage.

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

Para 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

Garantir que sua 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 sua 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}
}

Faça upload da regra para um bucket do Cloud Storage

Depois de criar o arquivo .rego, faça 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