
Gemeinsames Go-SDK, das eine standardisierte Fähigkeitsschnittstelle für Sicherheitsscanner definiert, mit Ausgabe von Findings in mehreren Formaten (Terminal, JSON, NDJSON, Markdown, SARIF) und Prüfungen auf Abweichungen in der CLI-Dokumentation.
Gemeinsames Go-SDK zum Erstellen von Sicherheitsfähigkeiten für die Guard-Plattform.
pkg/capability - Capability-SchnittstelleDefiniert die standardisierte Schnittstelle, die Sicherheitsscanner implementieren.
Typen:
// Target - was eine Capability scannt
type Target struct {
Type TargetType // domain, ip, port, url, cloud_resource
Value string // Der Zielwert
Meta map[string]string // Zusätzlicher Kontext
}
// Finding - was eine Capability entdeckt
type Finding struct {
Type FindingType // asset, risk, attribute
Severity Severity // info, low, medium, high, critical
Data map[string]any // Flexible Nutzlast
}
// Capability - die zu implementierende Schnittstelle
type Capability interface {
Name() string
Run(ctx context.Context, target Target) ([]Finding, error)
}
Beispielimplementierung:
type SubdomainScanner struct{}
func (s *SubdomainScanner) Name() string {
return "subdomain-scanner"
}
func (s *SubdomainScanner) Run(ctx context.Context, target capability.Target) ([]capability.Finding, error) {
if target.Type != capability.TargetDomain {
return nil, fmt.Errorf("expected domain, got %s", target.Type)
}
// Scan logic here...
return []capability.Finding{
{
Type: capability.FindingAsset,
Data: map[string]any{
"dns": "found.example.com",
"class": "domain",
},
},
}, nil
}
pkg/formatter - AusgabeformatierungMulti-Format-Ausgabesystem zum Rendern von Scan-Ergebnissen.
Unterstützte Formate:
Grundlegende Verwendung:
import "github.com/praetorian-inc/capability-sdk/pkg/formatter"
// Create a formatter
f, err := formatter.New(formatter.Config{
Format: formatter.FormatJSON,
Writer: os.Stdout,
Pretty: true,
})
if err != nil {
return err
}
defer f.Close()
// Format findings
f.Format(ctx, formatter.Finding{
ID: "vuln-001",
Title: "Security Issue",
Severity: formatter.SeverityHigh,
})
// Complete with summary
f.Complete(ctx, formatter.Summary{TotalFindings: 1, HighCount: 1})
Konvertieren von Capability-Findings:
import (
"github.com/praetorian-inc/capability-sdk/pkg/capability"
"github.com/praetorian-inc/capability-sdk/pkg/formatter"
)
// Run capability
findings, err := scanner.Run(ctx, target)
// Convert and format for CLI output
for _, cf := range findings {
ff := formatter.FromCapabilityFinding(cf)
f.Format(ctx, ff)
}
Multi-Ausgabe (TeeFormatter):
terminal, _ := formatter.New(formatter.Config{Format: formatter.FormatTerminal, Writer: os.Stdout})
jsonFile, _ := formatter.New(formatter.Config{Format: formatter.FormatJSON, Writer: file})
tee, _ := formatter.NewTee(terminal, jsonFile)
tee.Format(ctx, finding) // Writes to both
Parallele Übermittlung (Aggregator):
agg := formatter.NewAggregator(f, 100) // buffer size 100
// From multiple goroutines
go func() { agg.Submit(ctx, finding1) }()
go func() { agg.Submit(ctx, finding2) }()
agg.Close() // Wait for all writes
pkg/clisurface - CLI-Dokumentations-Drift-GateDurchläuft einen Cobra-Befehlbaum und generiert, fügt zusammen und prüft die daraus erstellten Dokumentationsartefakte, sodass committete Dokumente nicht stillschweigend vom Binary abweichen können. Erstellen Sie ein Docs mit clisurface.New, verwenden Sie dann Docs.Write zum Neugenerieren und Docs.CheckArtifacts plus Docs.LintRepo, um CI fehlschlagen zu lassen, wenn die committeten Dateien, Prosa oder Go-Kommentare nicht mehr mit der CLI übereinstimmen. Siehe go doc ./pkg/clisurface für die vollständige API.
┌─────────────────────────────────────────────────────────────────────┐
│ STANDALONE TOOL │
│ Implements: capability.Capability │
│ Produces: []capability.Finding │
└────────────────────────────┬────────────────────────────────────────┘
│
┌──────────────┴──────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────────-────────┐
│ CLI OUTPUT PATH │ │ CHARIOT INTEGRATION PATH │
│ │ │ │
│ capability.Finding │ │ capability.Finding │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ formatter.Finding │ │ Chariot Adapter (in chariot repo) │
│ (FromCapabilityFinding)│ │ │ │
│ │ │ │ ▼ │
│ ▼ │ │ Tabularium Model (Asset/Risk/Attr) │
│ Terminal/JSON/SARIF │ │ │ │
│ │ │ ▼ │
│ stdout/file │ │ job.Send() → Storage │
└─────────────────────────┘ └───────────────────────────────-──────┘
git_repo target type for X"pkg/capability/target.go hinzufügen:
TargetGitRepo TargetType = "git_repo"
Valid()-Methode aktualisierenrelationship finding type for X"pkg/capability/finding.go hinzufügenpkg/formatter/capability_converter.go aktualisierendiocletian - Cloud-SicherheitsscannerApache License 2.0. Siehe LICENSE.
Die Lizenz wird einmalig im Repository-Stamm angegeben. Fügen Sie keine urheberrechtlichen oder lizenzrechtlichen Header pro Datei hinzu — auch nicht beim Portieren von Code aus einem Schwesterprojekt, das solche Header enthält. Eine LICENSE im Stammverzeichnis ist die maßgebliche Erklärung; es ist nicht erforderlich, sie in jeder Datei zu wiederholen.