A one-time AWS hardening engagement produces a real improvement and a satisfying report — and six months later, half of it has quietly reverted. New resources shipped without the hardened defaults, an engineer opened a security group “temporarily” during an incident, GuardDuty kept finding things and nobody was assigned to read them. The difference between hardening and security management is not the checklist; it is that someone is on the hook next month, and the month after. Deciding between them is really deciding whether your AWS environment changes over time — and it does.
What you are deciding
Hardening is a project: enumerate the gaps, close them, hand over a report. It genuinely works for the gaps that stay closed on their own — deleting root access keys, enabling MFA, turning on CloudTrail. Where it fails is everything with a decay rate. An AWS environment is not a building you lock once; it is a stream of changes — deploys, new accounts, new buckets, IAM edits, dependency updates — and every change can reopen a closed finding. Security posture is a derivative, not a level: what matters is not how hardened you were on audit day but how fast new gaps appear versus how fast they get closed.
Continuous security management means four standing functions: detection that stays on (GuardDuty, Security Hub, Config rules running in every account and region that matters), a human queue (findings triaged on a schedule, with severity rules about what pages someone versus what waits for the weekly review), response (a documented path from finding to fix, with the access to actually fix it), and regression control (guardrails and IaC defaults so the same finding class stops recurring). Buying “AWS security management services” from anyone — including us — should mean buying those four functions, not a monthly PDF.
The honest cost mechanics: the AWS tooling itself scales with usage — GuardDuty bills on analyzed log volume, Security Hub on ingested findings and checks, Config on recorded configuration items — so tool cost is usually modest relative to the engineering time. The real cost of continuous is attention: someone’s recurring hours. That is exactly why it fails in-house when it is nobody’s actual job.
What to check first
If you are deciding whether you already have continuous coverage or a decayed one-time hardening, five checks settle it:
- When was the last security finding closed, and by whom? If the answer requires archaeology, nothing continuous is happening.
- Is anything watching? GuardDuty enabled in all active regions, CloudTrail logging, Security Hub or equivalent aggregating.
- Where do alerts go? A security topic delivering to a channel nobody reads is detection theatre.
- What happened after the last real finding? Trace one GuardDuty finding end to end: detected, seen by a human, acted on. Measure the gap in days.
- Do new resources inherit the hardened defaults? Check the newest S3 bucket and security group against the standards in the old hardening report.
How to verify
# Is GuardDuty actually on in this region? (repeat per region you use)
aws guardduty list-detectors
aws guardduty get-detector --detector-id <detector-id> --query 'Status'
# Is CloudTrail logging right now, and has it ever stopped?
aws cloudtrail get-trail-status --name org-trail \
--query '[IsLogging,LatestDeliveryTime,StopLoggingTime]'
# Are compliance checks running, and what is failing?
aws securityhub get-enabled-standards
aws configservice describe-configuration-recorder-status
In the console, GuardDuty > Findings sorted by date answers the uncomfortable question directly: if there are months-old high-severity findings sitting in ACTIVE, detection exists but management does not. The setup work for the detection layer itself is covered in the CloudTrail and GuardDuty baseline.
The approach
- Do the one-time hardening anyway — as the entry point. Continuous management on top of an unhardened account drowns in day-one findings. The initial cleanup sets the baseline the ongoing work defends.
- Turn on the detection layer everywhere, once, centrally. GuardDuty and Security Hub with delegated administration across the organization, CloudTrail as an organization trail. Per-account, per-region manual enablement is how coverage gaps happen.
- Define the paging line in writing. Which finding types page a human now (GuardDuty credential exfiltration, root usage, CloudTrail stopped) versus land in the weekly queue (public snapshot, missing encryption on a dev bucket). Without this line, everything becomes the weekly queue, including the emergencies.
- Install the cadence. A weekly 30-minute findings review with a named owner beats an aspirational daily one that dies in a month. Track two numbers only: open criticals, and median days-to-close. If those two trend well, the program works.
- Close finding classes, not findings. The third public-bucket finding is not a bucket problem, it is a provisioning problem — fix the Terraform module or add the SCP, then close the class. This is the step one-time hardening structurally cannot do, and where edge protections like WAF managed rules on the ALB earn their place as standing infrastructure rather than one-off gestures.
- Re-baseline quarterly. New AWS features, new services in use, new accounts — a quarterly review of what the detection layer covers versus what now exists keeps “continuous” from silently becoming “continuous for the 2024 architecture.”
When this is the wrong move
A genuinely static environment — one account, a handful of resources, no deploys for months — decays slowly, and an annual hardening pass with strong preventive settings may honestly be enough; continuous monitoring of a museum is over-spend. A pre-launch startup with no production data can defer the full program (not CloudTrail, not MFA — those are day one). And if the finding backlog is already thousands deep, do not start the weekly cadence yet; run a scoped remediation project first, then switch to continuous to hold the ground. Buying a monthly report without remediation authority is the worst of both worlds — you pay continuously for awareness while gaps close at one-time speed.
Common mistakes
- Confusing enabled with managed. GuardDuty on with nobody assigned to findings is a paid subscription to an unread inbox.
- Measuring activity instead of closure. “1,400 findings reviewed” means nothing; open criticals and days-to-close mean everything.
- Alert routing to a graveyard channel. The first week everyone reads it; by week six it is muted. Paging rules and a small weekly queue survive; firehoses do not.
- Letting the hardening report stand in for current state. The report describes audit day. Unless something re-checks continuously, its accuracy decays from the moment it is delivered.
Keeping it under control
- One named owner for the findings queue, with cover when they are away.
- Weekly review, two tracked metrics: open criticals, median days-to-close.
- Every recurring finding class gets a prevention ticket (SCP, Config rule, or IaC default), not just an instance fix.
- Quarterly coverage review: new regions, new accounts, new services versus what detection actually watches.
- Test the paging path twice a year with a synthetic finding — an alert path nobody has tested is a hope, not a control.
Hardening answers “are we secure today?”; management answers “will we still be secure in March?” — and only the second question survives contact with a changing environment. If nobody on your team truly owns the AWS environment end to end, that is the root of most of these problems — Stack Harbor runs AWS accounts daily under AWS Operations, and you can book an AWS review.