Re: [Proposal] Table-level Transparent Data Encryption (TDE) and KeyManagement Service (KMS) - Mailing list pgsql-hackers
From | Masahiko Sawada |
---|---|
Subject | Re: [Proposal] Table-level Transparent Data Encryption (TDE) and KeyManagement Service (KMS) |
Date | |
Msg-id | CAD21AoD8QT0TWs3ma-aB821vwDKa1X519y1w3yrRKkAWjhZcrw@mail.gmail.com Whole thread Raw |
In response to | Re: [Proposal] Table-level Transparent Data Encryption (TDE) and KeyManagement Service (KMS) (Michael Paquier <michael@paquier.xyz>) |
Responses |
Re: [Proposal] Table-level Transparent Data Encryption (TDE) and KeyManagement Service (KMS)
|
List | pgsql-hackers |
On Sun, Dec 1, 2019 at 12:03 PM Michael Paquier <michael@paquier.xyz> wrote: > > On Fri, Nov 01, 2019 at 09:38:37AM +0900, Moon, Insung wrote: > > Of course, I may not have written the excellent quality code > > correctly, so I will make an interim report if possible. > > The last patch has rotten, and does not apply anymore. A rebase would > be nice, so I am switching the patch as waiting on author, and moved > it to next CF. > We have discussed in off-list and weekly voice meeting for several months that the purpose of this feature and the target for PG13 and we concluded to step back and to focus on only internal key management system for PG13. Transparent data encryption support is now the target for PG14 or later. Key management system is an important infrastructure for TDE but it can work independent of TDE. The plan for PG13 we discussed is to introduce the internal key management system that has one encryption key for whole database cluster and make it have some interface to get encryption keys that are managed inside PostgreSQL database in order to integrate it with other components such as pgcrypto. Idea is to get something encrypted and decrypted without ever knowing the actual key that was used to encrypt it. The attached patch has two APIs to wrap and unwrap the secret by the encryption key stored inside database cluster. user generate a secret key locally and send it to PostgreSQL server to wrap it using by pg_kmgr_wrap() and save it somewhere. Then user can use the saved and wrapped secret key to encrypt and decrypt user data by something like: INSERT INTO tbl VALUES (pg_encrypt('user data', pg_kmgr_unwrap('xxxxx')); Where 'xxxxx' is the result of pg_kmgr_wrap function. I've attached the KMS patch. It requires openssl library. What the patch does is simple and is not changed much from the previous version patch that includes KMS and TDE; we generate one encryption key called master key for whole database cluster at initdb time, which is stored in pg_control and wrapped by key encryption key(KEK) derived from user-provided passphrase. When postmaster starts up it verifies the correctness of passphrase provided by user using hmac key which is also derived from user-provided passphrase. The server won't start if the passphrase is incorrect. Once the passphrase is verified the master key is loaded to the shared buffer and is active. I added two options to initdb: --cluster-passphrase-command and -e that takes a passphrase command and a cipher algorithm (currently only aes-128 and aes-256) respectively. The internal KMS is enabled by executing initdb with those options as follows: $ initdb -D data --cluster-passphrase-command="echo 'password'" -e aes-256 I believe the internal KMS would be useful several use cases but I'd like to have discussion around the integration with pgcrypto because pgcrypto would be the first user of the KMS and pgcrypto can be more powerful with the KMS. I'll register this KMS patch to the next Commit Fest. I really appreciate peoples (CC-ing) who participated in off-list discussion/meeting for many inputs, suggestions and reviewing codes. Regards, -- Masahiko Sawada http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachment
pgsql-hackers by date: