Escribir Reglas Personalizadas
Aprenda cómo escribir reglas de cumplimiento personalizadas para InfraGuard.
Estructura de Regla
Las reglas se escriben en Rego (lenguaje Open Policy Agent) con la siguiente estructura:
package infraguard.rules.aliyun.my_custom_rule
import rego.v1
import data.infraguard.helpers
rule_meta := {
"id": "my-custom-rule",
"name": {
"en": "My Custom Rule",
"zh": "我的自定义规则",
},
"severity": "high",
"description": {
"en": "Checks for custom compliance requirement",
"zh": "检查自定义合规要求",
},
"reason": {
"en": "Resource does not meet requirement",
"zh": "资源不符合要求",
},
"recommendation": {
"en": "Configure resource properly",
"zh": "正确配置资源",
},
"resource_types": ["ALIYUN::ECS::Instance"],
}
deny contains result if {
some name, resource in helpers.resources_by_type("ALIYUN::ECS::Instance")
# Su lógica de cumplimiento aquí
not is_compliant(resource)
result := {
"id": rule_meta.id,
"resource_id": name,
"violation_path": ["Properties", "SomeProperty"],
"meta": {
"severity": rule_meta.severity,
"reason": rule_meta.reason,
"recommendation": rule_meta.recommendation,
},
}
}
is_compliant(resource) if {
# Su lógica de verificación de cumplimiento aquí
}
Componentes Clave
Nombre del Paquete
Debe seguir el formato: infraguard.rules.<provider>.<rule_name_snake_case>
Nota: Use guiones bajos, no guiones en los nombres de paquetes.
Metadatos de Regla
Campos requeridos:
id: Identificador de regla (kebab-case)name: Nombre para mostrar (mapa i18n)severity:high,medium, olowdescription: Qué verifica la reglareason: Por qué fallórecommendation: Cómo corregirresource_types: Tipos de recursos afectados (opcional)
Regla Deny
Debe devolver resultados con:
id: ID de reglaresource_id: Nombre del recurso desde la plantillaviolation_path: Ruta a la propiedad problemáticameta: Severidad, razón, recomendación
Funciones Auxiliares
Consulte Funciones Auxiliares para funciones de utilidad disponibles.
Validación
Siempre valide sus reglas:
infraguard policy validate my-rule.rego
Depuración de Reglas
Use declaraciones print para depurar sus reglas durante el desarrollo:
deny contains result if {
print("Checking resource:", name)
print("Resource properties:", object.keys(resource.Properties))
# Su lógica aquí
}
Consulte Depuración de Políticas para técnicas completas de depuración.
Próximos Pasos
- Aprenda Depuración de Políticas
- Vea Validación de Políticas
- Aprenda a Escribir Paquetes
- Aprenda sobre Estructura de Directorio de Políticas
- Explore Funciones Auxiliares