SATISH KURELLY · CYBERSECURITY ENGINEER

Secure systems from code to cloud.

An in-depth knowledge portfolio connecting security operations, software engineering, delivery systems and cloud controls—with each domain explained as a guided, start-to-finish journey.

04connected domains
33connected chapters
04end-to-end capstones
05interactive proof labs
secure-system.graph
SECURESYSTEMCYBERSECURITYFULL-STACKDEVOPSCLOUD SECURITY telemetrycodedeliveryidentity
DETECTTurn telemetry into defensible decisions.
BUILDDesign maintainable applications and APIs.
DELIVERMake change repeatable and observable.
GOVERNApply identity, risk and compliance controls.
01 / CYBERSECURITY

From first principles to incident command.

Cybersecurity is a decision discipline built on evidence. The journey begins with assets, trust and risk; moves through telemetry, detection and investigation; and ends with containment, recovery and measurable improvement. The objective is not more alerts—it is better risk decisions.

01

Security fundamentals: assets, trust and risk

Security starts by understanding what the organization values, where that value lives and who or what is trusted to reach it. Confidentiality, integrity and availability provide the classic objectives, but they become useful only when attached to a real asset and business process. A customer database, build pipeline and emergency dispatch system can all need different balances of those objectives.

A practical threat model identifies assets, actors, entry points, trust boundaries and failure impact. Controls then reduce likelihood or impact through prevention, detection, response and recovery. Defense in depth avoids dependence on a single safeguard; least privilege narrows blast radius; zero trust requires explicit, contextual decisions rather than assuming network location equals trust. Risk is recorded with an owner, treatment choice and residual exposure—not hidden behind a score.

PRACTICEDraw a data-flow diagram for a simple web application. Mark identities, data stores, trust boundaries and the controls at each crossing.
PROVE UNDERSTANDINGExplain the difference between a threat, vulnerability, control and risk using one concrete system.
02

SOC operations: turn signal into action

A security operations center continuously receives alerts, intelligence and reports, then decides which events require action. Effective operations depend on asset context, reliable telemetry, consistent triage and clear escalation paths. Analysts first validate that an alert describes observable behavior, enrich it with identity and asset details, assess scope and business impact, and document what is known versus inferred.

Tiering can organize work, but ownership matters more than labels. A mature queue defines severity, service-level targets, handoff criteria and closure reasons. Shift notes preserve continuity. Case quality is measured through detection fidelity, time to acknowledge, time to contain, repeat incidents and lessons converted into controls. Automation should handle deterministic enrichment and reversible tasks while a human retains judgment for containment or disruptive action.

ANALYST WORKFLOWAlert → validate → enrich → scope → classify → contain or escalate → document → tune.
CASE NOTERecord timeline, evidence, affected assets, severity rationale, actions, owner and next decision.
03

SIEM engineering: Splunk, QRadar and Microsoft Sentinel

A SIEM succeeds only when collection, normalization, detection, investigation and response are designed together. Start with use cases, not a license: identify the behavior to detect, the evidence required, the owners of that evidence, retention needed for the investigation window, and the response decision the alert must support. Build a source register for identity, endpoint, DNS, proxy, firewall, email, cloud control plane and critical applications. For every source record the transport, parser, expected fields, event volume, time zone, retention, sensitivity, owner and a heartbeat that proves data is still arriving.

Common deployment sequence

Define the first three use cases.Example: password spray, privileged-group change and suspicious PowerShell. Name entities, fields, thresholds, allowed exceptions and the action an analyst should take.
Prepare time, identity and assets.Synchronize systems with NTP, normalize users and hosts, import asset criticality, and decide how NAT, proxies and service accounts will be resolved.
Onboard one source end to end.Send through the supported collector, verify parsing and timestamps, compare source counts with SIEM counts, inspect dropped or delayed events, then document the production path.
Normalize and quality-test.Map required fields to the platform schema, reject ambiguous field meanings, and create checks for missing hosts, null users, future timestamps, duplicates and sudden volume change.
Build, replay and tune.Test true-positive, false-positive and edge cases. Use owned, expiring allowlists and peer-group context rather than broad suppression.
Release with a runbook.Record rule owner, schedule, severity, MITRE mapping, evidence links, investigation steps, containment options, data dependencies and rollback.

Splunk: architecture and setup

A small deployment can use one Splunk Enterprise instance for search and indexing; production separates the search tier from the indexer tier. Universal Forwarders collect host data, Heavy Forwarders handle routing or parsing when required, indexers store searchable buckets, and Search Heads run SPL, dashboards and alerts. A Deployment Server manages forwarder applications; clustered indexers improve availability and search factor, and a Search Head Cluster supports multiple coordinated search heads. Parsing normally belongs on the first full Splunk instance receiving the stream, not on Universal Forwarders.

  1. Create indexes by retention and access need—for example windows, network and cloud—instead of placing everything in main.
  2. Install supported technology add-ons, configure inputs and outputs, then verify host, source, sourcetype and timestamp extraction.
  3. Map data to the Common Information Model so reusable detections can use normalized fields. Accelerate only the data models that justify the storage and compute cost.
  4. Use roles and index restrictions for least privilege; protect search-head knowledge objects and service accounts.
  5. Monitor forwarding queues, skipped searches, license volume, indexer capacity and source freshness before enabling production alerts.
# Universal Forwarder: inputs.conf
[WinEventLog://Security]
disabled = 0
index = windows
whitelist = 4624,4625,4688,4728,4732,4756

# Universal Forwarder: outputs.conf
[tcpout]
defaultGroup = primary_indexers
[tcpout:primary_indexers]
server = idx1.example.test:9997,idx2.example.test:9997

On the receiver, enable the Splunk-to-Splunk port, install the Windows add-on on the parsing/search tiers as its documentation requires, deploy the input through a forwarder app, and restart only the affected component. Verify with index=windows | stats count min(_time) max(_time) by host sourcetype; compare counts with the source host, inspect _internal for blocked queues, and roll back the deployment app if parsing or volume is wrong.

SPL 1 · Password spray across many users

Find a source that fails against many distinct accounts, then succeeds shortly afterward.

index=windows sourcetype=WinEventLog:Security (EventCode=4625 OR EventCode=4624) earliest=-20m
| sort 0 IpAddress _time
| streamstats current=f dc(eval(if(EventCode=4625,TargetUserName,null()))) as prior_failed_users
sum(eval(if(EventCode=4625,1,0))) as prior_failures by IpAddress
| where EventCode=4624 AND prior_failed_users >= 8 AND prior_failures >= 12
| table _time IpAddress TargetUserName prior_failed_users prior_failures

Tune out domain controllers, scanners and known federation proxies only with an owner and expiry. Validate whether IpAddress is the true client after load balancers. Test: replay 12 failures across 8 accounts and then one success from the same IP; expect one row only after the success.

SPL 2 · Encoded PowerShell with network follow-on
index=endpoint sourcetype=XmlWinEventLog:Microsoft-Windows-Sysmon/Operational
(EventCode=1 OR EventCode=3) earliest=-30m
| eventstats values(eval(if(EventCode=1,CommandLine,null()))) as process_cmd
values(eval(if(EventCode=1,ParentImage,null()))) as parent
min(eval(if(EventCode=1,_time,null()))) as process_time by host ProcessGuid
| eval process_cmd=lower(mvindex(process_cmd,0))
| where EventCode=3
AND (like(process_cmd,"%powershell%") OR like(process_cmd,"%pwsh%"))
AND (like(process_cmd,"%-enc%") OR like(process_cmd,"%frombase64string%"))
AND _time >= process_time AND _time <= process_time+300
| table process_time _time host User ProcessGuid parent process_cmd DestinationIp DestinationPort

Sysmon's process GUID avoids false joins when operating-system process IDs are reused. Investigate the parent, decoded command, signer, user context and destination. Test: a matching network event within five minutes after process creation returns one row; an earlier event, a later event, or the same PID with a different ProcessGuid does not.

SPL 3 · Privileged-group membership change
index=windows sourcetype=WinEventLog:Security (EventCode=4728 OR EventCode=4732 OR EventCode=4756)
| eval actor=coalesce(SubjectUserName,user), added=coalesce(MemberName,member), group=TargetUserName
| where NOT match(actor,"(?i)^svc_(iam|provisioning)$")
| table _time host actor added group EventCode
| sort - _time

Correlate the actor with the approved change, the target account's recent sign-ins and subsequent privileged actions. Test: an Event 4728 from an ordinary administrator appears; the named provisioning service account is excluded.

IBM QRadar: architecture and setup

QRadar separates collection, processing and investigation. Event Collectors receive syslog, JDBC, API and other protocols; Event Processors parse, normalize and correlate events; Flow Collectors/Processors summarize network conversations; the Console provides administration, searches and offense management. Data Nodes add storage and search capacity. Device Support Modules (DSMs) parse vendor logs into normalized properties, while custom properties extract fields that the DSM does not expose. The Custom Rules Engine correlates events, flows, reference sets, building blocks and asset context into offenses.

  1. Add a log source with the exact source type and protocol. Use a gateway only when many devices require aggregation and preserve the original source identifier.
  2. Verify events in Log Activity, check parsing status, event time, source/destination, username, QID and category. Fix unknown or stored events before writing rules.
  3. Populate network hierarchy, assets and reference sets so rules understand local networks, critical servers, approved scanners and privileged identities.
  4. Build reusable building blocks, then correlation rules. Set a meaningful rule response: offense naming, magnitude inputs, rule test order and limiter.
  5. Monitor EPS/FPM capacity, accumulator performance, deployment status, license drops, inactive log sources and offense closure reasons.

Concrete onboarding example: for Windows security events, install/configure WinCollect on an approved collector, then in QRadar open Admin → Data Sources → Events → Log Sources → Add. Choose the Microsoft Windows Security Event Log type, WinCollect protocol, a unique hostname/FQDN log-source identifier, target Event Collector and required credentials through the approved secret process. Save, deploy changes, generate a lab Event 4625, and confirm in Log Activity that the QID, username, source IP, event time and payload are correct. If it appears as Unknown/Stored, fix the DSM, protocol or identifier before correlation; if absent, check WinCollect status, network path, certificate/TLS where used, collector queues and license drops.

AQL 1 · Failed logins across distinct accounts
SELECT sourceip, COUNT(*) AS failures,
UNIQUECOUNT(username) AS distinct_users,
MIN(starttime) AS first_seen, MAX(starttime) AS last_seen
FROM events
WHERE category = 16003
AND username IS NOT NULL
GROUP BY sourceip
HAVING failures >= 12 AND distinct_users >= 8
LAST 20 MINUTES

Confirm the category/QID in the local deployment; normalized categories vary with DSM quality. Add successful authentication as a second rule condition to raise confidence. Test: 12 failed events for 8 usernames from one IP yield one aggregate; seven usernames remain below threshold.

AQL 2 · High-volume outbound transfer from a critical host
SELECT sourceip, destinationip, destinationport,
SUM(sourcebytes + destinationbytes) AS total_bytes,
COUNT(*) AS flows
FROM flows
WHERE REFERENCESETCONTAINS('Critical Servers', sourceip)
AND NOT INCIDR('10.0.0.0/8', destinationip)
GROUP BY sourceip, destinationip, destinationport
HAVING total_bytes > 1073741824
ORDER BY total_bytes DESC
LAST 1 HOURS

Baseline backup, patch and replication destinations first. Investigate DNS, proxy and endpoint evidence before calling the transfer exfiltration. Test: add a lab source to the Critical Servers reference set and generate flows totaling 1.1 GB to a public destination; expect one grouped row.

AQL 3 · Administrative change outside the approved source set
SELECT starttime, username, sourceip, destinationip,
QIDNAME(qid) AS event_name, UTF8(payload) AS raw_event
FROM events
WHERE REFERENCESETCONTAINS('Privileged Accounts', username)
AND NOT REFERENCESETCONTAINS('Approved Admin Hosts', sourceip)
AND (LOWER(QIDNAME(qid)) LIKE '%group%member%'
OR LOWER(QIDNAME(qid)) LIKE '%policy%change%')
ORDER BY starttime DESC
LAST 24 HOURS

Use building blocks for privileged identities and administrative actions so rule logic stays readable and consistently maintained. Test: a privileged lab account acting from an unapproved source appears; the same action from a member of Approved Admin Hosts does not.

Microsoft Sentinel: architecture and setup

Sentinel runs on an Azure Log Analytics workspace. Data connectors use Azure Monitor agents, diagnostic settings, native service APIs, syslog/CEF collectors or partner connectors. Data lands in native or custom tables; KQL powers hunting, workbooks and analytics rules. Scheduled, near-real-time and Microsoft security analytics create incidents; automation rules and Logic App playbooks enrich or respond. Watchlists provide reference data, UEBA adds entity behavior, and Content Hub packages connectors, rules and workbooks.

  1. Choose workspace boundaries around data residency, access, retention and operations. Apply RBAC at workspace/resource level and separate content authors from responders where practical.
  2. Enable required diagnostic settings and connectors, then confirm table, TimeGenerated, identity, IP, result and resource fields. Use data collection rules and transformations deliberately.
  3. Set table retention and archive from investigation requirements. Control cost with filtering, basic/analytics table choices where supported, and a monitored daily cap—not by silently losing critical logs.
  4. Develop in Logs, save as hunting queries, then promote tested logic to analytics rules with entity mappings, custom details, grouping and suppression only when justified.
  5. Connect automation after the incident schema is stable. Keep disruptive playbook actions behind explicit approval and managed identities with narrow permissions.

Concrete onboarding example: install the Microsoft Entra ID solution from Content Hub, open its data connector, satisfy the listed tenant permissions, connect sign-in and audit logs, then run SigninLogs | take 10. For Azure Activity, create a diagnostic setting or policy assignment that sends subscription activity to the same workspace and verify with AzureActivity | summarize count() by SubscriptionId. A connected status without rows is not success: check the selected tenant/subscriptions, workspace, permissions, diagnostic-setting destination and ingestion latency. Remove or disable only the new connector/setting to roll back without deleting historical data.

KQL 1 · Password spray followed by success
let lookback = 30m;
let sprays = SigninLogs
| where TimeGenerated > ago(lookback) and ResultType != "0"
| summarize FailedUsers=dcount(UserPrincipalName), Failures=count(), Targets=make_set(UserPrincipalName, 20)
by IPAddress, bin(TimeGenerated, 5m)
| where FailedUsers >= 8 and Failures >= 12;
let success = SigninLogs
| where TimeGenerated > ago(lookback) and ResultType == "0"
| project SuccessTime=TimeGenerated, IPAddress, SuccessfulUser=UserPrincipalName;
sprays
| join kind=inner success on IPAddress
| where SuccessTime between (TimeGenerated .. TimeGenerated + 15m)
| project SprayTime=TimeGenerated, IPAddress, FailedUsers, Failures, Targets, SuccessTime, SuccessfulUser

Map IP and account entities in the analytics rule. Review conditional-access result, device, application and user risk before containment. Test: failures in one five-minute bin followed by a success within 15 minutes produce one match; a success before the spray does not.

KQL 2 · Azure role assignment by a new or unusual actor
AzureActivity
| where TimeGenerated > ago(24h)
| where OperationNameValue =~ "MICROSOFT.AUTHORIZATION/ROLEASSIGNMENTS/WRITE"
| extend Actor=tostring(Caller), Target=tostring(parse_json(Properties).resource)
| join kind=leftouter (
SigninLogs | where TimeGenerated > ago(24h)
| summarize SignInIPs=make_set(IPAddress), Apps=make_set(AppDisplayName) by UserPrincipalName
) on $left.Actor == $right.UserPrincipalName
| project TimeGenerated, Actor, Target, ResourceGroup, SubscriptionId, SignInIPs, Apps, ActivityStatusValue

Enrich with privileged-role watchlists, ticket identifiers if logged, and whether the role scope is subscription, resource group or resource. Test: a lab role-assignment write returns actor, scope and sign-in context; a read operation is excluded.

KQL 3 · Encoded PowerShell and external connection
let suspicious = DeviceProcessEvents
| where TimeGenerated > ago(1h)
| where FileName in~ ("powershell.exe","pwsh.exe")
| where ProcessCommandLine has_any (" -enc ","EncodedCommand","FromBase64String")
| project DeviceId, DeviceName, AccountName, ProcessId, ProcessCommandLine, ProcessTime=TimeGenerated;
suspicious
| join kind=leftouter (
DeviceNetworkEvents
| where TimeGenerated > ago(1h) and RemoteIPType == "Public"
| project DeviceId, InitiatingProcessId, RemoteIP, RemoteUrl, RemotePort, NetworkTime=TimeGenerated
) on DeviceId
| where InitiatingProcessId == ProcessId and NetworkTime between (ProcessTime .. ProcessTime + 10m)
| project ProcessTime, DeviceName, AccountName, ProcessCommandLine, RemoteIP, RemoteUrl, RemotePort

Decode only in an isolated analysis workflow; preserve the original command. Parent process, script origin, signer and network context separate administration from abuse. Test: an encoded command with a public connection inside ten minutes joins; a network event outside the window is excluded.

Operate detections as production code

GateRequired evidenceFailure response
Data healthFreshness, volume, parsing, clock and required-field checksDisable misleading alerting or mark partial coverage; fix pipeline
Logic testKnown-positive replay, expected benign case, boundary caseRevise query; do not tune by hiding the entire source
Analyst usabilityEntities, raw evidence, severity rationale and first stepsAdd enrichment and update runbook
Change controlVersion, reviewer, test results, release and rollbackRestore prior rule and document regression
LABIn a test tenant, onboard authentication and endpoint data, document field quality, implement one detection in all three query languages, replay positive and benign events, then compare tuning and analyst workflow.
DONE WHENAn analyst can reproduce the evidence, explain every threshold, identify blind spots and follow a tested response guide without relying on the alert title.
04

Incident response: prepare, contain and learn

Incident response is coordinated decision-making under uncertainty. Preparation establishes roles, contact paths, evidence access, logging, legal and communications expectations, and tested playbooks. Detection and analysis confirm whether an event is an incident, estimate impact, preserve volatile evidence and define immediate priorities. Containment balances stopping harm with preserving operations and evidence; eradication removes the cause; recovery restores safely and watches for recurrence.

A useful incident commander maintains a shared timeline, assigns explicit owners and records consequential decisions with their rationale. Technical teams should separate immediate containment from permanent remediation. Communications translate impact and confidence for executives while preserving technical detail for responders. The post-incident review is blameless but accountable: it finds control, process and coordination gaps, assigns corrective actions, and verifies that those actions actually close.

PrepareRoles, access, tools
DetectValidate signal
AnalyzeScope and impact
ContainLimit harm
RecoverRestore safely
ImproveClose findings
05

Threat hunting: test what alerts may have missed

Threat hunting is a structured search for malicious behavior not already confirmed by an alert. A hunt starts with a falsifiable hypothesis grounded in intelligence, observed gaps or an environmental change—for example, “a compromised identity may be creating short-lived cloud credentials from an unusual automation context.” The hunter defines the entities, telemetry, expected normal behavior and evidence that would support or reject the hypothesis.

Good hunts iterate from broad patterns toward specific sequences while documenting query versions and assumptions. Baselines must respect peer groups and operational cycles; a rare event is a lead, not proof. Findings can become an incident, a new detection, a telemetry improvement or a documented absence of evidence. The lasting output is not only what was found, but the reusable analytic logic and a clearer statement of coverage.

HUNT PACKAGEHypothesis, ATT&CK behavior, data requirements, queries, observations, conclusion and detection candidate.
DISCIPLINEDistinguish “not observed in available data” from “did not happen.” State blind spots explicitly.
06

Malware analysis: a safe, evidence-led walkthrough

Malware analysis answers four operational questions: what the artifact is, what capabilities it contains, what behavior occurred, and how defenders can find or contain related activity. Work only with authorized samples. Never use a normal workstation, shared clipboard, production credentials or an unrestricted network. Treat every sample, document and extracted file as hostile.

Build the analysis environment

  • Isolation: use a disposable virtual machine on host-only or deliberately simulated networking. Disable shared folders, drag-and-drop, clipboard synchronization and USB passthrough. Snapshot a clean state.
  • Static tools: hashes with sha256sum or Get-FileHash; file identification with Detect It Easy or file; strings with FLOSS; PE structure/imports with PEStudio; signatures and reputation from approved internal or public services only when policy permits sample/hash submission.
  • Dynamic tools: Process Monitor for filesystem/registry/process activity, Process Explorer for parent-child and signatures, Autoruns for persistence, TCPView/Wireshark for network activity, and Regshot for before/after registry comparison.
  • Code tools: Ghidra for disassembly/decompilation, x64dbg for controlled Windows debugging, and capa for capability hints. These supplement evidence; they do not replace execution tracing.

Workflow from receipt to report

Intake and preserve.Record who supplied the file, original name, path, acquisition time and reason for analysis. Work from a copy. Calculate SHA-256 before opening it and label the case and sample consistently.
Static triage.Confirm real file type and architecture. Review signer, compile metadata as a lead only, section names/entropy, imports, embedded resources and decoded strings. Look for URLs, mutexes, task names, registry paths and API combinations.
Form hypotheses.Examples: it creates scheduled-task persistence, injects into another process, or fetches a second stage. Write the observation that would confirm or reject each hypothesis.
Observe controlled execution.Start capture tools, establish a clean baseline, execute only inside the disposable VM, and record the process tree, files, registry changes, modules, network requests, errors and timing. Repeat after reboot only if persistence is in scope.
Deepen selectively.Use Ghidra cross-references from interesting strings/imports or a debugger breakpoint on file, registry, process and network APIs. Unpack only as needed to answer the case question.
Translate into defense.Separate durable behaviors from fragile indicators. Write EDR/SIEM logic, list containment steps, state confidence and limitations, and revert the VM.

Worked example: suspicious invoice executable

Scenario: email security quarantines Invoice_4831.pdf.exe. The goal is to determine whether any endpoint executed it and produce detection guidance. This is a synthetic lab example; the names and indicators below illustrate method, not a real campaign.

  1. Intake: preserve the message and attachment, note recipient and delivery time, calculate SHA-256, and search internal telemetry for the hash and original filename before execution.
  2. Static finding: file identification shows a 64-bit PE executable rather than a PDF. High-entropy resource data suggests packing. FLOSS reveals schtasks /create, a path under %AppData%, and an HTTPS path string. Imports include process creation, file write, registry and WinHTTP functions. These support persistence and download hypotheses but do not prove execution.
  3. Dynamic finding: the sample starts a child PowerShell process, writes %AppData%\UpdateCache\updater.exe, creates a scheduled task named UpdateCache, then attempts an outbound TLS connection. Process Monitor and Autoruns confirm the task and path; Wireshark records DNS and connection timing. No successful second-stage download is observed in the isolated network.
  4. Deep analysis: in Ghidra, references from the task-name string lead to a function building the schtasks command. A nearby branch calls the network routine only after persistence succeeds. This explains the execution order observed dynamically.
  5. Scope: search EDR for the original process name, the child PowerShell command, task name, dropped path and matching process tree. Search DNS/proxy logs for the observed destination, but do not depend on a single hash or domain.
# behavior-oriented Sigma-style logic (illustrative)
selection_parent: ParentImage endswith '\Invoice_4831.pdf.exe'
selection_child: Image endswith '\powershell.exe' and CommandLine contains 'AppData\UpdateCache'
selection_task: Image endswith '\schtasks.exe' and CommandLine contains '/create' and 'UpdateCache'
condition: selection_parent and (selection_child or selection_task)

Conclusion: the sample demonstrates execution, persistence and attempted command-and-control behavior in the lab. The report must say that the second-stage payload was not retrieved, so its capabilities are unknown. Containment includes isolating confirmed hosts, disabling affected credentials if exposed, deleting the task and dropped file only after evidence capture, blocking validated indicators, and rebuilding when integrity cannot be assured.

Report structure and common mistakes

SectionWhat to record
Executive summaryObserved impact, affected scope, confidence and immediate action
Technical evidenceHashes, process tree, file/registry/task changes, network behavior and timestamps
CapabilitiesObserved versus merely present in code; prerequisites and failed actions
DetectionsBehavior logic, short-lived indicators, data dependencies and expected benign cases
LimitationsPacking, unreachable infrastructure, anti-analysis, missing privileges or incomplete capture

Avoid attributing an actor from a compiler timestamp, copying sandbox verdicts without reproducing evidence, uploading sensitive samples to public services without permission, or calling a capability “observed” when it only appeared as a string.

LAB DELIVERABLEUsing a benign training sample, produce an intake record, hash set, process tree, before/after changes, packet summary, capability table, detection and one-page response brief.
SAFETY GATEIf isolation, authorization or sample provenance is uncertain, stop. Do not execute the artifact.
07

Digital forensics: a complete investigation walkthrough

Digital forensics is a controlled process for answering scoped questions with reproducible evidence. The order matters: establish authority, preserve volatile evidence, acquire defensibly, analyze working copies, correlate sources, report facts and limitations, and retain evidence according to policy. A technically interesting artifact outside the authorized scope is not permission to expand the case.

Case setup and evidence strategy

Write the questions before collecting: Which account executed the suspicious file? What established persistence? Did data leave the host? Which systems share the same evidence? Record legal/organizational authority, custodians, time window, systems, excluded data and escalation path. Build an evidence plan ordered by volatility: running processes, network connections, logged-on users, memory, cloud/session state, then disks and durable logs. Record each system's time zone and clock offset.

EvidenceTypical toolsQuestions answered
MemoryApproved live-response collector; Volatility 3Processes, injected memory, sockets, credentials/artifacts resident at capture
Disk imageHardware/software write blocker; FTK Imager, Guymager; AutopsyFiles, metadata, deleted content, browser, registry, program execution
Windows artifactsRegistry Explorer, EvtxECmd, PECmd, AmcacheParser, Timeline ExplorerLogons, persistence, execution, devices, recent files and user activity
Network/cloudSIEM, DNS, proxy, firewall, PCAP, cloud audit logsRemote access, destinations, control-plane actions and possible transfer

Acquisition procedure

Open the case.Assign case and evidence identifiers. Photograph or document device state, connections and displayed time. Start chain of custody with collector, date/time, source, destination, action and signature/acknowledgment.
Capture volatile data when justified.Use an approved trusted kit. Record the collector hash and exact command. Capture memory and live-response state before shutdown when loss would harm the investigation; understand that live collection changes the system.
Acquire durable media.Use a write blocker where applicable. Create a bit-for-bit image, not a file copy, when deleted space and metadata matter. Calculate cryptographic hashes during/after acquisition and verify the working copy against the evidence image.
Seal the original.Set original evidence read-only, restrict access and analyze a verified copy. Record storage location, encryption, every transfer and every person who receives custody.
Normalize time.Preserve source timestamps, convert a working timeline to UTC, document daylight-saving and clock skew, and never assume all timestamp fields mean creation.

Worked investigation: suspected credential theft and exfiltration

Initial report: the SOC sees an unusual cloud sign-in for employee jlee and a proxy alert for a large upload. A laptop is available. The scoped questions are whether the account or host was compromised, the initial execution path, persistence, data accessed and the full affected set.

  1. Preserve and triage. Isolate the laptop through the approved EDR control without powering it off. Export the SIEM incident, identity sign-ins, EDR timeline, DNS/proxy/firewall logs and cloud audit logs for the scoped window. Capture memory and a forensic disk image. Hash exports and images; store originals separately.
  2. Establish a common timeline. Convert all working timestamps to UTC. Anchor on reliable events: identity-provider authentication, email delivery, endpoint process start and proxy session. Record the laptop clock offset discovered during acquisition.
  3. Find initial access. Email evidence shows a message with Q3_Benefits.iso. The user's Downloads metadata and browser history place it on disk. A LNK file and process-creation event show benefits.lnk launching powershell.exe. Prefetch may support execution frequency and last-run times; it does not by itself prove the user saw a specific result.
  4. Reconstruct execution. EDR, event logs and memory show the parent-child chain: explorer → LNK → PowerShell → rundll32.exe. PowerShell operational logs contain a download command. Amcache and file metadata identify the dropped DLL. Memory analysis confirms the process and active connection at capture.
  5. Identify persistence. Registry analysis finds a newly created Run key referencing the dropped DLL. Compare the key's last-write time with the process timeline and verify in Autoruns output or EDR persistence data. Do not infer the creating process from last-write time alone.
  6. Assess credential and account use. The identity logs show a sign-in from a new IP after endpoint execution, followed by MFA enrollment and OAuth consent. Cloud audit records show mailbox access. Correlate device ID, session ID, application, user agent and conditional-access result; an IP match alone is weak evidence.
  7. Test exfiltration hypothesis. Proxy logs show an upload to a file-sharing service. Browser cache/history and recent-file artifacts identify a ZIP path; $MFT metadata and shell artifacts place the archive's creation shortly before upload. Compare proxy bytes with file size and inspect DLP or CASB evidence. Conclude “consistent with upload” unless packet or service logs prove object content.
  8. Scope horizontally. Search enterprise telemetry for attachment hash/name, LNK command, dropped DLL hash/path, Run-key value, domain, OAuth application and destination. Preserve evidence on every confirmed system before remediation changes it.
# normalized timeline excerpt
14:02:11Z Email delivered with Q3_Benefits.iso
14:07:43Z benefits.lnk → powershell.exe
14:07:49Z DLL written; Run key modified
14:08:02Z rundll32.exe connects to external host
14:31:18Z New identity-provider session; OAuth consent
15:04:27Z ZIP created; outbound upload begins

Finding, response and validation

State each conclusion with its support and confidence. Example: “High confidence that the LNK initiated malicious PowerShell on the laptop: process telemetry, PowerShell logs and file artifacts agree within the corrected clock window.” Separate that from “Moderate confidence that the ZIP was uploaded,” if only size/timing correlate.

  • Contain: isolate confirmed hosts, revoke identity sessions/tokens, disable malicious OAuth grants, reset credentials from a clean device and block validated infrastructure.
  • Eradicate: remove persistence and malicious files only after collection; rebuild when system integrity cannot be established.
  • Recover: restore access cautiously, verify controls and watch for repeat sign-ins, processes or destinations.
  • Validate: rescan, rerun scope queries, verify revocation and ensure no additional affected entities remain.

Defensible report

The report includes authority and scope, evidence inventory and hashes, acquisition methods and tool versions, time normalization, sourced timeline, findings with confidence, affected entities, actions, limitations and appendices containing commands/queries. Peer review should reproduce critical results from the working copy. Preserve originals, notes and exports according to legal hold and retention rules.

LAB DELIVERABLEInvestigate a training image and log bundle. Produce chain of custody, hash manifest, corrected UTC timeline, five evidence-backed findings, scope query list and executive/technical report.
REPORT TESTEvery conclusion points to an evidence ID, artifact, method and time basis; every uncertainty is labeled rather than filled with assumption.
08

Network security: make trust boundaries observable

Network defense starts with protocol literacy: addressing, routing, DNS, TCP and UDP behavior, TLS, HTTP and common administration protocols. Segmentation places policy between zones with different trust levels, while firewalls, security groups, proxies, secure web gateways and network access controls enforce explicit paths. Secure design prefers narrow ingress, controlled egress, private service paths and administrative access separated from user traffic.

Visibility comes from packet capture, flow records, DNS, proxy, firewall and network detection telemetry. Analysts use these sources to understand who communicated, when, how much, over which protocol and with what outcome. Encrypted traffic changes inspection, not the need for evidence: certificate details, server names where available, flow shape and endpoint telemetry remain valuable. Rules must be reviewed for owner, purpose, expiry and observed use so temporary access does not become permanent exposure.

DESIGN EXERCISEMap user, application, database, management and internet zones; document only the required flows between them.
OPERATIONSPair every enforcement control with logs and an owner who can explain why the path exists.
09

Vulnerability management: reduce exposure, not counts

Vulnerability management is a risk-reduction program, not a scanner export. It begins with an accurate asset inventory and ownership model, then combines authenticated scanning, configuration assessment, application findings, cloud posture and external exposure. Findings are validated and prioritized using exploitability, exposure, asset criticality, reachable attack paths, compensating controls and threat activity—not CVSS alone.

Remediation can include patching, configuration change, code change, segmentation, removal or a time-bound exception. Service-level targets should reflect real risk and operational constraints. Verification means rescanning or retesting the exact condition, not merely closing a ticket. Program metrics should show aging critical exposure, recurrence, coverage, exception debt and time to verified remediation. A falling raw finding count is useful only if the most consequential paths are actually closing.

PRIORITY MODELSeverity + exploit evidence + internet reachability + asset value + control context + remediation feasibility.
RISK ACCEPTANCEName the accountable owner, rationale, compensating controls, review date and expiration.
10

Career roadmap: five paths, sixty role-specific stages

These career paths share a common substrate—networking, Linux and Windows, identity, cloud fundamentals, scripting, HTTP, evidence handling and technical communication—but each now follows its own exact 12-stage sequence. Open a path to see what to learn, where the deeper portfolio content supports it and what evidence to produce.

SOC Analyst

12 stages · detection pack + triage cases

Detect, triage and coordinate response using SIEM, EDR, network and cloud telemetry.

  1. 01SIEM (Splunk/Sentinel)Onboard sources, normalize fields, write tested SPL and KQL detections, and maintain data-health checks.SIEM deep dive →
  2. 02EDR PlatformsInvestigate process trees, persistence, network activity, isolation actions and endpoint evidence.SOC workflow →
  3. 03Network Traffic AnalysisRead packet, flow, DNS, proxy and firewall evidence to reconstruct suspicious communications.Network deep dive →
  4. 04Log AnalysisValidate timestamps, identities, assets and event meaning before correlating a defensible timeline.Query examples →
  5. 05Threat IntelligenceTurn indicators and adversary behavior into scoped hypotheses, enrichment and detection priorities.Hunting method →
  6. 06Incident TriageValidate, enrich, scope, classify and escalate alerts with a clear severity rationale.Triage workflow →
  7. 07SOAR & AutomationAutomate deterministic enrichment and reversible response while keeping disruptive action under approval.Automation guardrail →
  8. 08Vulnerability MgmtPrioritize exposure by exploitability, reachability, asset value and compensating controls.Vulnerability deep dive →
  9. 09MITRE ATT&CKMap observed behaviors and detection coverage to tactics and techniques without treating the framework as proof.Hypothesis mapping →
  10. 10Scripting (Python)Parse logs, enrich entities, call approved APIs and produce repeatable analyst utilities with tests.Proof: triage utility
  11. 11Cloud Log AnalysisInvestigate identity, control-plane and workload events across cloud-native schemas.Cloud logging →
  12. 12Report WritingSeparate facts from inference, state confidence and turn technical evidence into clear actions.Incident reporting →
CAPSTONETriage a synthetic identity compromise from SIEM and EDR evidence, document scope, propose containment and tune the detection.
PORTFOLIOSanitized detection pack, three triage cases, analyst runbook, metrics note and executive incident brief.

DFIR Analyst

12 stages · forensic timeline + report

Preserve evidence, reconstruct timelines and explain scope across endpoint, network and cloud artifacts.

  1. 01Memory ForensicsCapture volatile evidence and examine processes, sockets, injection and resident artifacts with reproducible methods.Forensics deep dive →
  2. 02Disk ForensicsAcquire defensible images, verify hashes and analyze filesystems, metadata, deleted content and execution traces.Acquisition guide →
  3. 03Malware AnalysisCombine safe static and dynamic analysis to identify capabilities, behavior and detection opportunities.Malware walkthrough →
  4. 04Log CorrelationJoin endpoint, identity, network and application evidence while preserving source semantics and uncertainty.Correlation queries →
  5. 05Timeline ReconstructionNormalize clocks, identify anchor events and produce a sourced sequence that supports each finding.Worked timeline →
  6. 06Chain of CustodyRecord authority, collector, source, destination, hashes, transfers and storage for every evidence item.Evidence strategy →
  7. 07Network ForensicsUse PCAP, flows, DNS and proxy evidence to assess sessions, destinations and possible transfer.Network evidence →
  8. 08Registry AnalysisExamine persistence, recent activity and system configuration while interpreting timestamps carefully.Registry example →
  9. 09NIST IR ProcessMove from preparation through detection, containment, eradication, recovery and lessons learned.IR lifecycle →
  10. 10Threat HuntingTest scoped hypotheses across preserved evidence and enterprise telemetry to expand or close scope.Hunting deep dive →
  11. 11Cloud ForensicsPreserve identity, control-plane, object, workload and audit evidence with tenant and time context.Cloud evidence →
  12. 12Forensic ReportingTie every conclusion to an evidence ID, method and time basis; label limitations and confidence.Report structure →
CAPSTONEInvestigate a training disk image and log bundle, reconstruct the intrusion and test competing explanations.
PORTFOLIOChain-of-custody form, hash manifest, corrected timeline, evidence matrix and executive/technical report.

Penetration Tester

12 stages · scoped assessment report

Validate exposure within written authorization and translate proof into prioritized remediation.

  1. 01Networking FundamentalsUnderstand addressing, routing, DNS, TCP/UDP, TLS and the trust boundaries that shape an assessment.Network foundations →
  2. 02Linux & ScriptingOperate safely in Linux and automate repeatable parsing, enumeration and evidence collection.Shared foundation →
  3. 03Recon (Nmap)Discover authorized hosts, ports and services with rate, scope and evidence controls.Proof: recon matrix
  4. 04Web App TestingAssess authentication, authorization, sessions, input handling and business logic against a written scope.Web foundations →
  5. 05Exploitation (Metasploit)Validate findings in a controlled lab, document preconditions and stop at the agreed proof point.Proof: lab notes
  6. 06Active Directory AttacksModel identity paths, delegation, credential exposure and privilege boundaries in an authorized lab.Proof: attack-path map
  7. 07Privilege EscalationTest misconfigurations and trust relationships, preserving commands, evidence and remediation context.Proof: finding chain
  8. 08Social EngineeringPlan only approved simulations with explicit targets, safety limits, privacy controls and stop conditions.Proof: rules of engagement
  9. 09Wireless PentestingAssess authorized wireless configuration, segmentation and client exposure without disrupting others.Proof: test plan
  10. 10Cloud PentestingTest IAM, storage, metadata, network and workload paths within provider and owner authorization.Cloud threat model →
  11. 11Report WritingPresent reproducible proof, risk, affected scope and prioritized remediation for technical and business readers.Risk prioritization →
  12. 12OSCP MethodologyApply a disciplined loop: enumerate, hypothesize, validate, document, reset and report within scope.Proof: full lab report
CAPSTONEComplete a time-boxed assessment of an intentionally vulnerable lab, from rules of engagement through retest.
PORTFOLIOScope, recon matrix, attack narrative, sanitized evidence, remediation plan and professional report.

AI Security Engineer

12 stages · evaluation suite + threat model

Threat-model data, models, prompts, tools and supply chains across the AI system lifecycle.

  1. 01OWASP LLM Top 10Translate common LLM application risks into architecture questions, abuse cases and verification tests.Proof: risk matrix
  2. 02Prompt Injection TestingEvaluate direct and indirect injection across instructions, retrieved content, tools and output handling.Proof: test corpus
  3. 03Adversarial MLUnderstand evasion, extraction, inference and robustness limits across the model lifecycle.Proof: evaluation notebook
  4. 04Model Red TeamingBuild threat-led evaluations with reproducible datasets, scoring, severity and human review.Proof: red-team plan
  5. 05MITRE ATLASMap adversary tactics and techniques to AI system assets, tests, telemetry and mitigations.Proof: coverage map
  6. 06Jailbreak TestingMeasure policy-bypass resistance across attack families without equating one prompt with coverage.Proof: scored suite
  7. 07Data Poisoning DefenseProtect provenance, curation, labeling, training and retrieval data with validation and rollback paths.Proof: provenance design
  8. 08MLSecOpsVersion data, models, prompts and evaluations; gate promotion and monitor security regressions.Delivery controls →
  9. 09AI GovernanceDefine owners, intended use, impact, approvals, monitoring, change control and incident accountability.Proof: model card + RACI
  10. 10Python + ML FrameworksBuild reproducible evaluation harnesses, dataset checks and model-serving tests with typed, reviewable code.Proof: evaluation harness
  11. 11LLM GuardrailsLayer input, retrieval, tool, output and authorization controls; measure bypasses and false positives.Proof: control tests
  12. 12AI Supply Chain SecurityVerify models, datasets, packages and deployment artifacts with provenance, scanning and access controls.Supply-chain pipeline →
CAPSTONEThreat-model and red-team a retrieval-augmented assistant, then implement and retest layered guardrails.
PORTFOLIOSystem diagram, ATLAS map, evaluation dataset, scorecard, control decisions and residual-risk brief.

Cloud Security Engineer

12 stages · reference architecture + controls

Build secure identity, configuration, workload and observability patterns into cloud platforms.

  1. 01AWS/Azure/GCP IAMDesign human and workload identity, least privilege, federation, conditional access and review paths.IAM deep dive →
  2. 02CSPM ToolsContinuously assess configuration drift, exposure and control coverage with accountable remediation.Posture operations →
  3. 03CNAPPUnify posture, entitlement, workload and code context to prioritize reachable cloud risk.Control stack →
  4. 04Terraform/IaC SecurityReview modules, policy checks, plans, state protection and drift before controlled promotion.IaC deep dive →
  5. 05Container & K8s SecuritySecure images, registries, workloads, admission, runtime permissions, networking and secrets.Kubernetes foundation →
  6. 06Cloud-native SIEMCollect identity, control-plane and workload telemetry; build detections with known coverage.Cloud monitoring →
  7. 07Encryption & KMSDesign key ownership, envelope encryption, rotation, access policy, logging and recovery.Data controls →
  8. 08Zero Trust ArchitectureMake access decisions from verified identity, device, workload and context rather than network location.Identity controls →
  9. 09Network Security GroupsDesign narrow ingress, controlled egress, private paths, segmentation and observable policy.Network controls →
  10. 10DevSecOps / CI-CDEmbed code, dependency, secret, IaC and artifact controls in a traceable delivery pipeline.Pipeline deep dive →
  11. 11Cloud Compliance (CIS)Translate benchmarks into scoped, testable controls, exceptions and evidence without confusing compliance with security.Compliance mapping →
  12. 12Cloud Incident ResponsePrepare access, logging and playbooks; contain identities and workloads while preserving cloud evidence.Response lifecycle →
CAPSTONEDesign and assess a multi-account cloud workload with federated IAM, IaC policy, monitoring and an incident scenario.
PORTFOLIOReference architecture, threat model, IAM matrix, policy-as-code checks, detection pack and response runbook.

Cybersecurity capstone

Build a small detection-and-response program around a synthetic identity compromise. Inventory the data, write and test detections, triage the event, preserve evidence, contain the account, assess exposed paths and brief the incident.

Data map3 detectionsTriage timelineIR briefLessons learned
HANDS-ON PROOF LAB

Inspect the work, not a list of claims.

Run five guided simulations, make incident decisions, test knowledge across all 60 roadmap stages and inspect completed lab reports. Every artifact below comes from a self-directed lab, controlled simulation or portfolio project—never an employer or client engagement.

PORTFOLIO SCOPE · Synthetic data and intentionally vulnerable training environments only. Commands are simulated in-browser and never touch a real host, tenant or model.

Five-role simulation console

Choose a path, follow the analyst brief and run the suggested commands. The outputs are deterministic training data designed to demonstrate method, interpretation and safe stopping points.

analyst@proof-labisolated · synthetic dataset
Choose a guided command or enter your own.
Select a role and run the first guided command.

Decision room

Work through one flagship SOC incident and four focused role scenarios. Each choice reveals the evidence tradeoff, the safer action and the next decision—without pretending the lab is professional employment.

SOC AnalystDecision 1 of 4Judgment 0/0

Lab report library

Five completed write-ups show how work is documented: objective, tools, reproducible methodology, findings, artifacts and lessons. Select a path to inspect the corresponding self-directed lab report.

LAB-SOC-01

SELF-DIRECTED LAB
Reusable write-up template: objective → authorization/scope → environment → tools + versions → method → timestamped evidence → findings + confidence → remediation → retest → limitations
02 / FULL-STACK DEVELOPMENT

From language fundamentals to a deployed product.

Full-stack engineering joins domain logic, APIs, user interfaces and data into one maintainable system. The journey emphasizes clear boundaries, testable behavior, secure defaults and observable delivery across Java, Node.js, Angular and React.

01

Web foundations and application boundaries

A browser application exchanges HTTP requests and responses with services that implement business capabilities. Understanding methods, status codes, headers, caching, cookies, CORS, TLS and JSON is essential before choosing a framework. The architecture should separate presentation, application use cases, domain rules and infrastructure so a database or UI change does not rewrite the entire system.

Requirements become user journeys, API contracts and data rules. Nonfunctional needs—security, availability, latency, accessibility, auditability and cost—shape the design as much as features. A modular monolith is often the right starting point: it preserves clear internal boundaries without introducing distributed-system complexity prematurely. Services should emerge when independent scale, ownership or deployment genuinely requires them.

01 →BrowserUI and local state
02 →API edgeTLS, auth, routing
03 →ApplicationUse cases
04 →DomainBusiness rules
05DataDurable state
02

Java and Spring Boot: build a production-shaped API

This walkthrough implements an incident-case service with Java 21, Spring Boot 3, Maven, PostgreSQL, Flyway, Bean Validation, Spring Security and Actuator. The design keeps HTTP transport, application rules and persistence separate so the use case can be tested without a running server. The API creates a case, reads it and changes status under explicit rules.

1. Create the project and boundaries

Generate a Maven project with dependencies: Spring Web, Validation, Spring Data JPA, PostgreSQL Driver, Flyway Migration, Spring Security, Actuator and Testcontainers for tests. Use constructor injection; avoid field injection because hidden dependencies make tests and initialization harder to reason about.

incident-api/ ├── pom.xml ├── src/main/java/com/example/incidents/ │ ├── IncidentApplication.java │ ├── casefile/ │ │ ├── api/CaseController.java │ │ ├── api/CreateCaseRequest.java │ │ ├── api/CaseResponse.java │ │ ├── application/CaseService.java │ │ ├── domain/CaseStatus.java │ │ ├── persistence/CaseEntity.java │ │ └── persistence/CaseRepository.java │ ├── shared/ApiExceptionHandler.java │ └── security/SecurityConfig.java ├── src/main/resources/ │ ├── application.yml │ └── db/migration/V1__create_cases.sql └── src/test/java/com/example/incidents/...

Keep API DTOs separate from JPA entities. The controller owns HTTP translation, the service owns use-case and transaction rules, and the repository owns persistence. For a larger system, move domain types away from framework annotations entirely.

2. Define schema, entity and repository

-- V1__create_cases.sql
CREATE TABLE incident_case (
id UUID PRIMARY KEY,
title VARCHAR(160) NOT NULL,
severity VARCHAR(16) NOT NULL,
status VARCHAR(16) NOT NULL,
created_by VARCHAR(120) NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
version BIGINT NOT NULL DEFAULT 0
);
CREATE INDEX idx_case_status_created ON incident_case(status, created_at DESC);
// CaseEntity.java — accessors omitted only for display
@Entity @Table(name = "incident_case")
public class CaseEntity {
@Id private UUID id;
@Column(nullable=false, length=160) private String title;
@Enumerated(EnumType.STRING) @Column(nullable=false)
private Severity severity;
@Enumerated(EnumType.STRING) @Column(nullable=false)
private CaseStatus status;
@Column(nullable=false) private String createdBy;
@Column(nullable=false) private Instant createdAt;
@Version private long version;
protected CaseEntity() {}
// constructor enforces required state; getters expose read access
}

public interface CaseRepository extends JpaRepository<CaseEntity, UUID> {
Page<CaseEntity> findByStatus(CaseStatus status, Pageable page);
}

@Version adds optimistic locking so two analysts cannot silently overwrite each other. Flyway owns schema changes; disable automatic schema creation in production and review forward/backward compatibility before deployment.

3. Validate input and implement the use case

// CreateCaseRequest.java
public record CreateCaseRequest(
@NotBlank @Size(max=160) String title,
@NotNull Severity severity
) {}

// CaseService.java
@Service
public class CaseService {
private final CaseRepository cases;
private final Clock clock;
public CaseService(CaseRepository cases, Clock clock) {
this.cases = cases; this.clock = clock;
}

@Transactional
public CaseResponse create(CreateCaseRequest request, String actor) {
var entity = new CaseEntity(UUID.randomUUID(), request.title().trim(),
request.severity(), CaseStatus.OPEN, actor, Instant.now(clock));
return CaseResponse.from(cases.save(entity));
}

@Transactional
public CaseResponse close(UUID id) {
var entity = cases.findById(id).orElseThrow(() -> new CaseNotFound(id));
if (entity.getStatus() == CaseStatus.CLOSED)
throw new InvalidTransition("Case is already closed");
entity.close(Instant.now(clock));
return CaseResponse.from(entity);
}
}

The injected Clock makes time deterministic in tests. A transaction wraps the state transition. The entity method should enforce valid transitions so another caller cannot bypass the rule.

4. Expose a precise HTTP contract

// CaseController.java
@RestController @RequestMapping("/api/cases")
public class CaseController {
private final CaseService service;
CaseController(CaseService service) { this.service = service; }

@PostMapping
@PreAuthorize("hasAuthority('case:write')")
ResponseEntity<CaseResponse> create(
@Valid @RequestBody CreateCaseRequest body, Principal principal) {
var created = service.create(body, principal.getName());
return ResponseEntity.created(URI.create("/api/cases/" + created.id()))
.body(created);
}

@PostMapping("/{id}/close")
@PreAuthorize("hasAuthority('case:close')")
CaseResponse close(@PathVariable UUID id) { return service.close(id); }
}

Return 201 Created and a Location header for creation. Use 404 for an absent case, 409 for an invalid transition or optimistic-lock conflict, 400 for malformed input, 401 for missing/invalid authentication, and 403 for authenticated callers lacking authority.

// ApiExceptionHandler.java
@RestControllerAdvice
class ApiExceptionHandler {
@ExceptionHandler(CaseNotFound.class)
ResponseEntity<ProblemDetail> notFound(CaseNotFound ex) {
var p = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
p.setTitle("Case not found");
return ResponseEntity.status(404).body(p);
}

@ExceptionHandler({InvalidTransition.class, ObjectOptimisticLockingFailureException.class})
ResponseEntity<ProblemDetail> conflict(Exception ex) {
return ResponseEntity.status(409)
.body(ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT, ex.getMessage()));
}
}

5. Configure security and operations

// SecurityConfig.java — resource-server JWT example
@Bean
SecurityFilterChain security(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable()) // appropriate for bearer-token API; reassess for cookies
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.anyRequest().authenticated())
.oauth2ResourceServer(oauth -> oauth.jwt())
.build();
}
# application.yml
spring:
jpa:
hibernate.ddl-auto: validate
datasource:
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}
management.endpoints.web.exposure.include: health,info,prometheus
management.endpoint.health.probes.enabled: true

Use an identity provider as the issuer, map claims to application authorities, and test object-level authorization—not only endpoint roles. Keep secrets in the deployment platform's secret manager. Restrict Actuator exposure; health can be public to the orchestrator while metrics and environment details require operations access. Log a correlation ID, actor, case ID and outcome, but never raw bearer tokens or sensitive evidence.

6. Test behavior at the right layers

// CaseServiceTest.java — fast unit test
@Test void createsOpenCaseWithDeterministicTime() {
var repo = mock(CaseRepository.class);
when(repo.save(any())).thenAnswer(i -> i.getArgument(0));
var clock = Clock.fixed(Instant.parse("2026-09-23T12:00:00Z"), ZoneOffset.UTC);
var service = new CaseService(repo, clock);

var result = service.create(new CreateCaseRequest("Suspicious sign-in", Severity.HIGH), "analyst@example.test");

assertThat(result.status()).isEqualTo(CaseStatus.OPEN);
assertThat(result.createdAt()).isEqualTo(Instant.parse("2026-09-23T12:00:00Z"));
}

// CaseControllerTest.java — HTTP validation and authorization
@WebMvcTest(CaseController.class)
class CaseControllerTest {
@Autowired MockMvc mvc;
@MockBean CaseService service;

@Test @WithMockUser(authorities="case:write")
void rejectsBlankTitle() throws Exception {
mvc.perform(post("/api/cases").contentType(APPLICATION_JSON)
.content("{\"title\":\" ",\"severity\":\"HIGH\"}"))
.andExpect(status().isBadRequest());
}
}

Add a repository integration test with PostgreSQL Testcontainers and Flyway enabled; verify enum storage, index-backed query and optimistic locking against the same database engine used in production. Add API tests for 201/Location, 400, 401, 403, 404 and 409. Keep a small end-to-end test for the critical create-and-close journey.

7. Run, diagnose and harden

Locally: start PostgreSQL, export database variables, run ./mvnw spring-boot:run, check /actuator/health, then call the API with a test token. In CI run ./mvnw verify, dependency/static checks, image build and container scan. Package one immutable image, run as non-root and deploy with readiness/liveness probes and bounded resources.

SymptomLikely causeDiagnostic and fix
Application fails at startupDatabase unreachable or migration/validation mismatchRead the first causal exception; verify URL/TLS/credentials, Flyway history and schema version. Do not enable destructive auto-DDL.
415 Unsupported Media TypeMissing or wrong Content-TypeSend application/json; inspect gateway/header rewriting.
400 with no useful client detailValidation handler incompleteMap field errors to stable Problem Details; never expose stack traces.
401 versus 403 confusionToken validation or authority mapping401 means authentication failed; 403 means authenticated but disallowed. Check issuer, audience, expiry and claim-to-authority mapping.
LazyInitializationExceptionAccessing unloaded relations after transactionQuery exactly the response projection inside service transaction; avoid exposing entities directly.
Duplicate or lost updatesMissing idempotency/lockingAdd idempotency key for retried creates and handle @Version conflict as 409.
Slow endpointN+1 queries, missing index or pool exhaustionMeasure query count/plan and pool metrics; use projections/fetch plans, add justified indexes and bound pagination.
BUILDImplement the repository, service, controller, migration, JWT authorization, Problem Details, unit/web/Testcontainers tests, Actuator probes and container release.
DONE WHENThe use case runs without a web server in unit tests, persistence is verified on PostgreSQL, every error has a stable contract, and a deployed commit can be traced through logs and health metrics.
03

Node.js: event-driven services with disciplined boundaries

Node.js runs JavaScript on an event loop, making it effective for I/O-heavy APIs and integrations. Asynchronous code with promises and async/await must propagate failures deliberately; CPU-heavy work should move to workers or dedicated services rather than blocking request handling. TypeScript adds contracts that improve refactoring and reduce ambiguity at service boundaries.

Express or NestJS can structure routing, middleware, validation, authentication and dependency injection. Request data is untrusted: parse against schemas, limit payloads, parameterize database queries and enforce authorization on the target resource. Centralized error handling maps internal failures to stable HTTP responses without leaking stack traces. Graceful shutdown stops accepting traffic, drains work and closes dependencies so deployments do not drop requests.

BUILDA TypeScript API with schema validation, async service layer, parameterized persistence, auth middleware and health endpoints.
OPERATIONSTest timeout, dependency failure, malformed input, duplicate request and shutdown behavior—not only the happy path.
04

React: compose interfaces from predictable state

React models the UI as components rendered from props and state. Components should have focused responsibilities, semantic markup and clear data ownership. Local interaction state belongs near the component; shared server state needs caching, loading, error and invalidation rules. Effects synchronize with external systems and should not become a default place for derived values or business logic.

Routing maps URLs to screens, forms require accessible labels and validation, and error boundaries prevent one failure from blanking the entire application. Performance work begins with measurement: stable keys, reasonable component boundaries, deferred loading and selective memoization. Security relies on output escaping, safe URL handling, avoiding arbitrary HTML, and keeping authorization enforcement on the server even when the UI hides unavailable actions.

BUILDA routed dashboard with accessible forms, authenticated API calls, loading and error states, and component tests.
UX TESTCan a keyboard user complete the workflow and understand every busy, empty, failed and successful state?
05

Angular: structured applications at team scale

Angular offers an opinionated platform built around components, templates, dependency injection, routing, forms and RxJS. Standalone components can reduce module overhead, while services centralize domain-facing operations. Reactive forms make complex validation explicit; route guards improve navigation flow but never replace server-side authorization.

Observables model streams over time, including HTTP responses, route parameters and UI events. Operators transform, combine, retry or cancel work, but subscriptions need clear lifecycles to avoid leaks and stale effects. HTTP interceptors consistently attach tokens, correlation IDs and error handling. Feature boundaries, lazy loading and shared design primitives keep a large codebase navigable. Tests should cover components, services and route behavior without coupling to implementation details.

BUILDAn Angular operations portal with lazy routes, reactive forms, typed API services, interceptors and accessible components.
STATE TESTDocument which state is local, shared, server-owned or URL-owned and how each is refreshed.
06

REST APIs and frontend–backend integration

A durable API models resources and use cases instead of mirroring database tables. Routes, methods and status codes should be predictable; requests and responses use explicit schemas. Pagination, filtering and sorting prevent unbounded reads. Idempotency protects retried writes. Versioning and deprecation policies allow clients to evolve without surprise, while OpenAPI documentation keeps implementation and consumer expectations aligned.

Authentication establishes identity; authorization decides whether that identity may perform this action on this resource. Sessions or tokens must be protected in transit and storage, with CSRF defenses where cookies are used. CORS is a browser policy, not an access-control mechanism. Clients need typed adapters, cancellation, sensible retry only for safe or idempotent operations, and clear handling for 401, 403, validation, conflict, rate-limit and server errors.

Contract: method + path + auth + request schema + response schema + errors
Reliability: timeout + idempotency + retry policy + correlation ID
Security: validate + authorize object + encode output + audit decision
07

Database design and transactional integrity

Relational databases organize durable state through tables, keys, constraints and transactions. Normalization limits inconsistent duplication; indexes accelerate known access patterns at a write and storage cost. A transaction groups changes that must succeed or fail together, while isolation controls how concurrent work observes intermediate state. Migrations make schema changes reviewable and repeatable across environments.

Repositories should express domain-oriented operations and use parameterized queries or safe ORM bindings. Query plans reveal whether indexes and joins support real workloads. Connection pools, timeouts and bounded result sets protect the service. NoSQL stores can fit document, key-value or high-scale access patterns, but the data model must still follow consistency and query requirements. Backups are not sufficient until restoration is tested.

MODELDefine entities, invariants, constraints, access patterns, indexes, retention and a safe migration sequence.
FAILURE TESTWhat happens if the service stops after the first of two related writes?
08

Testing from unit behavior to user journeys

A balanced test strategy puts fast unit tests around domain rules, integration tests around databases and external boundaries, contract tests around service agreements, and a focused set of end-to-end tests around critical journeys. Tests should describe observable behavior and remain deterministic. Excessive mocking can create confidence in wiring that production never uses.

Security testing adds dependency and secret scanning, static analysis, authorization cases, input abuse cases and dynamic testing against a controlled environment. Performance tests establish capacity and reveal bottlenecks before production. CI publishes test evidence and enforces agreed quality gates, but flaky tests must be treated as defects. The strongest suite makes refactoring safer because it protects behavior rather than implementation shape.

TEST PYRAMIDMany domain units, targeted integrations, API contracts, and a small number of critical end-to-end flows.
RELEASE SIGNALEvery failed test should explain what user or system behavior is no longer trustworthy.
09

Deployment, operations and secure delivery

Production readiness turns source into a versioned artifact, configuration into environment-specific inputs and database changes into controlled migrations. Containers provide a consistent runtime when images are minimal, non-root, reproducible and scanned. CI verifies code; CD promotes the same artifact through environments with approvals and rollback. Secrets are injected from managed stores, never baked into code or images.

Services expose health, metrics and structured logs with correlation IDs. Readiness indicates whether an instance should receive traffic; liveness determines whether it should restart. Blue/green and canary patterns reduce rollout risk when supported by good telemetry. A release is complete only when dashboards remain healthy, business behavior is checked and rollback is available. Operational runbooks make ownership explicit when dependencies fail.

SHIPContainerize the API and UI, automate tests and image checks, deploy with health probes, then execute rollback.
PRODUCTION TESTCan the team identify the deployed commit, configuration version and database migration from one incident trace?

Full-stack capstone

Deliver a role-aware incident case application: Spring Boot or Node.js API, React or Angular interface, relational data model, tested authorization, audit events, CI pipeline and containerized deployment.

Architecture recordOpenAPI contractAccessible UITest suiteRelease runbook
03 / DEVOPS

From commit to observable production.

DevOps combines culture and engineering practices so small changes move safely and frequently. The core loop is simple: version everything, automate repeatable work, shorten feedback and learn from production.

01

Git: make change reviewable

Git records a directed history of snapshots, enabling teams to branch, review, merge and recover. Useful commits are small, coherent and explain why a change exists. Short-lived branches and frequent integration reduce conflict and hidden risk. Pull requests combine automated checks with human review of correctness, security, operability and maintainability.

Protected branches require review and passing checks; signed commits or release tags can strengthen provenance. Secrets and generated artifacts do not belong in history. Rebase can clarify private branch history, while shared history should be changed cautiously. Releases use immutable tags and generated notes so operators can connect a deployed artifact to reviewed source.

TEAM FLOWIssue → branch → small commits → pull request → automated checks → review → merge → tagged release.
TRACEABILITYGiven a running version, find the commit, reviewer, pipeline, artifact digest and change reason.
02

CI/CD pipelines: encode the path to production

Continuous integration builds and tests every change in a clean environment. A pipeline typically restores pinned dependencies, compiles, runs tests, performs linting and security checks, builds an immutable artifact and publishes attestations. Fast checks run early; slower integrations run after basic confidence. Caches improve speed but must not undermine reproducibility.

Continuous delivery promotes the same artifact through environments rather than rebuilding it. Environment-specific configuration and secrets are supplied at deployment. Approval gates belong at genuine risk decisions, not every routine step. Deployment strategies include rolling, blue/green and canary releases, each requiring health criteria and rollback. Pipeline identities receive least privilege, ephemeral runners reduce persistence, and protected environments constrain who may release.

# one artifact, progressively trusted
commit → test → scan → build → sign → stage → verify → approve → production
rollback trigger: error rate, latency, saturation or failed business check
03

Docker: package the runtime deliberately

A container image packages an application and user-space dependencies into immutable layers. A strong Dockerfile uses a trusted pinned base, multi-stage builds, a small runtime, a non-root user and an explicit entry point. Build context excludes secrets, development caches and unnecessary files. Images are scanned, signed where appropriate and referenced by digest for reproducible deployment.

Containers are processes, not lightweight virtual machines. Writable state is ephemeral unless mounted, logs should stream to standard output, and configuration arrives at runtime. CPU and memory limits protect neighboring workloads. Health checks reveal whether the process can serve. Compose can model a local multi-service environment, but production concerns such as scheduling, disruption and policy usually move to an orchestrator.

HARDENCompare image size, packages, user, capabilities, filesystem permissions, secrets and vulnerability results before and after.
REPRODUCIBILITYBuild twice from the same source and explain every difference in the resulting artifact.
04

Kubernetes: declare and reconcile desired state

Kubernetes schedules containers and continuously reconciles declared resources. Pods hold tightly coupled containers; Deployments manage replicas and rollouts; Services provide stable discovery; Ingress or gateways expose traffic; ConfigMaps and Secrets supply configuration. Requests guide scheduling, limits constrain use, and readiness, liveness and startup probes each answer a different health question.

Namespaces organize tenancy but are not a complete security boundary. RBAC should grant narrowly scoped verbs and resources, workloads use dedicated service accounts, network policies constrain traffic and admission policies prevent unsafe manifests. Persistent volumes separate data lifecycle from pods. Production operations require disruption budgets, autoscaling, backup and restore, upgrade planning, resource observability and tested rollback—not simply applying YAML.

DEPLOYRun a two-tier app with probes, resources, non-root security context, service account, network policy and rolling update.
FAILURE DRILLDelete a pod, drain a node and deploy a broken version; observe recovery and rollback.
05

Infrastructure as code: review the environment

Infrastructure as code expresses cloud resources and policy in versioned, reviewable definitions. Terraform providers map configuration to platform APIs; modules package reusable patterns; state records managed resources. Plans expose intended change before apply. Remote encrypted state, locking and tightly controlled access protect an operationally sensitive artifact.

Reusable modules should encode secure defaults without hiding important behavior. Variables express legitimate variation; outputs reveal only what consumers need. Formatting, validation, linting, policy checks and cost estimation fit into pull-request review. Drift detection identifies out-of-band changes. Destructive plans, provider upgrades, resource imports and state moves require deliberate procedures and tested recovery because automation can amplify mistakes as efficiently as good practice.

MODULEProvision a private service stack with logging, encryption, least-privilege roles and policy checks.
CHANGE SAFETYReview replacement, deletion, privilege expansion, public exposure and data-loss risk before apply.
06

Monitoring, logging and operational feedback

Observability lets a team ask new questions about a system using metrics, logs and traces. Metrics summarize rates, errors, duration and saturation; structured logs preserve discrete events and context; traces connect work across services. Correlation IDs and consistent resource attributes make those signals navigable together.

Service-level indicators measure user-visible behavior, objectives define an acceptable target, and error budgets balance reliability with change. Alerts should be actionable, symptom-oriented and routed to an owner with a runbook. Dashboards support investigation but are not a substitute for alert design. Telemetry needs retention, access control, redaction and cost governance because logs may contain sensitive data. Post-incident improvements feed directly back into instrumentation and delivery.

OBSERVEInstrument one request across UI, API and database; chart latency and errors; trigger and follow a trace.
ALERT TESTDoes the alert describe user impact, evidence, urgency, owner and the first safe diagnostic step?
07

AWS deployment basics: compose managed capabilities

An AWS workload starts with accounts and organizational guardrails, then a regional network design spanning multiple Availability Zones. Public entry points such as CloudFront or an Application Load Balancer route to private application compute; RDS or DynamoDB provide managed data; S3 stores objects; Route 53 provides DNS. The specific services should follow workload shape, recovery needs and operational capability.

IAM roles provide temporary credentials to workloads. Security groups restrict paths, KMS protects data keys, Secrets Manager or Parameter Store supplies sensitive configuration, and CloudTrail records control-plane actions. CloudWatch metrics and logs expose health. Infrastructure as code creates repeatability, while budgets and tags assign cost ownership. A production design also names backup, recovery objectives, deployment strategy, scaling limits and failure behavior across zones.

01 →Route 53DNS
02 →CloudFront / ALBEdge and routing
03 →ECS / EKSApplication compute
04 →RDS / S3Durable data
05CloudWatchOperational evidence

DevOps capstone

Create a delivery system that turns a reviewed commit into a signed container, provisions infrastructure, deploys to Kubernetes or ECS, verifies health and performs a tested rollback.

Git workflowCI/CD pipelineHardened imageIaC planSLO dashboard
04 / CLOUD SECURITY

From shared responsibility to continuous assurance.

Cloud security moves controls into identity, configuration and automation. The provider secures foundational services; the customer still owns how identities, data, workloads and services are configured and used. Every preventive control needs observable evidence.

01

Shared responsibility and landing-zone design

Responsibility changes with the service model. The provider operates physical facilities and core infrastructure; customers configure identities, networks, data protection, workloads and service features. Managed services reduce operational work but do not eliminate architecture decisions. A clear responsibility matrix prevents important controls from falling between provider, platform and application teams.

A landing zone establishes the secure starting point: account or subscription hierarchy, centralized identity, guardrails, network patterns, logging, security services, key management, tagging, budgets and incident access. Production, security and shared services are separated to reduce blast radius. Policy is enforced close to provisioning through templates and organizational controls, while exceptions remain visible, owned and time-bound.

FOUNDATIONDocument organization structure, identity source, log archive, security account, network hubs and emergency access.
OWNERSHIPFor each managed service, name what the provider secures, what the platform team configures and what the application team owns.
02

AWS security: identity-first guardrails

AWS Organizations and multiple accounts create strong administrative boundaries. Service Control Policies define the maximum available permissions without granting access themselves. IAM Identity Center centralizes workforce access, while roles provide temporary credentials for people and workloads. Permission boundaries, resource policies and explicit deny controls constrain delegation and sensitive resources.

CloudTrail records API activity, AWS Config evaluates configuration and Security Hub aggregates findings. GuardDuty analyzes threat signals, Inspector assesses workloads and Macie helps discover sensitive data in S3. VPC design, security groups, private endpoints and controlled egress reduce exposure. KMS keys protect data with auditable policy. Central logs should write to a protected archive account, and incident roles must be prepared before compromise.

ASSESSTrace one workload identity from trust policy through effective permissions to resource policy and logged API action.
GUARDRAILPrevent public storage, unauthorized regions and disabled logging with organizational policy and continuous evidence.
03

Azure security: govern identity and subscriptions

Microsoft Entra ID provides workforce and workload identity. Management groups, subscriptions and resource groups organize policy and ownership. Azure Policy audits or denies unwanted configurations, while resource locks protect critical infrastructure from accidental deletion. Privileged Identity Management enables time-bound elevated access and review.

Defender for Cloud surfaces posture and workload protection findings. Activity Logs capture control-plane operations, diagnostic settings route resource logs, and Log Analytics provides a queryable destination that can feed Microsoft Sentinel. Managed identities remove application secrets for supported services. Network security groups, private endpoints, Azure Firewall and segmentation reduce unwanted paths. Key Vault protects secrets, keys and certificates with narrowly scoped access and logging.

ASSESSReview a subscription for owner sprawl, public endpoints, diagnostic settings, Key Vault policy and high-risk Defender findings.
CONTROL CHAINShow how Policy prevents drift, Activity Logs prove change and Sentinel detects suspicious use.
04

IAM: authenticate strongly, authorize narrowly

Identity is the cloud control plane. Human access should use federation, phishing-resistant MFA where available, conditional access and short-lived privilege. Workloads use managed identities or roles instead of embedded keys. Authorization combines identity, action, resource and conditions; least privilege means granting only what the current use case requires, then reviewing actual use.

Joiner, mover and leaver workflows keep access aligned with role changes. Privileged access is eligible rather than permanent, activated for a bounded time and monitored. Service accounts need owners, rotation or keyless design, and inactivity review. Access analysis should find external trust, dormant credentials, unused permissions and toxic combinations. Break-glass access is isolated, monitored, tested and used only under documented conditions.

Who may perform which action on which resource
under which conditions, for how long, with what evidence?
05

CASB and SaaS security: control the service layer

A cloud access security broker provides visibility and policy across sanctioned and unsanctioned cloud services. API-based integration can inspect configuration, sharing and stored data after it reaches a service; inline proxy controls can govern sessions in real time. Capabilities commonly include application discovery, data classification, sharing control, threat detection and policy enforcement.

CASB is one part of a broader SaaS security program. Teams inventory tenants, administrators, integrations, OAuth grants, public links, external collaborators and retention rules. Sensitive-data policies need tested classifiers and business context to avoid blocking legitimate work. Remediation should distinguish user coaching, session restriction, sharing removal, token revocation and incident escalation. Identity, endpoint and data context improve decisions across CASB, DLP and security service edge controls.

POLICYDefine a sensitive-file sharing scenario with identity, device, app, data class, action, exception and response.
VALIDATEMeasure both detection precision and the business workflows affected before enforcing inline.
06

Secure logging and monitoring: evidence across control planes

Cloud investigations depend on logs configured before an event. The baseline includes organization and subscription activity, identity authentication and changes, network flows, DNS, storage access, key use, workload and application events, and security findings. Logs route to a central account or workspace with restricted administration, encryption, integrity protection, defined retention and cost controls.

Monitoring covers both threats and control health: a disabled trail, missing diagnostic setting or failed log pipeline can be as important as a malicious event. Detections connect identity, resource, network and application context. High-value use cases include privilege escalation, unusual role assumption, public exposure, security-service tampering, suspicious key use, mass data access and anomalous workload behavior. Runbooks identify enrichment, containment options and platform-specific evidence preservation.

LOGGING MATRIXSource, scope, fields, destination, retention, integrity, owner, detection use and pipeline-health signal.
SIMULATIONGenerate an authorized test event and prove it reaches the central store, alert and case with correct identity context.
07

Compliance basics: turn requirements into evidence

Compliance frameworks organize expectations for governance, access, change, protection, monitoring, response and recovery. Security controls should be designed from risk and system context, then mapped to applicable frameworks such as NIST, CIS benchmarks, ISO 27001, SOC 2 or industry obligations. Passing an audit is evidence at a point in time; continuous assurance asks whether the control is still effective today.

A control statement names the objective, scope, owner, implementation, frequency and evidence. Automated policy checks can continuously test configuration, but procedural controls still require records such as access reviews, incident exercises and exception approvals. Evidence must be accurate, time-bounded and access-controlled. Findings become tracked remediation with accountable owners. Exceptions document risk, compensating controls and expiry rather than silently normalizing noncompliance.

CONTROL RECORDRequirement → control objective → implementation → owner → evidence → test → finding → remediation.
EFFECTIVENESSSeparate design effectiveness—could the control work?—from operating effectiveness—did it work consistently?

Cloud security capstone

Design a small AWS or Azure landing zone with federated identity, least-privilege workload access, private networking, encrypted data, centralized immutable logs, posture checks and an incident runbook.

Responsibility matrixIdentity modelReference architectureLogging matrixControl evidence
SK
ABOUT

Satish Kurelly

CYBERSECURITY ENGINEER · ATLANTA, GA

Satish Kurelly is a Cybersecurity Engineer based in Atlanta. This portfolio presents his technical knowledge across defensive security, cloud controls, full-stack application architecture and modern delivery systems, with an emphasis on connecting security decisions to how software is built and operated.

Security+CEHCISSPCCSPAWS Certified Security
LOCATION
Atlanta, GA