Escreva regras personalizadas com o Rego

Este documento descreve como escrever regras personalizadas usando a linguagem de políticas Rego. Pode usar estas regras no Workload Manager para avaliar as suas cargas de trabalho em função das práticas recomendadas definidas para a sua organização.

Para mais informações, consulte o artigo Acerca das regras personalizadas no Workload Manager.

Antes de começar

Escreva regras personalizadas com o Rego

A Google fornece um repositório do GitHub de exemplo com um conjunto de regras predefinidas que pode usar para avaliar as suas cargas de trabalho. Estas amostras abrangem vários exemplos de utilização. Selecione regras do repositório ou crie um ficheiro (.rego) que descreva os seus requisitos de avaliação.

Uma regra personalizada tem as seguintes secções:

  • Metadados. Os campos seguintes definem os metadados da regra:

    • DETAILS: uma breve descrição da regra.
    • SEVERITY: um valor definido pelo utilizador que define a gravidade da violação da regra. Por exemplo, HIGH, CRITICAL, MEDIUM ou LOW.
    • ASSET_TYPE: um dos recursos suportados. Consulte a secção Origens de dados compatíveis.
    • TAGS: uma ou mais etiquetas para a regra. Estas etiquetas ajudam a filtrar as regras.
  • Declaração de pacotes. Por exemplo, templates.google.compute.instance.label.

  • Importe extratos. 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 seguintes regras de exemplo estão disponíveis no repositório do GitHub GoogleCloudPlatform/workload-manager. Pode carregar estas regras tal como estão para o seu contentor do Cloud Storage e usá-lo para executar as suas avaliações. Em alternativa, modifique as regras de acordo com as políticas da sua organização e, em seguida, carregue os ficheiros para um contentor do Cloud Storage.

  • Exemplo 1: garante que existe, pelo menos, uma etiqueta para as suas VMs.
  • Exemplo 2: garante que a sua carga de trabalho não usa a conta de serviço predefinida do Compute Engine.
  • Exemplo 3: garante que as VMs na sua carga de trabalho não usam um endereço IP externo.

Para ver uma lista completa de regras de exemplo que pode usar no Workload Manager, consulte o repositório do GitHub GoogleCloudPlatform/workload-manager.

Exemplo 1

Garante que existe, pelo menos, uma etiqueta 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 sua carga de trabalho não usa a conta de serviço predefinida 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 usam 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}
}

Carregue a regra para um contentor do Cloud Storage

Depois de criar o ficheiro .rego, carregue-o para um contentor do Cloud Storage. O nível superior do seu contentor do Cloud Storage tem de incluir as pastas /lib e /rules:

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

O que se segue?