Identity Watchlist User Guide
Audience: Security operators, compliance owners, and CI/release engineers who manage signing trust in Stella Ops.
Purpose: Configure and operate the Attestor identity watchlist to detect when specific signing identities appear in Rekor transparency log entries, and to route alerts when they do.
Overview
The identity watchlist enables proactive alerting when specific signing identities appear in Rekor transparency log entries. Common use cases:
- Threat Detection: Monitor for known malicious or compromised signing identities
- Compliance Monitoring: Track when specific OIDC issuers sign artifacts
- Operational Awareness: Get notified when CI/CD workflows from specific repositories sign releases
- Key Tracking: Monitor usage of specific signing keys across your organization
Core Concepts
Watchlist Entries
A watchlist entry defines an identity pattern to monitor and alert configuration:
| Field | Description | Required |
|---|---|---|
displayName | Human-readable label | Yes |
description | Why this identity is watched | No |
issuer | OIDC issuer URL pattern | At least one of issuer, subjectAlternativeName, or keyId |
subjectAlternativeName | Certificate SAN pattern | At least one of issuer, subjectAlternativeName, or keyId |
keyId | Key identifier for keyful signing | At least one of issuer, subjectAlternativeName, or keyId |
matchMode | Pattern matching mode | No (default: exact) |
severity | Alert severity level | No (default: warning) |
enabled | Whether entry is active | No (default: true) |
scope | Visibility scope | No (default: tenant) |
You must supply at least one of issuer, subjectAlternativeName, or keyId so the entry has an identity dimension to match against.
Match Modes
| Mode | Description | Example Pattern | Matches |
|---|---|---|---|
exact | Case-insensitive equality | https://accounts.google.com | Only that exact URL |
prefix | Starts with pattern | https://token.actions. | Any GitHub Actions issuer |
glob | Wildcard matching | *@example.com | Any email at example.com |
regex | Full regex (advanced) | user\d+@.* | user123@domain.com |
Note: Regex mode has a 100ms timeout and pattern validation. Use sparingly for performance-critical environments.
Severity Levels
| Level | Use Case | Notification Priority |
|---|---|---|
info | Informational tracking | Low |
warning | Unexpected but not critical (default) | Medium |
critical | Immediate attention required | High |
Scope Levels
| Scope | Description | Who Can Create |
|---|---|---|
tenant | Visible only to owning tenant | Any user with trust:write |
global | Shared across all tenants | Administrators with trust:admin |
system | System-managed entries | System only |
Console and frontdoor watchlist flows use the canonical trust scope family: trust:read, trust:write, and trust:admin. Legacy watchlist:* aliases remain accepted for older clients, but new integrations should use the trust scopes.
CLI Usage
Adding a Watchlist Entry
Monitor a specific OIDC issuer:
stella watchlist add \
--issuer "https://token.actions.githubusercontent.com" \
--name "GitHub Actions" \
--severity warning \
--description "Track all GitHub Actions signatures"
Monitor email patterns with glob matching:
stella watchlist add \
--san "*@malicious-domain.com" \
--match-mode glob \
--severity critical \
--name "Malicious Domain"
Listing Entries
List all entries including global ones:
stella watchlist list --include-global
Output as JSON for scripting:
stella watchlist list --format json
Testing Patterns
Test if an identity would trigger an alert:
stella watchlist test <entry-id> \
--issuer "https://token.actions.githubusercontent.com" \
--san "repo:org/repo:ref:refs/heads/main"
Managing Entries
Update an entry:
stella watchlist update <entry-id> --enabled false
stella watchlist update <entry-id> --severity critical
Delete an entry:
stella watchlist remove <entry-id>
stella watchlist remove <entry-id> --force # Skip confirmation
Viewing Alerts
List recent alerts:
stella watchlist alerts --since 24h
stella watchlist alerts --severity critical --limit 50
API Usage
Create Entry
POST /api/v1/watchlist
Content-Type: application/json
{
"displayName": "GitHub Actions Monitor",
"issuer": "https://token.actions.githubusercontent.com",
"matchMode": "prefix",
"severity": "warning",
"description": "Monitor all GitHub Actions signatures",
"enabled": true,
"suppressDuplicatesMinutes": 60
}
List Entries
GET /api/v1/watchlist?includeGlobal=true
Test Pattern
POST /api/v1/watchlist/{id}/test
Content-Type: application/json
{
"issuer": "https://token.actions.githubusercontent.com",
"subjectAlternativeName": "repo:org/repo:ref:refs/heads/main"
}
Alert Deduplication
To prevent alert storms, the watchlist system deduplicates alerts based on:
- Watchlist Entry ID - Which entry triggered the alert
- Identity Hash - SHA-256 of the matched identity fields
Configure the deduplication window per entry with suppressDuplicatesMinutes (default: 60 minutes).
When an alert is suppressed, subsequent alerts will include a suppressedCount indicating how many similar alerts were skipped.
Best Practices
Pattern Design
- Start specific, broaden as needed: Begin with exact matches before using wildcards
- Test before deploying: Use the test endpoint to validate patterns
- Document why: Always include a description explaining the monitoring purpose
- Use appropriate match modes:
exactfor known bad actorsprefixfor issuer families (e.g., all Google issuers)globfor email/SAN patternsregexonly when simpler modes can’t express the pattern
Performance Considerations
- Limit regex patterns to < 256 characters
- Avoid catastrophic backtracking patterns (e.g.,
(a+)+) - Monitor the
attestor.watchlist.scan_latency_secondsmetric - Keep watchlist size reasonable (< 1000 entries per tenant)
Alert Management
- Set appropriate severity: Reserve
criticalfor genuine emergencies - Configure dedup windows: Use shorter windows (5-15 min) for critical entries
- Review suppressed counts: High counts may indicate a pattern is too broad
- Route appropriately: Use channel overrides for sensitive entries
Monitoring & Metrics
The following OpenTelemetry metrics are exposed:
| Metric | Description |
|---|---|
attestor.watchlist.entries_scanned_total | Total Rekor entries processed |
attestor.watchlist.matches_total{severity} | Pattern matches by severity |
attestor.watchlist.alerts_emitted_total | Alerts sent to notification system |
attestor.watchlist.alerts_suppressed_total | Alerts suppressed by deduplication |
attestor.watchlist.scan_latency_seconds | Per-entry scan duration |
Troubleshooting
Entry Not Matching Expected Identity
- Verify the match mode is appropriate for your pattern
- Use the test endpoint with verbose output
- Check if the entry is enabled
- Remember that all match modes are case-insensitive — a pattern that relies on case will not behave as expected
Too Many Alerts
- Increase
suppressDuplicatesMinutes - Narrow the pattern (more specific issuer, SAN prefix)
- Consider if the pattern is too broad
Missing Alerts
- Verify the entry is enabled
- Check if alerts are being suppressed (view suppressed count)
- Verify notification routing is configured
- Check service logs for matching errors
