Appearance
Canary Token Inventory
Classification: RESTRICTED — Security Operations Only
Owner: Rory Garshol (IT/Security)
Last verified: 2026-04-13
Next review: 2026-05-13
Purpose
This document is the authoritative inventory of all deployed canary tokens and canary files in the Cirius Group environment. Canary tokens are deception layer tripwires — any access to a canary resource triggers an immediate CRITICAL incident in SecOps with no suppression.
Rule: Never open, access, or use any resource listed here. Doing so will trigger a CRITICAL security incident. These resources exist only to detect unauthorized access.
Canary Tokens (canarytokens.org)
CT-001 — AWS Access Key Token (DECP-001)
| Field | Value |
|---|---|
| Token type | aws-keys (IaC honeytoken — not canarytokens.org) |
| Purpose | Decoy AWS credentials — detects credential harvesting / use |
| Decoy principal | IAM user svc-backup-replication (Logging account) — explicit deny-all |
| Bait location | SSM SecureString /backup/replication/aws-credentials (Logging account) |
| Detection | CloudTrail → metric filter canary-aws-key-used → CloudWatch alarm → security_alerts SNS |
| Defined in | aws-infra/logging/canary_aws_key.tf (PR #991) |
| Last verified | 2026-06-21 — Apply complete! 6 added (resources confirmed created) |
| Status | ACTIVE — armed via Terraform |
How it works: the decoy IAM user has an explicit deny-all policy, so its access key can do nothing. The key is planted as bait in an SSM SecureString a post-compromise attacker would enumerate. Because the key is never used legitimately, any appearance of its key id in CloudTrail trips the canary-aws-key-used alarm (CRITICAL) to the security_alerts SNS topic.
Maintenance: managed in Terraform — to rotate or change the bait, edit aws-infra/logging/canary_aws_key.tf and apply. No manual canarytokens.org step.
CT-002 — SharePoint Document Token (DECP-002)
| Field | Value |
|---|---|
| Token type | ms-word or pdf |
| Purpose | Canary document in SharePoint — detects unauthorized document access |
| Location | SharePoint Security site → Restricted Documents library |
| Webhook URL | https://soc.bedrockcybersecurity.org/webhooks/canary?secret=<KV:canary-webhook-secret> |
| Alert email | security@ciriusgroup.com |
| canarytokens.org token | ajxunu0hbv77rra0nrwo3hi1h |
| Last verified | 2026-06-27 |
| Status | ACTIVE — PHI-Patient-Records-Q4-2025.docx uploaded to SharePoint Security site → Restricted Documents |
Notes: SharePoint document upload requires delegated Graph API permissions. Rory must manually upload the canary document. Recommend using a Word or PDF token from canarytokens.org and naming the file "PHI-Patient-Records-Q4-2025.docx" with a realistic-looking SharePoint path.
CT-003 — DNS Canary Token (DECP-003)
| Field | Value |
|---|---|
| Token type | dns |
| Purpose | DNS-based tripwire — any DNS lookup triggers the alert |
| Canary domain | 1jc6alp4tev0qpj3429rc0ps7.canarytokens.com |
| Webhook URL | https://soc.bedrockcybersecurity.org/webhooks/canary?secret=<KV:canary-webhook-secret> |
| Alert email | security@ciriusgroup.com |
| canarytokens.org token | 1jc6alp4tev0qpj3429rc0ps7 |
| Last verified | 2026-06-27 |
| Status | ACTIVE — embed hostname in config files and connection strings |
How it works: canarytokens.org generates a unique subdomain (e.g., abc123.canarytokens.com). Embed this domain in configuration files, scripts, or database connection strings. Any DNS resolution of this domain (e.g., during credential testing) fires the alert immediately.
Deployment steps for Rory:
- Go to canarytokens.org → Generate → DNS
- Set webhook URL to the SecOps webhook URL with canary secret
- Note the generated canary domain (e.g.,
abc123.canarytokens.com) - Embed this domain in: fake configuration files, DB connection strings (DECP-004)
- Update this inventory with the canary domain
CT-004 — URL Token per Infra Repo (DECP-004)
| Field | Value |
|---|---|
| Token type | web (URL) |
| Purpose | Fake DB connection strings in infra repos — detects repo cloning with credential testing |
| Locations | azure-infra, aws-infra, azure-dde-infra, ops-automation, bedrock-hub |
| Webhook URL | https://soc.bedrockcybersecurity.org/webhooks/canary?secret=<KV:canary-webhook-secret> |
| Alert email | security@ciriusgroup.com |
| canarytokens.org token | jo6cn7v7b15v31va1bkgg9cls |
| Last verified | 2026-06-27 |
| Status | ACTIVE — embedded in bedrock-hub, bedrock-soc, bedrock-grc, bedrock-infra, bedrock-scanner |
How it works: A URL-type canary token generates a unique URL that fires when fetched. Embed this URL as a fake webhook endpoint or API URL in non-sensitive config files in each infra repo. If an attacker clones the repo and attempts to test/validate any URLs found, the canary fires.
Deployment steps for Rory:
- Go to canarytokens.org → Generate → Web (URL)
- Create one token shared across repos (or one per repo for granularity)
- Add a comment block to a README or config file in each repo with the URL embedded as a "legacy webhook endpoint" or "monitoring URL"
- PR the change to each repo
Canary Files (Storage Canaries)
CF-001 — AWS S3 Canary File (DECP-009)
| Field | Value |
|---|---|
| Type | Honeyfile (fake credentials) |
| Location | s3://cirius-veeam-prod-bucket/security/PHI-patient-records-backup.txt |
| File name | PHI-patient-records-backup.txt |
| Content | Fake AWS keys, Azure connection string, PostgreSQL connection string |
| Monitored by | canary_agent.py (periodic existence check) |
| Alert if missing | CRITICAL incident via SecOps |
| Deployed | 2026-04-13 — PENDING (CloudPCRole lacks PutObject; deploy from CI/CD) |
| Last verified | Pending |
Deployment steps for Rory (run from GitHub Actions or a host with S3 write access):
bash
aws s3 cp PHI-patient-records-backup.txt s3://cirius-veeam-prod-bucket/security/PHI-patient-records-backup.txtCF-002 — Azure PROD Canary File (DECP-009)
| Field | Value |
|---|---|
| Type | Honeyfile (fake credentials) |
| Storage account | ciriusarchiveprod (logging subscription) |
| Container | canary (private, no public access) |
| Blob name | PHI-patient-records-backup.txt |
| Monitored by | canary_agent.py |
| Alert if missing | CRITICAL incident via SecOps |
| Deployed | Pending — network deny rules block deployment from Cloud PC |
| Last verified | Pending |
Deployment steps for Rory (run from a whitelisted IP — home or GitHub Actions):
bash
az storage container create --name canary --account-name ciriusarchiveprod --auth-mode login --public-access off
az storage blob upload --account-name ciriusarchiveprod --container-name canary --name PHI-patient-records-backup.txt --file PHI-patient-records-backup.txt --auth-mode loginContainer App env var to set:
CANARY_AZURE_PROD_ACCOUNT=ciriusarchiveprod
CANARY_AZURE_PROD_CONTAINER=canary
CANARY_AZURE_PROD_BLOB=PHI-patient-records-backup.txtCF-003 — Azure DDE Canary File (DECP-009)
| Field | Value |
|---|---|
| Type | Honeyfile (fake credentials) |
| Storage account | ciriusddearchiveprod (DDE subscription) |
| Container | canary (private) |
| Blob name | PHI-patient-records-backup.txt |
| Monitored by | canary_agent.py |
| Alert if missing | CRITICAL incident via SecOps |
| Deployed | Pending |
| Last verified | Pending |
Deployment steps for Rory:
bash
AZURE_CONFIG_DIR=~/.azure-dde az storage container create --name canary --account-name ciriusddearchiveprod --auth-mode login --public-access off
AZURE_CONFIG_DIR=~/.azure-dde az storage blob upload --account-name ciriusddearchiveprod --container-name canary --name PHI-patient-records-backup.txt --file PHI-patient-records-backup.txt --auth-mode loginContainer App env var to set:
CANARY_AZURE_DDE_ACCOUNT=ciriusddearchiveprod
CANARY_AZURE_DDE_CONTAINER=canary
CANARY_AZURE_DDE_BLOB=PHI-patient-records-backup.txtEntra ID Decoy Accounts (DECP-008)
DA-001 — svc-legacy-reporting
| Field | Value |
|---|---|
| UPN | svc-legacy-reporting@ciriusgroup.com |
| Display name | svc-legacy-reporting |
| Tenant | Azure PROD (d477c9f8) |
| Group memberships | None |
| Resource access | None |
| Purpose | Triggers when an attacker enumerates Entra and attempts to use a service account |
| Monitored by | identity_agent.py (SignInLogs), canary_agent.py (existence check) |
| Created | Pending — requires User Administrator role (current SP lacks this role) |
| Status | PENDING — Rory needs to assign User Administrator role to create this account |
Deployment steps for Rory:
- Assign yourself the "User Administrator" role in Entra PROD → Roles and administrators
- Then run:
bash
az ad user create --display-name "svc-legacy-reporting" --user-principal-name "svc-legacy-reporting@ciriusgroup.com" --password "<strong-random-password>" --force-change-password-next-sign-in false- Verify: no group memberships, no license, no resource access
- Add a Conditional Access policy exclusion for monitoring (allow sign-in for detection purposes)
- Update this inventory with the account object ID
Container App env var to set:
CANARY_ENTRA_DECOY_UPN=svc-legacy-reporting@ciriusgroup.comRequired Key Vault Secrets
The following secrets must be stored in cirius-openai-kv-prod:
| KV Secret Name | Purpose |
|---|---|
canary-webhook-secret | Shared secret validating inbound canarytokens.org webhooks — include in webhook URL as ?secret=<value> |
The CANARY_WEBHOOK_SECRET env var must be set in both:
job-orchestrator-ciriusContainer App Jobca-secops-prodContainer App (for the/webhooks/canaryendpoint)
Monitoring Architecture
canarytokens.org ──[webhook POST]──► soc.bedrockcybersecurity.org/webhooks/canary
│
▼
Validate X-Canary-Secret
│
▼
POST /api/incidents/ (CRITICAL)
source_agents=["canary_agent"]
severity=CRITICAL
no suppression ever
canary_agent.py (4hr cycle) ──► check S3 file exists
──► check Azure PROD blob exists
──► check Azure DDE blob exists
──► check Entra decoy account exists
└──► CRITICAL incident if any missingIncident Response
Any CRITICAL incident with source_agents=["canary_agent"] means:
- Do not dismiss without full investigation — canary triggers have no false positive path
- Identify source IP from incident details
- Block source IP at Palo Alto perimeter immediately
- Check Entra sign-in logs for any activity from that IP
- Check CloudTrail for any AWS API calls with the fake credentials
- Assume full compromise until proven otherwise — activate IR runbook
- Do NOT reset canary credentials until forensics are complete (evidence preservation)
- After investigation, re-deploy the canary with new canarytokens.org tokens
This document is maintained by Kobe (infrastructure agent). Update after any canary deployment, rotation, or incident.