pg_vault_tde
Overview
| Package | Version | Category | License | Language |
|---|---|---|---|---|
pg_vault_tde | 1.7.0 | SEC | PostgreSQL | C |
| ID | Extension | Bin | Lib | Load | Create | Trust | Reloc | Schema |
|---|---|---|---|---|---|---|---|---|
| 7510 | pg_vault_tde | Yes | Yes | Yes | Yes | No | No | - |
Requires PostgreSQL 17+, OpenSSL 3, libcurl, and shared_preload_libraries=pg_vault_tde; RPM excludes EL8; includes pg_dump_tde, pg_restore_tde, and pg_basebackup_tde.
Version
| Type | Repo | Version | PG Ver | Package | Deps |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.7.0 | 1817161514 | pg_vault_tde | - |
| RPM | PIGSTY | 1.7.0 | 1817161514 | pg_vault_tde_$v | openssl-libs, libcurl |
| DEB | PIGSTY | 1.7.0 | 1817161514 | postgresql-$v-pg-vault-tde | `libssl3 |
| OS / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
| el8.x86_64 | N/A | N/A | N/A | N/A | N/A |
| el8.aarch64 | N/A | N/A | N/A | N/A | N/A |
| el9.x86_64 | PIGSTY 1.7.0 el9.x86_64.pg18 : pg_vault_tde_18 pg_vault_tde_18-1.7.0-1PIGSTY.el9.x86_64.rpm
| PIGSTY 1.7.0 el9.x86_64.pg17 : pg_vault_tde_17 pg_vault_tde_17-1.7.0-1PIGSTY.el9.x86_64.rpm
| N/A | N/A | N/A |
| el9.aarch64 | PIGSTY 1.7.0 el9.aarch64.pg18 : pg_vault_tde_18 pg_vault_tde_18-1.7.0-1PIGSTY.el9.aarch64.rpm
| PIGSTY 1.7.0 el9.aarch64.pg17 : pg_vault_tde_17 pg_vault_tde_17-1.7.0-1PIGSTY.el9.aarch64.rpm
| N/A | N/A | N/A |
| el10.x86_64 | PIGSTY 1.7.0 el10.x86_64.pg18 : pg_vault_tde_18 pg_vault_tde_18-1.7.0-1PIGSTY.el10.x86_64.rpm
| PIGSTY 1.7.0 el10.x86_64.pg17 : pg_vault_tde_17 pg_vault_tde_17-1.7.0-1PIGSTY.el10.x86_64.rpm
| N/A | N/A | N/A |
| el10.aarch64 | PIGSTY 1.7.0 el10.aarch64.pg18 : pg_vault_tde_18 pg_vault_tde_18-1.7.0-1PIGSTY.el10.aarch64.rpm
| PIGSTY 1.7.0 el10.aarch64.pg17 : pg_vault_tde_17 pg_vault_tde_17-1.7.0-1PIGSTY.el10.aarch64.rpm
| N/A | N/A | N/A |
| d12.x86_64 | PIGSTY 1.7.0 d12.x86_64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~bookworm_amd64.deb
| PIGSTY 1.7.0 d12.x86_64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~bookworm_amd64.deb
| N/A | N/A | N/A |
| d12.aarch64 | PIGSTY 1.7.0 d12.aarch64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~bookworm_arm64.deb
| PIGSTY 1.7.0 d12.aarch64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~bookworm_arm64.deb
| N/A | N/A | N/A |
| d13.x86_64 | PIGSTY 1.7.0 d13.x86_64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~trixie_amd64.deb
| PIGSTY 1.7.0 d13.x86_64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~trixie_amd64.deb
| N/A | N/A | N/A |
| d13.aarch64 | PIGSTY 1.7.0 d13.aarch64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~trixie_arm64.deb
| PIGSTY 1.7.0 d13.aarch64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~trixie_arm64.deb
| N/A | N/A | N/A |
| u22.x86_64 | PIGSTY 1.7.0 u22.x86_64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~jammy_amd64.deb
| PIGSTY 1.7.0 u22.x86_64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~jammy_amd64.deb
| N/A | N/A | N/A |
| u22.aarch64 | PIGSTY 1.7.0 u22.aarch64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~jammy_arm64.deb
| PIGSTY 1.7.0 u22.aarch64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~jammy_arm64.deb
| N/A | N/A | N/A |
| u24.x86_64 | PIGSTY 1.7.0 u24.x86_64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~noble_amd64.deb
| PIGSTY 1.7.0 u24.x86_64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~noble_amd64.deb
| N/A | N/A | N/A |
| u24.aarch64 | PIGSTY 1.7.0 u24.aarch64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~noble_arm64.deb
| PIGSTY 1.7.0 u24.aarch64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~noble_arm64.deb
| N/A | N/A | N/A |
| u26.x86_64 | PIGSTY 1.7.0 u26.x86_64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~resolute_amd64.deb
| PIGSTY 1.7.0 u26.x86_64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~resolute_amd64.deb
| N/A | N/A | N/A |
| u26.aarch64 | PIGSTY 1.7.0 u26.aarch64.pg18 : postgresql-18-pg-vault-tde postgresql-18-pg-vault-tde_1.7.0-1PIGSTY~resolute_arm64.deb
| PIGSTY 1.7.0 u26.aarch64.pg17 : postgresql-17-pg-vault-tde postgresql-17-pg-vault-tde_1.7.0-1PIGSTY~resolute_arm64.deb
| N/A | N/A | N/A |
Build
You can build the RPM / DEB packages for pg_vault_tde using pig build:
Install
You can install pg_vault_tde directly. First, make sure the PGDG and PIGSTY repositories are added and enabled:
Install the extension using pig or apt/yum/dnf:
Preload:
Create Extension:
Usage
Sources:
- pg_vault_tde 1.7.0 README
- pg_vault_tde v1.7.0 release
- pg_vault_tde 1.7 control file
- pg_vault_tde operator documentation
pg_vault_tde adds transparent tuple encryption for PostgreSQL 17 and 18 through the encrypted_heap table access method. It encrypts user-column data with AES-256-GCM before storage and manages per-relation data-encryption keys through HashiCorp Vault/OpenBao, a local PKCS#12 wallet, or—in v1.7—a PKCS#11 HSM. MVCC tuple headers remain plaintext.
Configure and Install
Configure Vault authentication through the documented token, AppRole, or Kubernetes settings without committing secrets to PostgreSQL configuration. Restart PostgreSQL, then create the extension:
kms_provider has no usable default and must be set explicitly. The extension requires OpenSSL 3 and libcurl in addition to PostgreSQL server files.
Create an Encrypted Table
Encryption is table-level: ordinary heap tables are unchanged. Tuple values, TOAST data, and WAL representations are encrypted; tuple headers required for MVCC remain visible.
Indexes
Use tde_btree for equality lookup without storing plaintext keys:
tde_btree uses deterministic AES-256-SIV and supports equality, not range ordering or index-only scans. Other access methods on an encrypted_heap table are rejected by default because they would write plaintext index keys. PRIMARY KEY and UNIQUE table constraints still create native btree indexes and produce a warning; decide whether that exposure is acceptable before defining them.
Integrity and Rotation
Online DEK rotation re-encrypts a table in batches and rebuilds its tde_btree indexes. KEK rotation re-wraps per-table DEKs without rewriting tuples. Restrict these operations, monitor completion, and avoid concurrent key-catalog restoration.
Provider and Backup Boundaries
- The local wallet defaults outside
PGDATA; copy and protect it separately because plainpg_basebackupdoes not include it. - Version 1.7 adds the
pkcs11provider andpg_vault_tde_pkcs11_keygen(). The standalonepg_dump_tdeandpg_restore_tdetools do not support PKCS#11 in this release. - Plain
pg_dumpandCOPY ... TOread decrypted rows and therefore produce plaintext without a warning. Use the supplied encrypted logical-backup tools where supported. - Physical backups contain encrypted relation bytes and wrapped DEKs, but not the KEK. Provision access to the Vault/HSM or copy the local wallet separately. The key-sealing functions and
pg_basebackup_tdewrapper can accompany a physical backup with a tamper-evident DEK bundle.
Critical Caveats
- Never toggle
pg_vault_tde.enabledwhile anencrypted_heaptable contains rows written under the other setting. The extension does not rewrite existing rows and mixed formats can be silently misread as corruption. - Ordinary indexes, statistics, logs, query results, client traffic, temporary work, and backups can expose plaintext outside the encrypted heap. TDE is one storage-layer control, not end-to-end encryption.
tde_btreedisables range semantics, and encrypted tables disable HOT updates in the current design; benchmark update-heavy workloads and index maintenance.- Keep KMS credentials, wallet passphrases, HSM PINs, KEKs, sealed bundles, and restore procedures under separate access controls. A backup without the matching key path is unrecoverable.
- Package release 1.7.0 installs SQL extension version
1.7, is not relocatable, requires preloading and a restart, and supports PostgreSQL 17-18 only.
Was this page helpful?
Thanks—your feedback helps us improve this page.
What got in the way? (optional)