Chapter 12 · Encryption, TLS, Secrets, Auditing, and Security Hardening
Data-at-Rest Encryption Concepts, Key Management Boundaries, and Backup Encryption
Separate MySQL tablespace, redo, undo, and binary-log encryption from disk and backup encryption; inspect keyring prerequisites and prove that recoverability depends on preserving both data and keys.
Learning outcomes
A ServiceHub database can use encrypted transport and still leave sensitive information readable in tablespace files, redo, binary logs, filesystem snapshots, or logical dumps. “Encryption at rest” is therefore not one switch. Each artifact has a different encryption boundary and, crucially, a different key dependency.
Distinguish InnoDB tablespace encryption, redo/undo protection, binary-log encryption, disk encryption, and encrypted backup artifacts.
Inspect whether a keyring component is present before assuming MySQL-level data-at-rest encryption is usable.
Explain the two-tier InnoDB key model and why key loss can make encrypted data unrecoverable.
Prove that a logical mysqldump is plaintext even when its source tablespace is encrypted, so the backup artifact needs separate protection.
Validate a backup with hashes, row counts, and a disposable restore instead of equating “backup command succeeded” with recoverability.
Draw the encryption boundary before choosing a feature
| Artifact | Typical protection boundary | Key/dependency question |
|---|---|---|
| InnoDB tablespace pages | MySQL data-at-rest encryption | Is a keyring loaded before InnoDB starts? |
| Redo/undo data | InnoDB encryption controls | Are corresponding encryption variables enabled and keys available? |
| Binary/relay logs | binlog_encryption + keyring | Are new log files encrypted and can recovery still read required keys? |
| Whole volume/filesystem | OS/disk/cloud encryption | Who controls volume keys and snapshot access? |
| Logical dump | External artifact encryption | Where is the dump encryption key and how is restore tested? |
| Physical backup | Backup-tool feature or encrypted storage | Does the restore environment have both backup data and required keys? |
These layers can complement each other. Disk encryption protects a stolen volume but does not necessarily protect a database administrator who can read through the running server. MySQL tablespace encryption protects InnoDB pages on disk but does not automatically encrypt a logical dump produced by mysqldump. Backup encryption protects an exported artifact but says nothing about live tablespace files.
Inspect the Community Server capabilities before enabling anything
-- Run as a local administrator on a disposable MySQL instance.CREATE DATABASE IF NOT EXISTS servicehub_security_lab CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;CREATE TABLE IF NOT EXISTS servicehub_security_lab.security_events ( event_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, event_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), actor VARCHAR(80) NOT NULL, event_type VARCHAR(40) NOT NULL, detail VARCHAR(255) NOT NULL) ENGINE=InnoDB;INSERT INTO servicehub_security_lab.security_events(actor,event_type,detail)VALUES ('chapter12','LAB_START','Chapter 12 disposable security lab');SELECT COUNT(*) AS event_rowsFROM servicehub_security_lab.security_events;SELECT VERSION() AS server_version;SELECT component_urn FROM mysql.component ORDER BY component_urn;SHOW VARIABLES WHERE Variable_name IN ( 'default_table_encryption', 'table_encryption_privilege_check', 'innodb_redo_log_encrypt', 'innodb_undo_log_encrypt', 'binlog_encryption');SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPEFROM INFORMATION_SCHEMA.PLUGINSWHERE PLUGIN_NAME LIKE 'keyring%';The Community distribution includes component_keyring_file, but availability in the distribution does not mean it is configured in the running instance. InnoDB tablespace encryption requires a keyring component or plugin loaded early enough for InnoDB to use it. Treat “keyring library exists” and “keyring is configured and contains the required key” as separate facts.
Once production data depends on a keyring, losing the master encryption key can make encrypted data unrecoverable. Backing up only the .ibd files is not a complete recovery design.
Understand InnoDB's two-tier key model
InnoDB encrypts a tablespace with a tablespace key. That key is itself protected by a master encryption key maintained through the keyring service. Master-key rotation rewraps the tablespace keys; it does not mean every data page must be rewritten with an entirely new data key at the moment of rotation.
SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTIONFROM INFORMATION_SCHEMA.INNODB_TABLESPACESWHERE NAME LIKE 'servicehub_security_lab/%'ORDER BY NAME;Querying INNODB_TABLESPACES requires diagnostic visibility such as PROCESS. Keep that privilege on an operator account rather than giving it to the application merely to make a lab query succeed.
If a correctly configured keyring is present on your disposable instance, the optional experiment is ALTER TABLE servicehub_security_lab.security_events ENCRYPTION='Y', followed by the metadata query above. If no keyring is loaded, the expected failure is useful evidence: the prerequisite is missing. Do not weaken security or edit internal files by hand to bypass it.
Redo, undo, and binary logs are separate decisions
Tablespace encryption does not imply that every other on-disk structure is encrypted. MySQL exposes separate controls for redo, undo, and binary/relay logs. In MySQL 8.4, innodb_redo_log_encrypt and binlog_encryption default to OFF. Binary-log encryption also requires a keyring service. Existing binary logs are not retroactively encrypted merely because encryption is turned on; new log data is protected from the activation point forward.
SHOW GLOBAL VARIABLES LIKE 'innodb_redo_log_encrypt';SHOW GLOBAL VARIABLES LIKE 'innodb_undo_log_encrypt';SHOW GLOBAL VARIABLES LIKE 'binlog_encryption';SHOW BINARY LOGS;SHOW BINARY LOGS may fail or return nothing if binary logging is not enabled. That is not an encryption failure; it tells you this local topology does not currently produce binary logs. Chapter 13 will build the backup/PITR chain in depth.
Mandatory free lab: prove a logical backup needs its own protection
This lab does not require a keyring. Its purpose is to expose an important boundary: a logical backup contains SQL/textual data, not encrypted InnoDB pages. Therefore it must be protected as an artifact even when the source tablespace uses MySQL encryption.
INSERT INTO servicehub_security_lab.security_events(actor,event_type,detail)VALUES ('backup-lab','KNOWN_MARKER','restore-me-2026');SELECT COUNT(*) AS before_count, SUM(event_type='KNOWN_MARKER') AS marker_countFROM servicehub_security_lab.security_events;# The -p option prompts; it does not embed the password in the process command line.mysqldump -h 127.0.0.1 -u root -p --single-transaction --routines --triggers servicehub_security_lab > servicehub_security_lab.sql# Inspect only enough to prove the artifact is readable SQL/text.# Linux/macOS:head -n 20 servicehub_security_lab.sql# PowerShell:Get-Content .\servicehub_security_lab.sql -TotalCount 20If you can read schema names and INSERT data in the dump, that is expected. Logical dump utilities serialize logical content after MySQL has already decrypted data for the authenticated session. The dump therefore requires its own file permissions and, where confidentiality requires it, a separate encryption mechanism.
# Linux/macOSsha256sum servicehub_security_lab.sql# Windows PowerShellGet-FileHash .\servicehub_security_lab.sql -Algorithm SHA256For artifact encryption, use an organization-approved tool such as GPG, age, an encrypted archive, or storage-service encryption. The course does not pretend one external tool is universally installed. Whatever you choose, record its version, key owner, recovery procedure, and a hash of the decrypted artifact.
Restore-oriented failure: prove that the chain is complete
A backup artifact is not trustworthy merely because a file exists. First create a damaged copy and prove that its checksum differs from the recorded good hash. Do not attempt to repair a truncated SQL stream by guessing what was lost.
# Linux/macOScp servicehub_security_lab.sql servicehub_security_lab.truncated.sqlpython -c "p='servicehub_security_lab.truncated.sql'; d=open(p,'rb').read(); open(p,'wb').write(d[:max(1,len(d)//3)])"sha256sum servicehub_security_lab.sql servicehub_security_lab.truncated.sql# Windows PowerShell equivalentCopy-Item .\servicehub_security_lab.sql .\servicehub_security_lab.truncated.sql$bytes = [IO.File]::ReadAllBytes('.\servicehub_security_lab.truncated.sql')[IO.File]::WriteAllBytes('.\servicehub_security_lab.truncated.sql', $bytes[0..([Math]::Max(0,[int]($bytes.Length/3)-1))])Get-FileHash .\servicehub_security_lab.sql -Algorithm SHA256Get-FileHash .\servicehub_security_lab.truncated.sql -Algorithm SHA256The two hashes should differ. That is enough to reject the damaged artifact before restore. A checksum proves byte-for-byte identity with the artifact you recorded; it does not prove the original backup was logically complete, so we still perform a restore test.
INSERT INTO servicehub_security_lab.security_events(actor,event_type,detail)VALUES ('backup-lab','POST_BACKUP_ROW','must-disappear-after-restore');SELECT SUM(event_type='KNOWN_MARKER') AS marker_now, SUM(event_type='POST_BACKUP_ROW') AS post_backup_nowFROM servicehub_security_lab.security_events;-- Expected: marker_now = 1, post_backup_now = 1The next destructive step is allowed only because servicehub_security_lab is the chapter's disposable schema and the intact dump plus its checksum have already been recorded. Never generalize this exercise to a valuable database.
DROP DATABASE servicehub_security_lab;CREATE DATABASE servicehub_security_lab CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;# Password is prompted; the good dump remains unchanged.mysql -h 127.0.0.1 -u root -p servicehub_security_lab < servicehub_security_lab.sqlSELECT SUM(event_type='KNOWN_MARKER') AS marker_restored, SUM(event_type='POST_BACKUP_ROW') AS post_backup_restoredFROM servicehub_security_lab.security_events;-- Expected: marker_restored = 1, post_backup_restored = 0SHOW CREATE TABLE servicehub_security_lab.security_events;The known marker returning while the post-backup row disappears proves that the server recovered the state represented by this backup boundary. This is stronger evidence than an exit code alone. For encrypted tablespaces, encrypted binary logs, or encrypted physical backups, the restore drill must additionally prove that the required keyring/key-management material is available.
Verify object definitions, known markers, row counts or checksums, and application-level invariants. Chapter 13 will extend this idea into full backup consistency, binary-log continuity, point-in-time recovery, RPO, and RTO testing.
Production judgment: key custody is part of recoverability
Encryption introduces a dependency that backups alone cannot satisfy: keys. Separate data backups from key backups, restrict access to both, and avoid storing the only copy of a key beside the only encrypted data it unlocks. Key rotation must be rehearsed together with restore, not treated as a purely cryptographic housekeeping task.
Enterprise products can provide additional encrypted-backup capabilities, but they are not required for this course. The architectural rule is edition-neutral: document exactly which artifacts are encrypted, which are plaintext, which key service they depend on, and how a clean restore proves the chain.
Knowledge check
- Why can an encrypted InnoDB table still produce a plaintext mysqldump?
- What is the role of the keyring in tablespace encryption?
- Does enabling binlog_encryption retroactively encrypt old binary logs?
- Why is a backup checksum useful but insufficient by itself?
- What must accompany encrypted data in a disaster-recovery plan?
Reveal answers
- mysqldump reads logical rows through an authenticated server session after decryption and serializes SQL/text.
- It stores/manages the master key used to protect tablespace encryption keys and other MySQL encryption keys.
- No. Encryption applies from activation forward; existing files are not automatically rewritten.
- It proves artifact integrity relative to the recorded hash, but not that the backup is logically complete or restorable.
- The required key material, configuration, permissions, documented recovery procedure, and tested restore evidence.
Summary and bridge to Lesson 3
At-rest security is a set of boundaries, not a checkbox. You now know how to inventory those boundaries and why backup recoverability includes key custody. Next we protect the credentials applications use to reach the server in the first place.