Where session 6 sits on the ladder
Five sessions have taken Ironwood from nine paths to three, and session 5 made all three visible. The third number on the bench has not moved once: recoverable tables, 0 of 12, at nothing on, at MFA, at rotation, at the private bucket, at pinned dependencies, at logging. Tonight's control, immutable, restore-tested backups, takes it to 12 with the path count still at three. It is the second rung on the ladder that moves no headline number and changes everything about Monday.
★ What you walk out with tonight. A nightly export of the crown jewels to a bucket in an account your warehouse admin cannot log in to, with object lock or its equivalent so the copy cannot be deleted before its retention ends. Proof, from the admin credential itself, that the delete is refused. One restore into a scratch schema, timed and dated. And the "closed by" column of your inventory file filled in for the one edge that leads to the backups.
LiveWhy every prevention control leaves this number at zero3 min▶
MFA stops the admin login being phished. It does not change what the admin login can do once somebody holds it, whether that is an attacker who got past MFA, a contractor whose access outlived the contract, or the admin themselves on a bad day. Prevention shrinks the number of ways to the admin login; it never shrinks what the login reaches. And on Ironwood's graph the admin login reaches the backups, because the backups are the account's own time travel and snapshots.
That is why the bench shows recoverable at zero all the way up to the logging rung, and why the "all prevention, no detection" over-correction still shows twelve: it includes immutable backups. Recovery is a property of where the copy lives and who can delete it, not of how hard the front door is to open.
Ironwood's backup answer on the security questionnaire read "warehouse time travel, 7 days, plus weekly snapshots". Both were held by the same account that held the tables. A phished admin credential, used once, could have dropped the twelve tables and reduced the retention window to zero in the same session. Nothing on the questionnaire was false. Nothing on it was a backup either.
Self-studyThe vocabulary for tonight3 min▶
- Time travel - the warehouse's ability to query or restore a table as it was at an earlier point inside a retention window. Superb for undoing a mistake. Held by the account.
- Snapshot - a point-in-time copy of a table or database inside the same platform. Also held by the account, also subject to the account's retention settings.
- Retention window - how far back time travel or snapshots reach. An account setting. Whoever can change the setting can shorten it to nothing.
- Immutability, object lock - a storage setting that makes an object undeletable and unmodifiable until its retention period ends, by anyone, including the account's own administrators. The cloud providers each name it differently; the property is the same.
- Separate account - a second cloud account or project whose credentials the warehouse administrator does not hold. The copy lives there.
- Restore drill - actually restoring a copy into a scratch location, on a schedule, and timing it. The only proof a backup exists.
- Recoverable - the bench's third number: whether an attacker who reaches the admin login can also destroy the copy you would restore from. Twelve tables, all or nothing.
Time travel goes with the account
9 min liveThe professional rule is short: a copy the same account can delete is a copy, not a backup. Time travel, snapshots and retention windows are excellent tools for undoing your own mistakes and useless against anyone who holds the admin login, because the login that can drop the table can also purge the window that would have brought it back.
LiveWhat the admin login reaches, in order3 min▶
- The twelve tables. A drop is one statement per table, or one per schema. Seconds.
- The retention window. Time travel and snapshot retention are account or object parameters, and the admin role sets them. Reducing retention to its minimum, or dropping the objects that hold the snapshots, purges the recovery window that the drop would otherwise have been undone from.
- The warehouse-side export jobs. If your nightly copy is written by a job that the same admin controls, to a bucket the same account owns, the job can be stopped and the bucket emptied from the same seat. The copy has to live where the admin cannot follow it.
- Not the object-locked copy in a separate account. This is the only item on the list the login does not reach, and it is the whole of tonight's control. The admin can still drop every table; on Monday morning the twelve tables come back from a copy the drop never touched.
LiveThe ransomware pattern on data, and the canon3 min▶
Ransomware against a data estate follows one shape: drop or encrypt the tables, purge whatever the account can reach that would restore them, then demand. The second step is the one that decides whether the third step has any leverage. An estate whose only recovery is the account's own time travel has handed the attacker both the tables and the undo button.
On the bench, recoverable tables read 0 of 12 at every rung from nothing on through query logging, and 0 at the "perimeter firewall only" over-correction too. Immutable, restore-tested backups take it to 12 with paths still at three and undetected still at zero. The path count is untouched because the copy removes no way in; it removes the admin-to-backups edge, which was never a path to the crown jewels. It was the path to Monday.
Ransomware does not need to exfiltrate to hurt you. A ransom note for the return of your own customers table works even if not one row left the building. Exfiltration detection in session 5 and recovery tonight are two different defences against two different endings of the same intrusion.
Self-studyWhy a copy the same account can delete is a copy, not a backup3 min▶
The test is one question: can the credential that can destroy the original also destroy the copy? If yes, the copy protects against hardware failure, bad deploys and accidental deletes, all of which are real and worth protecting against. It protects against nothing that holds the admin login, because whatever dropped the table can delete the copy in the next statement.
| Kind of copy | Protects against | Held by the admin login? | Counts as recoverable on the bench? |
|---|---|---|---|
| Time travel | Your own mistakes inside the window | Yes, including the window | No |
| Snapshot in the same account | Mistakes, bad deploys, some corruption | Yes | No |
| Nightly export to a bucket the warehouse account owns | Platform outage, mistakes | Yes, via the bucket | No |
| Export to a separate account, deletable there | Everything above, plus a compromised warehouse admin, until the second account is also compromised | No, but its own admin can delete it | Not yet |
| Object-locked copy in a separate account, restore-tested | All of the above, including anyone who holds either account | No, and nobody can delete it early | Yes: 12 of 12 |
The fourth row is the one teams stop at, and it is nearly right. A separate account whose own administrator can still delete the copy has moved the problem, not removed it. Object lock is what turns a second account into a backup: the delete is refused for everyone until the retention period ends.
Immutable, separate, restore-tested
8 min liveA backup that counts has three properties, and a copy that lacks any one of them is a hope with a storage bill. It cannot be deleted before its retention ends, by anyone. It lives in an account the warehouse administrator does not hold. And it has been restored, actually restored, into a real schema, and somebody wrote down how long it took.
LiveThe three properties, and why each one is load-bearing3 min▶
- Immutable. Object lock, or the storage platform's equivalent, with a retention period. Until the period ends the object cannot be deleted or overwritten by anyone, including the account's own root or owner. Without this, the second property only moves the problem to whoever administers the second account.
- Separate. A different cloud account or project, with its own identities, that the warehouse administrator has no login to. The export job that writes the copy has write access to the destination and nothing else; the warehouse side can push and cannot list, read or delete. Without this, the warehouse admin credential reaches the copy through the account it already holds.
- Restore-tested. Restored into a scratch schema on a schedule, with the row count compared to the source and the elapsed time written down. Without this, the first two properties protect a file that may not load, may be missing a table, or may take three days to bring back when the business expected three hours.
LiveThe honest cost of immutability2 min▶
A copy that nobody can delete for 30 days is a copy that you cannot delete for 30 days either. Your own mistakes, a copy that accidentally includes a column it should not, a table exported before a legal deletion request was honoured, all of them sit in the locked bucket until retention ends. That is not a flaw to engineer around; it is the property doing its job, and it is why the retention period is a governance decision with the data owner and whoever answers for privacy, not a platform default.
The practical shape: retention long enough that an intrusion discovered late still has a clean copy behind it, short enough that the storage cost and the deletion-request exposure are ones the business has agreed to. Thirty days is a common opening position. Write down who agreed and when.
Self-studyWhat to back up, and the drill as the only proof4 min▶
Not everything, nightly. Twelve tables at Ironwood, of which one is the incident and the rest can be rebuilt from source systems and pipelines if the definitions survive. The immutable copy carries the crown jewels and the metadata needed to rebuild the rest: table definitions, pipeline code, the grants, the inventory file. Copying every table every night into a locked bucket is a storage bill with a retention period; copying what cannot be rebuilt is a backup.
- The crown jewels, full, nightly, in an open columnar format that any engine can read. The restore should not depend on the warehouse that was just dropped.
- The definitions: DDL for all twelve tables, the pipeline repository at the deployed commit, the role and grant definitions. Small, and the reason the other eleven tables come back.
- The inventory file itself, because after a destructive event it is the map of what existed.
The drill is the only proof. A backup that has never been restored is a hope with a storage bill. The drill is not a checkbox: it is a restore of last night's copy into a scratch schema, a row count compared against the source, and a stopwatch. The elapsed time is the number the business actually needs, because "we have backups" and "we can be back in four hours" are different promises. Do it monthly at first, quarterly once it is boring. The date of the last successful drill goes in the inventory file next to the edge it closes, and a drill date older than a quarter is a finding.
Ironwood's first restore drill loaded eleven of twelve tables. The twelfth, customers, failed on a column type the export had written one way and the restore read another. Nobody had known for eight months. The fix took an hour; discovering it during an actual incident would have cost the only table that mattered.
One immutable copy, one restore drill
★ 20 min · everyone buildsSix steps, all against your own estate. The commands below are generic shapes: the unload statement, the object-lock setting, the bucket policy and the scheduler object all have platform-specific names, so substitute yours. Two of the steps need someone who can create a second cloud account or project; if that is not you, the step is a ticket with tonight's reasoning attached.
Export the customers table nightly to a bucket in a separate account. The destination account is one the warehouse admin has no login to. The credential the export uses can write to the destination prefix and nothing else: no list, no read, no delete. Use an open columnar format so the restore does not depend on the warehouse being alive.
Enable object lock or the equivalent immutability setting, with a retention period. This is a bucket-level setting in the backup account, applied once, in compliance or governance mode rather than a mode any administrator can lift. The retention period is the governance decision from Part 2; 30 days is the opening position.
Confirm the warehouse admin credential cannot delete the object. Prove it from the admin seat, not from the design document. The delete must be refused twice over: by the bucket policy, because the warehouse account has no delete right there, and by object lock, even for an identity in the backup account.
If either delete succeeds, stop. You have a copy, not a backup, and the next three steps would be timing a restore from something an attacker could remove.
Perform a restore of last night's copy into a scratch schema, and time it. Restore into a schema that does not exist yet, so the drill cannot overwrite anything, and compare the row count to the source. The elapsed time is the number the business will ask for.
Record the restore date and elapsed time in the inventory file. The date is the control. A backup with no drill date on file is indistinguishable, on paper, from one that fails on the twelfth table.
Update the "closed by" column for the admin-to-backups edge. This is the one edge on the graph whose target is not the crown jewels, and until tonight its "closed by" cell said what it would take rather than what exists.
Put the drill on the calendar before anyone leaves. Monthly at first, with the same person restoring and the same file recording the time. The month the drill slips is the month the export format drifts, and nobody will know until the restore that matters.
Before session 7
30 min- Answer the one question for every copy of your crown jewels you can find: can the credential that can drop the table also delete this? Write the answer next to each copy in the inventory file. Expect most of them to be yes.
- Find out who administers the account your backups live in, and whether that person also holds the warehouse admin login. If it is the same person, the separate account is separate on paper only.
- Find the date of your last restore drill. If there is no date, that is the finding, and it goes in the file as a blank rather than being left unrecorded.
- Write down the retention period you would propose, and the two people who need to agree to it: the data owner and whoever answers for deletion requests. Retention is their decision, informed by yours.
Three questions
Ironwood's warehouse has seven days of time travel and weekly snapshots. Why does the bench still show zero recoverable tables?
Time travel is excellent against your own mistakes and useless against whoever holds the admin login. A copy the same account can delete is a copy, not a backup. Recovery is about where the copy lives and who can delete it.
Immutable, restore-tested backups take recoverable tables from 0 to 12. What happens to the path count?
The admin-to-backups edge was never a path to the customers table. It was the path to Monday. Two rungs on the ladder move a number other than the path count, and this is the second.
A team exports customers nightly to a bucket in a separate account, but has never restored from it. Which property is missing, and why does it matter?
Ironwood's first drill loaded eleven of twelve tables and failed on customers. The drill is the only proof, and its output is a date and an elapsed time, not a setting.