Description
Generate realistic but entirely synthetic data sets to populate deception assets. This includes database records, file contents, email archives, and configuration files that look authentic without containing any real sensitive information.
Rationale
Empty databases and blank file systems immediately reveal a deception environment. Adversaries expect to find data on the systems they compromise, and the absence of data is as suspicious as obviously fake data. Synthetic data generation solves this problem by creating plausible content that withstands inspection without creating compliance or privacy risks.
Supporting Basis
Direct antecedentThe sources generate or discuss believable synthetic document content for monitored decoys.
- Bowen, B.M. et al. Baiting Inside Attackers Using Decoy Documents. SecureComm 2009, 51–70.Peer reviewed
- Yuill, J.; Zappe, M.; Denning, D.; Feer, F. Honeyfiles: Deceptive Files for Intrusion Detection. IEEE SMC Information Assurance Workshop 2004, 116–122.Peer reviewed
These sources establish design lineage and scope. They do not validate this record's operational effectiveness, planning estimates, environment labels, or ATT&CK relationships.
Implementation Steps
Define data profiles
Determine what types of data each deception asset should contain based on its role. A decoy file server needs documents. A decoy database needs records.
Generate synthetic records
Use data generation tools to create realistic datasets. Include appropriate variety, formatting, and volume to match what production systems would contain.
Embed tracking mechanisms
Include canary tokens, unique identifiers, or watermarks in synthetic data that will trigger alerts if the data is accessed or exfiltrated.
Populate deception assets
Distribute generated data across deception assets. Ensure file timestamps, modification histories, and access patterns look organic.
Validate against real data profiles
Compare synthetic data against production data profiles (without using actual production data) to confirm statistical plausibility.
Technical Implementation Examples(1)
Synthetic Data Generation for Decoy Databases
Python script using Faker to generate realistic but entirely synthetic customer records, financial data, and configuration files
"""
Synthetic Data Generator for Deception Environments.
Generates realistic-looking data for seeding decoy databases,
file shares, and applications. All data is entirely synthetic -
no real PII is used.
"""
from faker import Faker
import json
import csv
import random
import hashlib
import io
from datetime import datetime, timedelta
fake = Faker()
Faker.seed(42) # Reproducible but realistic output
def generate_customer_records(count=500):
"""Generate synthetic customer records for a decoy database."""
records = []
for i in range(count):
created = fake.date_time_between(start_date="-3y", end_date="now")
records.append({
"customer_id": f"CUS-{10000 + i}",
"first_name": fake.first_name(),
"last_name": fake.last_name(),
"email": fake.company_email(),
"phone": fake.phone_number(),
"address": fake.street_address(),
"city": fake.city(),
"state": fake.state_abbr(),
"zip": fake.zipcode(),
"account_type": random.choice([
"checking", "savings", "business", "premium"
]),
"balance": round(random.uniform(100, 250000), 2),
"created_at": created.isoformat(),
"last_login": (
created + timedelta(days=random.randint(1, 365))
).isoformat(),
"status": random.choices(
["active", "inactive", "suspended"],
weights=[85, 10, 5],
)[0],
})
return records
def generate_employee_directory(count=150):
"""Generate synthetic employee directory for AD-like data."""
departments = [
"Engineering", "Finance", "HR", "Legal", "Marketing",
"Operations", "Sales", "IT", "Security", "Executive",
]
titles = {
"Engineering": ["Software Engineer", "Senior Developer",
"Tech Lead", "DevOps Engineer"],
"Finance": ["Financial Analyst", "Controller",
"Accounts Manager", "CFO"],
"IT": ["Systems Administrator", "Network Engineer",
"Help Desk", "IT Manager"],
"Security": ["Security Analyst", "SOC Analyst",
"CISO", "Threat Hunter"],
}
employees = []
for i in range(count):
dept = random.choice(departments)
first = fake.first_name()
last = fake.last_name()
username = f"{first[0].lower()}.{last.lower()}"
employees.append({
"employee_id": f"EMP-{2000 + i}",
"username": username,
"email": f"{username}@corp.internal",
"first_name": first,
"last_name": last,
"department": dept,
"title": random.choice(
titles.get(dept, ["Analyst", "Manager", "Director"])
),
"manager": fake.name(),
"office": f"Building {random.choice('ABC')}-"
f"{random.randint(1,5)}{random.randint(0,30):02d}",
"phone_ext": str(random.randint(1000, 9999)),
"hire_date": fake.date_between(
start_date="-10y", end_date="-30d"
).isoformat(),
"status": "active",
})
return employees
def generate_network_config_files():
"""Generate realistic network configuration files with trap data."""
configs = {
"database.env": """# Production Database Configuration
# Auto-generated by deployment pipeline
DB_HOST=prod-db-01.corp.internal
DB_PORT=5432
DB_NAME=customerdb
DB_USER=app_svc_prod
DB_PASS=Pr0d-Db#2026!xK9m
DB_SSL=require
DB_POOL_SIZE=25
REDIS_URL=redis://cache-01.corp.internal:6379/0
""",
".aws/credentials": """[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region = us-east-1
[prod-deploy]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
region = us-east-1
""",
"backup-config.sh": """#!/bin/bash
# Nightly backup script - runs via cron at 02:00
BACKUP_USER="backup_svc"
BACKUP_PASS="B4ckup#Nightly_2026"
BACKUP_HOST="nas-01.corp.internal"
BACKUP_PATH="/mnt/backups/production"
pg_dump -h prod-db-01.corp.internal \
-U $BACKUP_USER -d customerdb \
| gzip > "$BACKUP_PATH/db_$(date +%Y%m%d).sql.gz"
""",
}
return configs
if __name__ == "__main__":
# Generate all synthetic data
customers = generate_customer_records(500)
employees = generate_employee_directory(150)
configs = generate_network_config_files()
# Output customer records as CSV
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=customers[0].keys())
writer.writeheader()
writer.writerows(customers)
with open("synthetic_customers.csv", "w") as f:
f.write(output.getvalue())
# Output employee directory as JSON
with open("synthetic_employees.json", "w") as f:
json.dump(employees, f, indent=2)
# Output config files
for filename, content in configs.items():
safe_name = filename.replace("/", "_").replace(".", "_")
with open(f"decoy_{safe_name}", "w") as f:
f.write(content)
print(f"Generated {len(customers)} customer records")
print(f"Generated {len(employees)} employee records")
print(f"Generated {len(configs)} config files with trap credentials")MITRE ATT&CK Mappings
| Technique | Tactic | Relationship |
|---|---|---|
| T1005Data from Local System | Collection | detects |
| T1039Data from Network Shared Drive | Collection | detects |
Considerations
- Never use real production data in deception environments. The compliance and liability risks far outweigh the realism benefit.
- Synthetic data should include plausible imperfections. Perfectly formatted, evenly distributed data looks machine-generated because it is.
- Consider including data that looks deliberately sensitive (financial records, credentials, architectural diagrams) to attract adversary attention.
Supported Environments
Tools & Resources
- Faker libraries (Python faker, JavaScript faker)
- Synthetic data platforms
- Custom generation scripts
- Canary token services for embedding tracking
Related Techniques
Quick Stats
- Phase
- Prepare
- Difficulty
- intermediate
- Detection Value
- high
- Cost
- low
- Time
- 1-2 weeks
- ATT&CK Mappings
- 2