|
| 1 | +--- |
| 2 | +title: "Protect the data encryption key on an existing TDE cluster" |
| 3 | +description: Learn how to enable a mechanism to protect the data encryption key on an existing TDE-enabled database cluster. |
| 4 | +--- |
| 5 | + |
| 6 | +If you want to enable key wrapping on TDE-enabled database clusters where key wrapping was previously disabled, update the encryption settings in the `postgresql.conf` file. |
| 7 | + |
| 8 | +## Context |
| 9 | + |
| 10 | +When you create a TDE-enabled database cluster, `initdb` generates a data encryption key and stores it in `pg_encryption/key.bin`. Since this file is stored in plaintext, TDE requires an additional mechanism to [secure the data encryption key](../secure_key/). You normally configure the protection of the key as you initialize your TDE-enabled database cluster. |
| 11 | + |
| 12 | +However, you can chose to [disable key wrapping](../secure_key/disabling_key) for your data encryption key. Although this setup is not recommended, you might have chosen to leave your key unprotected to facilitate managing the cluster for testing or demo purposes. |
| 13 | + |
| 14 | +If you disabled key wrapping, but later decide to enable a mechanism that secures your encryption key, you can enable it at a later time, by updating the encryption settings in the `postgresql.conf` file. |
| 15 | + |
| 16 | +## Enable key wrapping with a passphrase |
| 17 | + |
| 18 | +This example walks you through adding a passphrase-based protection mechanism or key wrapping to your data encryption key (`key.bin`). |
| 19 | + |
| 20 | +1. Store the passphrase in a file accessible by initdb named `pass.bin`: |
| 21 | + |
| 22 | + !!!important |
| 23 | + This example stores the passphrase in plaintext, a method you should only use for testing or demonstration purposes. In production environments, don't store your passphrase in a file. See [Using a passphrase](../secure_key/passphrase) for alternative methods. |
| 24 | + !!! |
| 25 | + |
| 26 | + ``` |
| 27 | + echo "<passphrase>" > /var/lib/postgresql/pass.bin |
| 28 | + ``` |
| 29 | + |
| 30 | +1. Use OpenSSL to encrypt the existing `key.bin` data encryption key with the stored passphrase and save the encrypted file as `key.bin.WRAP`: |
| 31 | + |
| 32 | + ``` |
| 33 | + cat $PGDATA/pg_encryption/key.bin | openssl enc -e -aes-128-cbc -pbkdf2 -pass file:/var/lib/postgresql/pass.bin -out $PGDATA/pg_encryption/key.bin.WRAP |
| 34 | + ``` |
| 35 | + |
| 36 | +1. Create a backup of the unwrapped data encryption key named `key.bin.NOWRAP` in case you need to roll back to the original configuration: |
| 37 | + |
| 38 | + ``` |
| 39 | + cp $PGDATA/pg_encryption/key.bin $PGDATA/pg_encryption/key.bin.NOWRAP |
| 40 | + ``` |
| 41 | + |
| 42 | +1. Replace the existing data encryption key with the wrapped version: |
| 43 | + |
| 44 | + ``` |
| 45 | + cp $PGDATA/pg_encryption/key.bin.WRAP $PGDATA/pg_encryption/key.bin |
| 46 | + ``` |
| 47 | + |
| 48 | +1. Create a backup of the existing configuration file named `postgresql.conf.NOWRAP` in case you need to roll back to the original configuration: |
| 49 | + |
| 50 | + ``` |
| 51 | + cp $PGDATA/postgresql.conf $PGDATA/postgresql.conf.NOWRAP |
| 52 | + ``` |
| 53 | + |
| 54 | +1. Modify the `data_encryption_key_unwrap_command` value of the `postgresql.conf` file with the new command: |
| 55 | + |
| 56 | + ``` |
| 57 | + sed -i "s|data_encryption_key_unwrap_command.*|data_encryption_key_unwrap_command = 'openssl enc -d -aes-128-cbc -pbkdf2 -pass file:/var/lib/postgresql/pass.bin -in \"%p\"'|" $PGDATA/postgresql.conf |
| 58 | + ``` |
| 59 | + |
| 60 | +1. Create a backup of the modified `postgresql.conf` file that includes the key wrapping named `postgresql.conf.WRAP`: |
| 61 | + |
| 62 | + ``` |
| 63 | + cp $PGDATA/postgresql.conf $PGDATA/postgresql.conf.WRAP |
| 64 | + ``` |
| 65 | + |
| 66 | +1. Restart your database cluster to populate the updated data encryption key configuration: |
| 67 | + |
| 68 | + ``` |
| 69 | + pg_ctl start |
| 70 | + ``` |
0 commit comments