On Fri, 7 Feb 2020 at 05:30, Robert Haas <robertmh...@gmail.com> wrote: > > On Mon, Feb 3, 2020 at 10:18 PM Masahiko Sawada > <masahiko.saw...@2ndquadrant.com> wrote: > > > I'm lost. If pg_{en,de}crypt and pg_kmgr_unwrap are functions, what > > > prevent users to: > > > > > > SELECT pg_kmgr_unwrap('xxxx'); > > > > > > so as to recover the key, somehow in contradiction to "allows user to > > > encrypt and decrypt data without knowing the actual key". > > > > I might be missing your point but the above 'xxxx' is the wrapped key > > wrapped by the master key stored in PostgreSQL server. So user doesn't > > need to know the raw secret key to encrypt/decrypt the data. Even if a > > malicious user gets 'xxxx' they cannot know the actual secret key > > without the master key. pg_kmgr_wrap and pg_kmgr_unwrap are functions > > and it's possible for user to know the raw secret key by using > > pg_kmgr_unwrap(). The master key stored in PostgreSQL server never be > > revealed. > > I think I have the same confusion as Fabien. Isn't it bad if somebody > just runs pg_kmgr_unwrap() and records the return value? Now they've > stolen your encryption key, it seems.
This feature protects data from disk thefts but cannot protect data from attackers who are able to access PostgreSQL server. In this design application side still is responsible for managing the wrapped secret in order to protect it from attackers. This is the same as when we use pgcrypto now. The difference is that data is safe even if attackers steal the wrapped secret and the disk. The data cannot be decrypted either without the passphrase which can be stored to other key management systems or without accessing postgres server. IOW for example, attackers can get the data if they get the wrapped secret managed by application side then run pg_kmgr_unwrap() to get the secret and then steal the disk. Another idea we discussed is to internally integrate pgcrypto with the key management system. That is, the key management system has one master key and provides a C function to pass the master key to other postgres modules. pgcrypto uses that function and provides new encryption and decryption functions something like pg_encrypt_with_key() and pg_decrypt_with_key(). Which encrypts/decrypts the given data by the master key stored in database cluster. That way user still doesn't have to know the encryption key and we can protect data from disk thefts. But the down side would be that we have only one encryption key and that we might need to change pgcrypto much. Regards, -- Masahiko Sawada http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services