Pular para o conteúdo principal
A plataforma AIOps do ChatCLI mantém um audit trail imutável de todas as ações — desde a detecção de uma anomalia até a execução de remediações. Combinado com RBAC granular e relatórios de compliance automatizados, o sistema atende requisitos de governança mesmo em ambientes regulados.
Cada AuditEvent é um CRD imutável (sem status). Uma vez criado, não pode ser modificado ou deletado via controllers. Isso garante integridade do registro para investigações e auditorias externas.

Por que Audit Trail para AIOps

Quando uma plataforma toma decisões autônomas em infraestrutura de produção, a rastreabilidade deixa de ser opcional:

Responsabilidade

Quem aprovou a remediação? Qual IA recomendou a ação? Quando o circuit breaker abriu? Toda decisão tem um rastro.

Investigação Pós-Incidente

Reconstrua a timeline completa de um incidente — desde o primeiro sinal até a resolução — com timestamps precisos.

Compliance Regulatório

SOC2, ISO 27001, PCI-DSS: demonstre controles sobre ações automatizadas com registros imutáveis e RBAC documentado.

Melhoria Contínua

Métricas de MTTD, MTTR, taxa de sucesso e SLA calculadas automaticamente a partir dos eventos de auditoria.

AuditEvent CRD

O AuditEvent é um CRD imutável — ele possui apenas spec, sem status. Uma vez criado, seu conteúdo é permanente.

Especificação Completa

apiVersion: platform.chatcli.io/v1alpha1
kind: AuditEvent
metadata:
  name: audit-1710856200-a7f3b2
  namespace: chatcli-system
  labels:
    platform.chatcli.io/event-type: RemediationExecuted
    platform.chatcli.io/severity: high
    platform.chatcli.io/correlation-id: inc-8f2a4b
  annotations:
    platform.chatcli.io/immutable: "true"
spec:
  # Tipo do evento
  eventType: RemediationExecuted

  # Timestamp preciso
  timestamp: "2026-03-19T14:30:00.123Z"

  # Quem realizou a ação
  actor:
    type: controller         # system | user | controller
    name: remediation-reconciler
    serviceAccount: chatcli-operator

  # Recurso afetado
  resource:
    apiVersion: platform.chatcli.io/v1alpha1
    kind: RemediationPlan
    name: plan-rollback-api-server
    namespace: production

  # Detalhes específicos do evento
  details:
    action: Rollback
    target: deployment/api-server
    fromRevision: "6"
    toRevision: "5"
    confidence: "0.92"
    decisionMode: auto-notify
    duration: "12s"
    result: success

  # ID de correlação para agrupar eventos relacionados
  correlationID: inc-8f2a4b

  # Severidade do evento
  severity: high

Tipos de Evento (EventType)

A plataforma define 20+ tipos de evento que cobrem todo o ciclo de vida do AIOps. Os seguintes eventos são registrados automaticamente pelo operator:
  • issue_created — quando uma nova Issue é detectada e transiciona para Analyzing
  • issue_resolved — quando uma remediação resolve a Issue com sucesso
  • issue_escalated — quando todas as tentativas de remediação falham
  • remediation_started — quando um RemediationPlan inicia execução
  • remediation_completed — quando a verificação de saúde confirma remediação bem-sucedida
  • remediation_failed — quando uma remediação falha
EventTypeDescrição
AnomalyDetectedNova anomalia detectada pelo WatcherBridge
AnomalyCorrelatedAnomalia correlacionada com issue existente
IssueCreatedNova issue criada pelo AnomalyReconciler
IssueEscalatedIssue escalada (severidade elevada)
IssueResolvedIssue marcada como resolvida
CrossClusterCorrelationCorrelação cross-cluster detectada
CascadeDetectedCascata staging-produção detectada

AuditActor

O campo actor identifica quem ou o que realizou a ação:
TipoDescriçãoExemplo
systemAção automática do sistemawatcher-bridge, correlation-engine
controllerController do operatorremediation-reconciler, issue-reconciler
userAção humana (via kubectl ou API)john@company.com, admin

AuditResource

O campo resource identifica o recurso Kubernetes afetado:
type AuditResource struct {
    APIVersion string `json:"apiVersion"`
    Kind       string `json:"kind"`
    Name       string `json:"name"`
    Namespace  string `json:"namespace"`
}

Formato de Nome

Cada AuditEvent segue o formato de nome:
audit-{unix-timestamp}-{random-6-chars}
Exemplos:
  • audit-1710856200-a7f3b2
  • audit-1710856245-c9d4e1
  • audit-1710856300-f2b8a6

Annotation de Imutabilidade

Todo AuditEvent é criado com a annotation platform.chatcli.io/immutable: "true". Um admission webhook pode ser configurado para rejeitar updates/deletes em recursos com está annotation.

Audit Recorder

O AuditRecorder é o componente central que gera eventos de auditoria. Ele oferece 12 funções de conveniência para os cenários mais comuns.

Funções de Conveniência

type AuditRecorder struct {
    client    client.Client
    namespace string
}

// Detecção
func (ar *AuditRecorder) RecordAnomalyDetected(anomaly *v1alpha1.Anomaly) error
func (ar *AuditRecorder) RecordIssueCreated(issue *v1alpha1.Issue) error
func (ar *AuditRecorder) RecordIssueResolved(issue *v1alpha1.Issue, resolution string) error

// Análise
func (ar *AuditRecorder) RecordAIInsightCompleted(insight *v1alpha1.AIInsight) error
func (ar *AuditRecorder) RecordConfidenceCalculated(issue string, confidence float64, factors map[string]float64) error
func (ar *AuditRecorder) RecordPatternMatched(fingerprint string, issue string) error

// Remediação
func (ar *AuditRecorder) RecordRemediationExecuted(plan *v1alpha1.RemediationPlan, action string) error
func (ar *AuditRecorder) RecordRemediationResult(plan *v1alpha1.RemediationPlan, success bool) error
func (ar *AuditRecorder) RecordCircuitBreakerTriggered(namespace string, failures int) error

// Governança
func (ar *AuditRecorder) RecordApprovalDecision(request *v1alpha1.ApprovalRequest, decision string) error
func (ar *AuditRecorder) RecordRoleChange(user string, role string, action string) error
func (ar *AuditRecorder) RecordChaosExperiment(experiment *v1alpha1.ChaosExperiment, phase string) error

Geração Automática pelos Controllers

Os controllers geram AuditEvents automaticamente em pontos-chave do pipeline:
func (r *RemediationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    plan := &v1alpha1.RemediationPlan{}
    r.Get(ctx, req.NamespacedName, plan)

    // Registra início da remediação
    r.auditRecorder.RecordRemediationExecuted(plan, plan.Spec.Actions[0].Type)

    // Executa a ação
    err := r.executeAction(ctx, plan)

    if err != nil {
        // Registra falha
        r.auditRecorder.RecordRemediationResult(plan, false)
        return ctrl.Result{}, err
    }

    // Registra sucesso
    r.auditRecorder.RecordRemediationResult(plan, true)
    return ctrl.Result{}, nil
}

Exemplo de Evento Gerado

apiVersion: platform.chatcli.io/v1alpha1
kind: AuditEvent
metadata:
  name: audit-1710856200-a7f3b2
  namespace: chatcli-system
  annotations:
    platform.chatcli.io/immutable: "true"
spec:
  eventType: RemediationExecuted
  timestamp: "2026-03-19T14:30:00.123Z"
  actor:
    type: controller
    name: remediation-reconciler
    serviceAccount: chatcli-operator
  resource:
    apiVersion: platform.chatcli.io/v1alpha1
    kind: RemediationPlan
    name: plan-rollback-api-server
    namespace: production
  details:
    action: Rollback
    target: deployment/api-server
    fromRevision: "6"
    toRevision: "5"
  correlationID: inc-8f2a4b
  severity: high

Compliance Reporter

O ComplianceReporter gera relatórios automatizados a partir dos AuditEvents, calculando métricas operacionais essenciais.

GenerateReport

func (cr *ComplianceReporter) GenerateReport(
    ctx context.Context,
    namespace string,
    window time.Duration,  // Ex: 7*24h para relatório semanal
) (*ComplianceReport, error)

Métricas do Relatório

Métricas de incidentes que medem a velocidade de detecção e resolução.
MétricaDescriçãoCálculo
MTTD (Mean Time to Detect)Tempo médio entre o início do problema e a detecçãoavg(anomaly.detected - anomaly.started)
MTTR (Mean Time to Resolve)Tempo médio entre a detecção e a resoluçãoavg(issue.resolved - issue.created)
MeanRemediationAttemptsNúmero médio de tentativas de remediação por issuetotal_attempts / total_issues
incidentMetrics:
  totalIncidents: 47
  mttd: "2m15s"
  mttr: "8m30s"
  meanRemediationAttempts: 1.3
  incidentsBySeverity:
    critical: 2
    high: 8
    medium: 22
    low: 15

Audit Summary

O relatório inclui um resumo dos eventos de auditoria gerados no período:
auditSummary:
  totalEvents: 312
  eventsByType:
    AnomalyDetected: 89
    IssueCreated: 47
    AIInsightCompleted: 45
    RemediationExecuted: 52
    RemediationSucceeded: 46
    RemediationFailed: 6
    ApprovalRequested: 12
    ApprovalGranted: 8
    ApprovalRejected: 2
    ApprovalExpired: 2
    CircuitBreakerTriggered: 1
    ChaosExperimentCompleted: 4
    PatternMatched: 23
    IssueResolved: 44
  eventsBySeverity:
    critical: 8
    high: 45
    medium: 156
    low: 103
  eventsByActor:
    system: 134
    controller: 166
    user: 12

RBAC Manager

O RBAC Manager implementa controle de acesso granular com 4 roles predefinidas, mapeadas para ClusterRoles do Kubernetes.

Definição de Roles

Viewer — Acesso somente leitura a todos os recursos AIOps.
RecursoPermissões
Anomaly, Issue, AIInsightget, list, watch
RemediationPlan, Runbookget, list, watch
AuditEventget, list, watch
PostMortemget, list, watch
ChaosExperimentget, list, watch
ApprovalRequestget, list, watch
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: chatcli-aiops-viewer
  labels:
    platform.chatcli.io/rbac-role: viewer
rules:
  - apiGroups: ["platform.chatcli.io"]
    resources: ["*"]
    verbs: ["get", "list", "watch"]

EnsureRoles

O RBAC Manager garante que as ClusterRoles existem no cluster:
func (rm *RBACManager) EnsureRoles(ctx context.Context) error {
    roles := []struct {
        name  string
        rules []rbacv1.PolicyRule
    }{
        {name: "chatcli-aiops-viewer", rules: viewerRules},
        {name: "chatcli-aiops-operator", rules: operatorRules},
        {name: "chatcli-aiops-admin", rules: adminRules},
        {name: "chatcli-aiops-superadmin", rules: superAdminRules},
    }

    for _, role := range roles {
        cr := &rbacv1.ClusterRole{
            ObjectMeta: metav1.ObjectMeta{Name: role.name},
            Rules:      role.rules,
        }
        _, err := controllerutil.CreateOrUpdate(ctx, rm.client, cr, func() error {
            cr.Rules = role.rules
            return nil
        })
        if err != nil {
            return fmt.Errorf("falha ao criar/atualizar role %s: %w", role.name, err)
        }
    }
    return nil
}

GrantRole e RevokeRole

func (rm *RBACManager) GrantRole(ctx context.Context, user string, role string) error {
    binding := &rbacv1.ClusterRoleBinding{
        ObjectMeta: metav1.ObjectMeta{
            Name: fmt.Sprintf("chatcli-aiops-%s-%s", role, sanitize(user)),
        },
        RoleRef: rbacv1.RoleRef{
            APIGroup: "rbac.authorization.k8s.io",
            Kind:     "ClusterRole",
            Name:     fmt.Sprintf("chatcli-aiops-%s", role),
        },
        Subjects: []rbacv1.Subject{
            {Kind: "User", Name: user, APIGroup: "rbac.authorization.k8s.io"},
        },
    }

    _, err := controllerutil.CreateOrUpdate(ctx, rm.client, binding, func() error { return nil })
    if err != nil {
        return err
    }

    // Registra no audit trail
    return rm.auditRecorder.RecordRoleChange(user, role, "granted")
}

API REST de Auditoria

A plataforma expõe endpoints REST para consulta e exportação de eventos de auditoria.

GET /api/v1/audit

Consulta eventos com filtros. Parâmetros de query:
ParâmetroTipoDescriçãoExemplo
typestringFiltro por EventTypeRemediationExecuted
severitystringFiltro por severidadehigh
fromISO 8601Início da janela temporal2026-03-18T00:00:00Z
toISO 8601Fim da janela temporal2026-03-19T23:59:59Z
actorstringFiltro por atorjohn@company.com
correlation_idstringFiltro por correlaçãoinc-8f2a4b
limitintMáximo de resultados (padrão: 100)50
offsetintOffset para paginação100
Exemplo de requisição:
curl -s "https://chatcli.example.com/api/v1/audit?\
type=RemediationExecuted&\
severity=high&\
from=2026-03-18T00:00:00Z&\
to=2026-03-19T23:59:59Z&\
limit=10" | jq .
Exemplo de resposta:
{
  "total": 15,
  "returned": 10,
  "events": [
    {
      "name": "audit-1710856200-a7f3b2",
      "eventType": "RemediationExecuted",
      "timestamp": "2026-03-19T14:30:00.123Z",
      "actor": {
        "type": "controller",
        "name": "remediation-reconciler"
      },
      "resource": {
        "kind": "RemediationPlan",
        "name": "plan-rollback-api-server",
        "namespace": "production"
      },
      "details": {
        "action": "Rollback",
        "target": "deployment/api-server",
        "result": "success"
      },
      "correlationID": "inc-8f2a4b",
      "severity": "high"
    }
  ]
}

GET /api/v1/audit/export

Exporta eventos em formato JSON para integração com SIEM. Retorna um arquivo .json com todos os eventos no período especificado.
# Exportar últimas 24 horas
curl -s -o audit-export.json \
  "https://chatcli.example.com/api/v1/audit/export?\
from=2026-03-18T14:00:00Z&\
to=2026-03-19T14:00:00Z"

# Verificar tamanho do export
wc -l audit-export.json
# 312 linhas (1 evento por linha, formato NDJSON)
Formato do export (NDJSON):
{"name":"audit-1710856200-a7f3b2","eventType":"RemediationExecuted","timestamp":"2026-03-19T14:30:00.123Z","actor":{"type":"controller","name":"remediation-reconciler"},"resource":{"kind":"RemediationPlan","name":"plan-rollback-api-server","namespace":"production"},"details":{"action":"Rollback"},"correlationID":"inc-8f2a4b","severity":"high"}
{"name":"audit-1710856245-c9d4e1","eventType":"RemediationSucceeded","timestamp":"2026-03-19T14:30:12.456Z","actor":{"type":"controller","name":"remediation-reconciler"},"resource":{"kind":"RemediationPlan","name":"plan-rollback-api-server","namespace":"production"},"details":{"duration":"12s"},"correlationID":"inc-8f2a4b","severity":"high"}

Integração com SIEM

A plataforma suporta exportação de eventos para sistemas SIEM (Security Information and Event Management) como Splunk, Elastic e Datadog.

Splunk

1

Configurar HEC (HTTP Event Collector)

Crie um HEC token no Splunk para receber eventos da plataforma AIOps.
2

Criar CronJob de exportação

apiVersion: batch/v1
kind: CronJob
metadata:
  name: audit-export-splunk
  namespace: chatcli-system
spec:
  schedule: "*/15 * * * *"   # A cada 15 minutos
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: exporter
              image: curlimages/curl:latest
              command:
                - /bin/sh
                - -c
                - |
                  # Exporta últimos 20 minutos (overlap de 5 min para segurança)
                  FROM=$(date -u -d '20 minutes ago' +%Y-%m-%dT%H:%M:%SZ)
                  TO=$(date -u +%Y-%m-%dT%H:%M:%SZ)

                  curl -s "http://chatcli-server.chatcli-system:8080/api/v1/audit/export?from=$FROM&to=$TO" | \
                  while IFS= read -r line; do
                    curl -s -X POST \
                      "https://splunk.example.com:8088/services/collector/event" \
                      -H "Authorization: Splunk $SPLUNK_HEC_TOKEN" \
                      -d "{\"event\": $line, \"sourcetype\": \"chatcli:audit\"}"
                  done
              env:
                - name: SPLUNK_HEC_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: splunk-credentials
                      key: hec-token
          restartPolicy: OnFailure
3

Criar index e dashboards

Configure um index dedicado chatcli_audit no Splunk e crie dashboards para visualizar eventos por tipo, severidade e ator.

Elasticsearch

apiVersion: batch/v1
kind: CronJob
metadata:
  name: audit-export-elastic
  namespace: chatcli-system
spec:
  schedule: "*/15 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: exporter
              image: curlimages/curl:latest
              command:
                - /bin/sh
                - -c
                - |
                  FROM=$(date -u -d '20 minutes ago' +%Y-%m-%dT%H:%M:%SZ)
                  TO=$(date -u +%Y-%m-%dT%H:%M:%SZ)

                  curl -s "http://chatcli-server.chatcli-system:8080/api/v1/audit/export?from=$FROM&to=$TO" | \
                  while IFS= read -r line; do
                    curl -s -X POST \
                      "https://elastic.example.com:9200/chatcli-audit/_doc" \
                      -H "Content-Type: application/json" \
                      -u "$ELASTIC_USER:$ELASTIC_PASS" \
                      -d "$line"
                  done
              env:
                - name: ELASTIC_USER
                  valueFrom:
                    secretKeyRef:
                      name: elastic-credentials
                      key: username
                - name: ELASTIC_PASS
                  valueFrom:
                    secretKeyRef:
                      name: elastic-credentials
                      key: password
          restartPolicy: OnFailure

Comandos kubectl

# Listar todos os eventos de auditoria
kubectl get auditevents -n chatcli-system

# Filtrar por tipo de evento
kubectl get auditevents -n chatcli-system \
  -l platform.chatcli.io/event-type=RemediationExecuted

# Filtrar por severidade
kubectl get auditevents -n chatcli-system \
  -l platform.chatcli.io/severity=critical

# Filtrar por correlação (todos os eventos de um incidente)
kubectl get auditevents -n chatcli-system \
  -l platform.chatcli.io/correlation-id=inc-8f2a4b \
  --sort-by=.spec.timestamp

# Ver detalhes de um evento específico
kubectl get auditevent audit-1710856200-a7f3b2 -n chatcli-system -o yaml

# Contar eventos por tipo (últimas 24h)
kubectl get auditevents -n chatcli-system -o json | \
  jq '[.items[].spec.eventType] | group_by(.) | map({type: .[0], count: length})'

# Verificar roles RBAC configuradas
kubectl get clusterroles -l platform.chatcli.io/rbac-role

# Listar bindings de um usuário
kubectl get clusterrolebindings -l platform.chatcli.io/rbac-role \
  -o jsonpath='{range .items[*]}{.metadata.name}: {.subjects[*].name}{"\n"}{end}'

# Gerar relatório de compliance (via API)
curl -s "https://chatcli.example.com/api/v1/compliance/report?\
namespace=production&window=7d" | jq .

Retenção de Eventos

AuditEvents são imutáveis mas não eternos. Configure uma política de retenção para evitar acúmulo excessivo de CRs no etcd.
# CronJob para limpeza de eventos antigos (>90 dias)
apiVersion: batch/v1
kind: CronJob
metadata:
  name: audit-retention
  namespace: chatcli-system
spec:
  schedule: "0 2 * * 0"    # Todo domingo às 02:00
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: chatcli-superadmin
          containers:
            - name: cleanup
              image: bitnami/kubectl:latest
              command:
                - /bin/sh
                - -c
                - |
                  CUTOFF=$(date -u -d '90 days ago' +%Y-%m-%dT%H:%M:%SZ)
                  kubectl get auditevents -n chatcli-system -o json | \
                  jq -r ".items[] | select(.spec.timestamp < \"$CUTOFF\") | .metadata.name" | \
                  xargs -r kubectl delete auditevent -n chatcli-system
          restartPolicy: OnFailure

Próximos Passos

Motor de Decisão

Veja como cada decisão do motor gera AuditEvents para rastreabilidade completa.

Federação Multi-Cluster

AuditEvents cross-cluster com CorrelationID unificado.

Chaos Engineering

Experimentos de chaos geram eventos de auditoria para compliance de game days.

AIOps Platform

Retorne à visão geral da plataforma AIOps.