Skip to content

Approving Registrations

Review, verify, and approve pending client registrations.

New agent registrations appear in the pending queue:

┌─────────────────────────────────────────────────────────────┐
│ Pending Registrations (5) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────┬────────────────┬─────────┬───────────┐ │
│ │ Client │ IP Address │ Age │ Actions │ │
│ ├────────────────┼────────────────┼─────────┼───────────┤ │
│ │ web-prod-01 │ 192.168.1.100 │ 5 min │ [···] │ │
│ │ web-prod-02 │ 192.168.1.101 │ 3 min │ [···] │ │
│ │ api-prod-01 │ 192.168.1.110 │ 1 min │ [···] │ │
│ │ unknown-01 │ 10.0.0.50 │ 30 min │ [···] │ │
│ │ test-server │ 172.16.0.25 │ 2 hrs │ [···] │ │
│ └────────────────┴────────────────┴─────────┴───────────┘ │
│ │
│ [Approve All] [Reject All Stale] │
│ │
└─────────────────────────────────────────────────────────────┘

Before approving, review the registration details:

┌─────────────────────────────────────────────────────────────┐
│ Review Registration │
├─────────────────────────────────────────────────────────────┤
│ │
│ Status: ○ Pending Approval │
│ │
│ ───────────────────────────────────────────────────────── │
│ │
│ Client Details: │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Name: web-prod-01 │ │
│ │ Hostname: web-prod-01.example.com │ │
│ │ IP Address: 192.168.1.100 │ │
│ │ Machine ID: 550e8400-e29b-41d4-a716... │ │
│ │ Registered: 5 minutes ago │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ Certificate Thumbprint: │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90: │ │
│ │ 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF │ │
│ │ │ │
│ │ [Copy] [View Certificate] │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ Verification Checklist: │
│ ☐ Hostname matches expected server │
│ ☐ IP address is from known network │
│ ☐ Registration timing is expected │
│ ☐ Thumbprint verified (if pre-registered) │
│ │
│ [Reject] [Request Info] [Approve] │
│ │
└─────────────────────────────────────────────────────────────┘
  1. Navigate to Registrations in Lens
  2. Find the pending registration
  3. Click to view details
  4. Verify client information
  5. Click Approve
┌─────────────────────────────────────────────────────────────┐
│ Approve Registration │
├─────────────────────────────────────────────────────────────┤
│ │
│ You are approving: │
│ Client: web-prod-01 │
│ Thumbprint: ABCDEF1234... │
│ │
│ Assign to Tenant (optional): │
│ [Acme Corp ▼] │
│ │
│ Notes: │
│ [Verified via infrastructure team ticket OPS-1234 ] │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ ⚠ Once approved, this client can receive deployments.│ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ [Cancel] [Approve] │
│ │
└─────────────────────────────────────────────────────────────┘

For multiple registrations from a trusted source:

┌─────────────────────────────────────────────────────────────┐
│ Bulk Approve Registrations │
├─────────────────────────────────────────────────────────────┤
│ │
│ Selected: 3 registrations │
│ │
│ ☑ web-prod-01 192.168.1.100 5 min ago │
│ ☑ web-prod-02 192.168.1.101 3 min ago │
│ ☑ api-prod-01 192.168.1.110 1 min ago │
│ │
│ Assign to Tenant: │
│ [Acme Corp ▼] │
│ │
│ Notes: │
│ [Bulk approval for new production cluster ] │
│ │
│ [Cancel] [Approve Selected] │
│ │
└─────────────────────────────────────────────────────────────┘

Client certificate registrations are approved with mantisctl cert.

Terminal window
# Approve by registration ID (or thumbprint prefix)
mantisctl cert approve 550e8400-e29b-41d4-a716-446655440000
# Approve with notes
mantisctl cert approve 550e8400-e29b-41d4-a716-446655440000 \
--notes "Verified via ticket OPS-1234"
Terminal window
# Approve all pending registrations from a specific IP range
mantisctl cert list --status pending --verbose | \
grep "192.168.1." | awk '{print $1}' | \
xargs -I {} mantisctl cert approve {}

Check that the hostname matches expected servers:

Hostname PatternExpected Source
web-prod-*Production web servers
api-prod-*Production API servers
db-prod-*Production database servers
*-staging-*Staging environment

Confirm IP is from a known network:

IP RangeEnvironment
192.168.1.0/24Production
192.168.2.0/24Staging
10.0.0.0/8Internal

Check when the registration occurred:

TimingInterpretation
Just nowExpected during deployment
Hours agoMay be legitimate, verify
Days agoLikely stale, investigate

For pre-registered clients, verify thumbprint matches:

Terminal window
# On the target server, get the certificate thumbprint (built-in command)
tarsus show-thumbprint
# Compare with registration thumbprint in Mantis

Assign registrations to tenants for multi-tenant environments:

┌─────────────────────────────────────────────────────────────┐
│ Tenant Assignment │
├─────────────────────────────────────────────────────────────┤
│ │
│ Select Tenant: │
│ ○ None (Global) │
│ ● Acme Corp │
│ ○ Beta Inc │
│ ○ Gamma LLC │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Assigning to tenant restricts this target to only │ │
│ │ receive deployments from that tenant. │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Tenant assignment for a target is performed in Lens or via the REST API, not through mantisctl cert. After approving a registration, set the target’s tenant from the target’s detail view in Lens, or pre-scope registrations by issuing a tenant-scoped registration token (mantisctl registration create --tenant-id <id>).

Reject registrations when:

ReasonAction
Unknown sourceReject, investigate
Wrong networkReject, contact team
Suspicious timingReject, alert security
DuplicateReject duplicate
Expired requestReject stale entries
┌─────────────────────────────────────────────────────────────┐
│ Reject Registration │
├─────────────────────────────────────────────────────────────┤
│ │
│ You are rejecting: │
│ Client: unknown-01 │
│ IP: 10.0.0.50 │
│ │
│ Reason (optional but recommended): │
│ [Unknown source - not from expected network ] │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ The registration will be marked as rejected. The │ │
│ │ client must re-register if this was a mistake. │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ [Cancel] [Reject] │
│ │
└─────────────────────────────────────────────────────────────┘
Terminal window
# Reject a registration (by ID or thumbprint prefix)
mantisctl cert reject <id> --reason "Unknown source"

To skip manual approval, register agents with a registration token that has auto-approve enabled. Clients that register using such a token are approved automatically — there is no separate conditional rules engine (no approve-by-IP-range or approve-by-hostname-pattern rules). The only auto-approve mechanism is the per-token auto_approve flag.

See Registration Tokens for how to create an auto-approving token and the trade-offs involved.

Receive notifications for pending registrations by configuring a webhook notification channel and subscribing it to the client_registration_pending event. This is done through the REST API or the Lens notifications settings; there is no mantisctl webhook subcommand.

First, create a webhook channel:

Terminal window
curl -X POST https://mantis.example.com/api/v1/notifications/channels \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "registration-notify",
"channel_type": "webhook",
"webhook_url": "https://hooks.example.com/registration"
}'

Then create a subscription that filters on the registration event, using the channel ID returned above:

Terminal window
curl -X POST https://mantis.example.com/api/v1/notifications/subscriptions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "pending-registrations",
"channel_id": "<channel-id>",
"filters": [
{
"filter_type": "event_type",
"filter_values": ["client_registration_pending"]
}
]
}'

Registration approval and rejection actions are logged to the server’s structured log output (at INFO level). Approval events include the client name, thumbprint, and the identity of the approver; rejection events include the same fields plus the rejection reason.

Until database audit logging is implemented for registrations, use mantisctl cert list to inspect current registration state:

Terminal window
# List all registrations and their current status
mantisctl cert list --status approved --verbose
# List rejected (revoked) registrations
mantisctl cert list --status revoked --verbose

Define a standard verification process:

## Registration Approval Checklist
Before approving, verify:
1. [ ] Hostname matches naming convention
2. [ ] IP address is from expected network
3. [ ] Registration timing matches deployment
4. [ ] If pre-registered, thumbprint matches
5. [ ] Requestor has documented the need (ticket #)

Always assign to appropriate tenant:

EnvironmentTenant Assignment
ProductionProduction tenant
StagingStaging tenant
DevelopmentDevelopment tenant
SharedNo tenant (global)

Include notes with every approval:

Terminal window
mantisctl cert approve <id> \
--notes "Ticket: OPS-1234, Requestor: Alice, Purpose: New web cluster"

Review pending queue regularly:

  • Daily for high-security environments
  • Weekly for standard environments
  • Immediately for unexpected registrations

Remove old pending registrations:

Terminal window
# List pending registrations to identify stale entries
mantisctl cert list --status pending --verbose
# Reject stale entries individually (by ID or thumbprint prefix)
mantisctl cert reject <id> \
--reason "Auto-rejected: registration expired"

Cause: Registration may have been rejected or expired

Solution:

  1. Check if registration was previously rejected
  2. Ask agent administrator to re-register
  3. Check audit logs for rejection event

Cause: Permission or validation issue

Solution:

  1. Verify user has approval permission
  2. Check if registration is still pending
  3. Review error message for specific issue

Cause: Incorrect selection during approval

Solution:

  1. Update the target’s tenant assignment from the target detail view in Lens
  2. Or revoke the registration and re-register with a tenant-scoped token