◆ 2026-10-17 · article — Choosing a SIEM by what you already run◆ 2026-10-17 · article — How long should a passphrase be? It depends on where the hash ends up◆ 2026-10-17 · article — What a SIEM costs you in people, not licenses◆ 2026-10-17 · article — Which logs do you actually have?◆ 2026-10-17 · blog — A web tool that can't phone home: connect-src 'none'◆ 2026-10-17 · download — log-source-inventory.yml◆ 2026-10-17 · article — Choosing a SIEM by what you already run◆ 2026-10-17 · article — How long should a passphrase be? It depends on where the hash ends up◆ 2026-10-17 · article — What a SIEM costs you in people, not licenses◆ 2026-10-17 · article — Which logs do you actually have?◆ 2026-10-17 · blog — A web tool that can't phone home: connect-src 'none'◆ 2026-10-17 · download — log-source-inventory.yml
01 — Who we are
A small purple team that writes down everything it learns. No vendor slides, no fear marketing — just detections that fire, attacks replayed in a lab to prove it, playbooks that work at 3 a.m., and the reasoning behind all of it.
/ 0x01
Detect
SIEM rule engineering for Wazuh, Sentinel and Defender — mapped to MITRE ATT&CK, tuned against noise.
/ 0x02
Respond
Incident playbooks and automation that turn an alert into a decision in minutes, not meetings.
/ 0x03
Harden
Baselines for endpoints and cloud tenants, plus awareness material people actually read.
/ 0x04
Validate
Adversary emulation in a lab with public tools: run the technique, check that the rule fires, fix what it misses.
01# =============================================================================02# Log source inventory — template03#04# Companion to:05# https://entropywatch.dev/articles/which-logs-do-you-actually-have/06# License: CC BY 4.0 — ENTROPY//WATCH07# Template version: 2026-10-1708#09# HOW TO USE10# 1. Write your questions first (section `questions`). Every source you list11# should answer at least one of them; every question should have a source.12# 2. One entry per SOURCE TYPE, not per host ("Windows domain controllers",13# not "DC01", "DC02"). List hosts only where coverage differs.14# 3. Fill a field only after you have checked it on a real system. Unknown is15# a valid answer: write `unknown`, not a guess.16# 4. Copy every gap you find into `gaps` and rank it.17#18# BEFORE YOU USE19# - ADAPT `questions` to your environment and threat model.20# - ADAPT `retention_target_days` per source: how far back YOUR incidents need21# to look, plus any legal or contractual requirement. Write down why.22# - DELETE the example entries (marked `example: true`) once you have your own.23# Every hostname, domain and IP below is a documentation placeholder.24# - Treat the finished file as sensitive: it is a map of what you can and25# cannot see. Do not publish your filled-in copy.26# =============================================================================2728as_of: YYYY-MM-DD # date of the last full review29owner:""# person or team who keeps this file current30review_every: quarterly # and after any SIEM, agent or audit-policy change3132# -----------------------------------------------------------------------------33# 1. Questions an investigation must be able to answer34# Start here. Sources exist to answer questions, not the other way round.35# -----------------------------------------------------------------------------36questions:37-id: Q138ask:"Who logged on where, when, and how (interactive, network, remote)?"39typical_sources:[domain controllers, Windows Security on members, Entra ID sign-ins, VPN, Linux auth]40-id: Q241ask:"What ran on this machine, with which command line, started by what?"42typical_sources:[Windows Security 4688 with command line, Sysmon, EDR, Linux auditd]43-id: Q344ask:"What did this machine talk to outside the network?"45typical_sources:[firewall allow + deny, DNS queries, web proxy, EDR network events]46-id: Q447ask:"What changed in identity and privileges (accounts, groups, roles, MFA)?"48typical_sources:[domain controllers, Entra ID audit log, cloud control-plane logs]49-id: Q550ask:"What was read, sent or shared from mail and SaaS?"51typical_sources:[Microsoft 365 unified audit log, mailbox audit, SaaS admin logs]52-id: Q653ask:"Who changed the infrastructure (cloud resources, servers, network devices)?"54typical_sources:[Azure Activity log, AWS CloudTrail, network device AAA/config logs, Linux sudo]5556# -----------------------------------------------------------------------------57# 2. Sources — one entry per source type58#59# Field reference60# name what the source is61# category identity | endpoint | server | network | email_saas | cloud | application62# answers question ids from section 163# systems scope: how many systems, which are NOT covered64# records what is actually enabled (audit subcategories, event types)65# local_retention how far back the log on the system itself reaches TODAY66# central where it is forwarded (null if nowhere)67# central_retention_days how long the central copy is kept, per storage tier68# retention_target_days what you need (see BEFORE YOU USE)69# volume_gb_per_day measured, not estimated; null until measured70# time time source and timezone of the timestamps71# collection agent | syslog | API | none — and what alerts if it stops72# owner who can change the logging config73# verified YYYY-MM-DD + how (command, query, test event)74# known_gaps free text; copy each one into section 375# -----------------------------------------------------------------------------76sources:7778-name:"Windows domain controllers — Security log"79example:true80category: identity81answers:[Q1, Q4]82systems:"all DCs in corp.example (DC01, DC02)"83records:84-"Advanced Audit Policy per `auditpol /get /category:*` (paste or attach output)"85-"Account Logon / Kerberos Authentication Service: Success and Failure"86-"Account Management / Security Group Management: Success"87local_retention:"unknown — check: Get-WinEvent -LogName Security -MaxEvents 1 -Oldest"88central:"SIEM via agent"89central_retention_days:{hot:null,archive:null}90retention_target_days:null91volume_gb_per_day:null92time:"domain time hierarchy (PDC emulator → external NTP); timestamps UTC in SIEM"93collection:"agent; alert if no events for 1 h: not yet"94owner:"AD team"95verified:"YYYY-MM-DD — test failed logon seen in SIEM as 4771 / 4625"96known_gaps:97-"Security log max size never changed from default — check `wevtutil gl Security`"9899-name:"Windows member servers and workstations — Security + Sysmon"100example:true101category: endpoint102answers:[Q1, Q2]103systems:"all domain-joined Windows; NOT covered: kiosk machines outside the domain"104records:105-"4688 process creation — is 'Include command line in process creation events' enabled?"106-"Sysmon config version: ''"107local_retention: unknown108central:"SIEM via agent"109central_retention_days:{hot:null,archive:null}110retention_target_days:null111volume_gb_per_day:null112time:"domain time; check skew on laptops off the network"113collection:"agent"114owner:"endpoint team"115verified:""116known_gaps:[]117118-name:"Linux servers — auth, sudo, auditd"119example:true120category: server121answers:[Q1, Q2, Q6]122systems:"SRV-APP01..SRV-APP12; NOT covered: appliances without agent support"123records:124-"auth / secure log via rsyslog or journald"125-"auditd rules per `auditctl -l` (empty output = no rules loaded)"126local_retention:"check logrotate config and `journalctl --disk-usage`"127central:"SIEM via syslog"128central_retention_days:{hot:null,archive:null}129retention_target_days:null130volume_gb_per_day:null131time:"chrony/NTP; check whether syslog timestamps carry a timezone"132collection:"syslog; a stopped forwarder is silent — nothing alerts"133owner:"platform team"134verified:""135known_gaps:[]136137-name:"Perimeter firewall"138example:true139category: network140answers:[Q3]141systems:"fw01 (HQ), fw02 (branch)"142records:143-"deny: yes"144-"allow: unknown — many policies log denies only"145-"NAT translations: unknown (needed to map public IP back to an internal host)"146local_retention: unknown147central:"SIEM via syslog from 192.0.2.10"148central_retention_days:{hot:null,archive:null}149retention_target_days:null150volume_gb_per_day:null151time:"check device NTP and the timezone in the syslog header"152collection: syslog153owner:"network team"154verified:""155known_gaps:[]156157-name:"DNS — internal resolvers"158example:true159category: network160answers:[Q3]161systems:"Windows DNS on DC01, DC02"162records:163-"query logging: off unless enabled (Windows DNS analytic/debug logging is off by default)"164local_retention: n/a165central:null166central_retention_days:{hot:null,archive:null}167retention_target_days:null168volume_gb_per_day:null169time:""170collection: none171owner:"AD team"172verified:""173known_gaps:174-"No record of which host resolved which domain"175176-name:"Microsoft 365 — unified audit log, Entra ID sign-in and audit logs"177example:true178category: email_saas179answers:[Q1, Q4, Q5]180systems:"tenant contoso.example"181records:182-"unified audit log: on? (check in the Purview portal)"183-"sign-in and audit logs exported to SIEM: which categories?"184local_retention:"depends on license — check current Microsoft documentation"185central:"SIEM via API connector"186central_retention_days:{hot:null,archive:null}187retention_target_days:null188volume_gb_per_day:null189time:"UTC"190collection:"API; connector health alert: unknown"191owner:"M365 admins"192verified:""193known_gaps:[]194195# -----------------------------------------------------------------------------196# 3. Gaps — ranked197# impact: which question goes unanswered, for which systems198# fix_cost: low (config change) | medium (new collection/storage) | high (new product or project)199# -----------------------------------------------------------------------------200gaps:201-id: G1202example:true203source:"Windows domain controllers — Security log"204question: Q1205finding:"Local Security log reaches back N hours on DC01 at Monday peak"206impact:"If forwarding stops, logon history older than N hours is lost"207fix:"Raise max log size; add an alert on forwarding silence"208fix_cost: low209owner:"AD team"210status: open # open | planned | fixed | accepted211accepted_reason:""212213# -----------------------------------------------------------------------------214# 4. Verification commands (read-only)215# -----------------------------------------------------------------------------216checks:217windows:218-cmd:"auditpol /get /category:*"219shows:"which audit subcategories are enabled (run elevated)"220-cmd:"wevtutil gl Security"221shows:"maxSize and retention of the Security log"222-cmd:"Get-WinEvent -LogName Security -MaxEvents 1 -Oldest | Select-Object TimeCreated"223shows:"how far back the local Security log reaches right now"224linux:225-cmd:"auditctl -s"226shows:"whether auditd is enabled and how many events it lost"227-cmd:"auditctl -l"228shows:"loaded audit rules; 'No rules' means nothing beyond defaults"229-cmd:"journalctl --disk-usage"230shows:"space used by the journal"231-cmd:"journalctl -o short-iso | head -n 1"232shows:"oldest journal entry still on disk"233siem_microsoft_sentinel:234-query:"union withsource=SourceTable * | where TimeGenerated > ago(7d) | summarize LastEvent = max(TimeGenerated) by SourceTable | sort by LastEvent asc"235shows:"tables that went quiet first (expensive on big workspaces: narrow the time range)"236siem_wazuh:237-cmd:"/var/ossec/bin/agent_control -l"238shows:"agents and their status (Active, Disconnected, Never connected)"
01# =============================================================================02# SIEM selection matrix — Wazuh, Elastic Security, Microsoft Sentinel,03# IBM QRadar SIEM, Splunk Enterprise Security04#05# Companion to:06# https://entropywatch.dev/articles/choosing-a-siem-by-what-you-run/07# https://entropywatch.dev/articles/siem-operating-cost-in-people/08# License: CC BY 4.0 — ENTROPY//WATCH09# Facts as of: 2026-10-17 (vendor documentation; every fact carries its source)10#11# BEFORE YOU USE12# - This is a reading of vendor documentation, not a benchmark. Re-check every13# linked source on the day you decide: prices, tiers and grants change often.14# - ADAPT size_tiers to your security team's capacity, not company headcount.15# - ADAPT the filters to where your highest-value logs live (identity,16# endpoints, perimeter), not where most of your servers are.17# - Prices appear only where the vendor publishes them; "not published" means18# ask for a quote.19# =============================================================================2021as_of:2026-10-172223measure_first:24-metric: daily_volume_per_source25unit:"GB/day (Sentinel, Elastic Serverless, Splunk ingest), EPS/FPM (QRadar), alerts/s + agents (Wazuh)"26how:"Measure per source type (DCs or Entra sign-ins, firewall, proxy, endpoints, cloud audit) for at least one week."27-metric: engineering_hours_per_week28how:"Hours someone can really spend on parsers, tuning, upgrades and capacity — not headcount."2930size_tiers:31small:32definition:"No dedicated security staff; one IT generalist or security as part of an IT role."33microsoft_centric: Microsoft Sentinel34on_prem_or_zero_budget: Wazuh (single node)35linux_or_multi_cloud_with_search_skills: Elastic Security (Serverless Essentials)36avoid:37-"Splunk Free as a SIEM: no alerting, no users or roles, 500 MB/day."38-"Splunk ES: documented minimum 16 physical cores / 32 GB RAM per search head and indexer."39-"QRadar Community Edition in production: 3-month license, 100 EPS / 5,000 FPM."40mid_size:41definition:"Small security team, or one or two people plus an MSSP; hybrid infrastructure."42microsoft_heavy_hybrid:"Microsoft Sentinel with analytics tier for primary data, data lake tier for verbose logs"43mixed_or_non_microsoft:"Elastic Security (check which paid tier you can buy), or Wazuh as endpoint layer feeding a SIEM"44splunk_or_qradar_when:"Already owned, staff know SPL/AQL, or an MSSP runs it"45large:46definition:"24/7 SOC, detection engineers, platform/data team; hundreds of GB to TB per day."47deciding_questions:48-"Must data stay on-premises or in a specific jurisdiction?"49-"Which estate dominates: Microsoft, Cisco/Splunk, IBM, or mixed?"50-"Which query language does the current team already know: KQL, SPL, AQL, ES|QL?"51candidates:52- Splunk Enterprise Security53- Microsoft Sentinel54- IBM QRadar SIEM (existing estates, network flows, on-prem appliances)55- Elastic Security (especially where Elasticsearch already runs)56- Wazuh (endpoint/compliance layer; primary SIEM only with strong engineering)5758infrastructure_filters:59microsoft_365_entra_azure:60favors: Microsoft Sentinel61why:"Free data sources (Azure Activity, Office 365 audit, Defender alerts); M365 E5/A5/F5/G5/E7 grant up to 5 MB/user/day."62air_gapped_or_data_must_stay_on_prem:63excludes:[Microsoft Sentinel, Elastic Serverless, Splunk Cloud Platform]64remaining:[Wazuh, Elastic self-managed, IBM QRadar SIEM, Splunk Enterprise]65network_flows_first_class:66favors: IBM QRadar SIEM67why:"Licenses and processes flows (FPM) separately from events (EPS); dedicated Flow Collector/Processor."68linux_containers_multi_cloud:69neutral_options:[Wazuh, Elastic Security, Splunk Enterprise Security]7071platforms:72wazuh:73current_version:"4.14.x"74license:"GPLv2 and Apache 2.0"75deployment:"Self-managed (server, indexer, dashboard, agents) or Wazuh Cloud"76detection_language:"XML rules and decoders; custom rule IDs 100000-120000"77sizing_single_host_90_days:78-{agents:"1-25",cpu:"4 vCPU",ram:"8 GiB",storage:"50 GB"}79-{agents:"26-50",cpu:"8 vCPU",ram:"8 GiB",storage:"100 GB"}80-{agents:"51-100",cpu:"8 vCPU",ram:"8 GiB",storage:"200 GB"}81indexer_node:{min_ram:"4 GB",min_cpu:2,rec_ram:"16 GB",rec_cpu:8}82beyond_100_agents:"Distributed deployment: server cluster behind a load balancer, multi-node indexer"83upgrades:"Server, indexer, dashboard must match to patch level; agents must not be newer than the server"84ops_effort:"Low at small scale; medium to high distributed"85sources:86- https://documentation.wazuh.com/current/quickstart.html87- https://documentation.wazuh.com/current/installation-guide/wazuh-indexer/index.html88- https://documentation.wazuh.com/current/user-manual/wazuh-server-cluster/index.html89- https://documentation.wazuh.com/current/user-manual/ruleset/rules/custom.html90- https://documentation.wazuh.com/current/upgrade-guide/compatibility-matrix/index.html91- https://documentation.wazuh.com/current/getting-started/use-cases/index.html9293elastic_security:94license:"Elastic License 2.0, SSPL 1.0, or AGPLv3 (AGPL option added 2024-08-29) for the free source"95deployment:"Self-managed, Elastic Cloud Hosted, Elastic Cloud Serverless"96detection_language:"KQL, EQL, ES|QL"97paid_feature_gates_self_managed:98-"Elastic Defend ransomware, memory threat, malicious behavior protection: Platinum or Enterprise"99-"Response actions and response console: Enterprise"100-"Alert suppression: Platinum or higher"101-"Alerting on ML anomaly detection: Platinum or Enterprise"102-"Searchable snapshots (frozen tier): Enterprise"103-"Platinum not available to new customers (per subscriptions page footnote)"104serverless_pricing_as_low_as:105essentials:{ingest_per_gb:"$0.09",retention_per_gb_month:"$0.017"}106complete:{ingest_per_gb:"$0.11",retention_per_gb_month:"$0.019"}107per_endpoint_fee:"None since 2026-03-23"108ops_effort:"Low infra on Serverless; medium to high self-managed"109sources:110- https://www.elastic.co/subscriptions111- https://www.elastic.co/pricing/serverless-security112- https://www.elastic.co/docs/solutions/security/configure-elastic-defend/configure-an-integration-policy-for-elastic-defend113- https://www.elastic.co/guide/en/elasticsearch/reference/current/searchable-snapshots.html114- https://www.elastic.co/blog/elastic-security-detection-engineering115- https://www.businesswire.com/news/home/20240829537786/en116117microsoft_sentinel:118deployment:"SaaS on Azure; on-prem sources via Linux forwarder with Azure Monitor Agent (+ Azure Arc outside Azure)"119portal:"Azure portal support ends 2027-03-31; Defender portal only after that"120detection_language: KQL121billing:122analytics_tier:"Pay-as-you-go or commitment tiers from 100 GB/day; tier can be lowered every 31 days"123analytics_retention:"90 days included, extensible to 2 years"124data_lake_tier:"Per-GB ingestion, processing, storage (6:1 compression basis) and query meters"125free_trial:"First 10 GB/day free for 31 days"126free_sources:"Azure Activity, Office 365 audit (SharePoint, Exchange admin, Teams), Defender/Entra ID Protection alerts"127m365_grant:"Up to 5 MB/user/day of Microsoft 365 data for E5/A5/F5/G5 (and E7)"128extra_costs:"Logic Apps (automation), Azure Functions (some connectors)"129ops_effort:"Low infra; ongoing cost governance"130sources:131- https://learn.microsoft.com/en-us/azure/sentinel/billing132- https://learn.microsoft.com/en-us/azure/sentinel/log-plans133- https://learn.microsoft.com/en-us/azure/sentinel/connect-cef-syslog-ama134- https://azure.microsoft.com/en-us/pricing/offers/sentinel-microsoft-365-offer135136ibm_qradar_siem:137current_version:"7.6.0 (announced 2026-06-30)"138deployment:"On-premises hardware or virtual appliances; All-in-One or distributed (Console, Event/Flow Collectors and Processors, Data Nodes)"139licensing:"Usage model: EPS + FPM; Enterprise model: Managed Virtual Servers; subscription or perpetual"140detection_language:"Custom Rules Engine (rule wizard), AQL"141saas_status:"QRadar SaaS sold to Palo Alto Networks (closed 2024-09); QRadar on Cloud EOL 2026-04-14; on-prem not affected"142notes:143-"QRadar Incident Forensics not available in 7.6.x; stay on 7.5.0 UP15 if you use it"144-"Over-allocating EPS/FPM in License Pool Management can block Log/Network Activity tabs"145-"Community Edition: 3-month license, 100 EPS, 5,000 FPM"146ops_effort:"High; specialist skills"147sources:148- https://www.ibm.com/products/hosted-security-intelligence/pricing149- https://community.ibm.com/community/user/blogs/ashish-kothekar/2026/06/30/announcing-ibm-qradar-760-the-biggest-qradar-relea150- https://www.paloaltonetworks.com/services/support/end-of-life-announcements/end-of-life-summary151- https://investors.paloaltonetworks.com/news-releases/news-release-details/palo-alto-networksr-closes-acquisition-ibms-qradar-saas-assets152- https://www.ibm.com/support/pages/node/6964816153- https://www.ibm.com/community/101/qradar/ce/154155splunk_enterprise_security:156owner:"Cisco (acquisition completed 2024-03-18)"157current_version:"ES 8.x (8.4 GA 2026-02; 8.6 controlled availability 2026-07)"158deployment:"Splunk Enterprise (forwarders, indexers, search heads) or Splunk Cloud Platform"159minimum_hardware:"16 physical cores / 32 GB RAM per search head and per indexer (ES 8.x)"160detection_language:"SPL; data normalized to the Common Information Model"161pricing_models:"Ingest (GB/day), workload (SVC in Cloud, vCPU on-prem), activity-based (Cloud only); prices not published"162splunk_free:"500 MB/day, single instance, no alerting, no users or roles — not a SIEM"163upgrade_notes:164-"ES 8.4: finding-based detections created before 8.4 may need updates"165-"ES 8.x on Splunk Enterprise 10.x on-prem: install from the command line"166ops_effort:"High self-managed; dedicated administrator"167sources:168- https://help.splunk.com/en/splunk-enterprise-security-8/install/8.3/planning169- https://help.splunk.com/en/splunk-enterprise-security-8/release-notes-and-resources170- https://www.splunk.com/en_us/products/pricing/pricing-models.html171- https://help.splunk.com/en/splunk-enterprise/administer/admin-manual/10.0/configure-splunk-licenses/about-splunk-free172- https://newsroom.cisco.com/c/r/newsroom/en/us/a/y2024/m03/cisco-completes-acquisition-of-splunk.html173174proof_of_concept:175candidates:2176duration:"at least 2 weeks"177same_sources_into_both:178-"Domain controllers or Entra ID sign-ins"179-"Perimeter firewall"180-"Endpoint telemetry from a sample of machines"181measure:182-"Ingested GB/day per source"183-"Alerts/day before and after one tuning round"184-"Engineering hours per job: onboarding, tuning, platform upkeep"185-"Time to write and tune one identical detection in each platform"
Diceware passphrases and random passwords from your browser's CSPRNG, with exact entropy and crack-time estimates. The page is not allowed to make a single network request — the built-in self-test shows the browser blocking it.