Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Framework for multi-tenancy support #121

Merged
merged 14 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ src/keyring/keyring_config.o \
src/keyring/keyring_file.o \
src/keyring/keyring_vault.o \
src/keyring/keyring_api.o \
src/catalog/tde_keyring.o \
src/catalog/tde_master_key.o \
src/common/pg_tde_shmem.o \
src/pg_tde.o

override PG_CPPFLAGS += @tde_CPPFLAGS@
Expand Down
7 changes: 7 additions & 0 deletions expected/move_large_tuples.out
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
-- test pg_tde_move_encrypted_data()
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
CREATE TABLE sbtest2(
id SERIAL,
k TEXT STORAGE PLAIN,
Expand Down
7 changes: 7 additions & 0 deletions expected/multi_insert.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
-- trigger multi_insert path
--
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
CREATE TABLE albums (
album_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
artist_id INTEGER,
Expand Down
7 changes: 7 additions & 0 deletions expected/non_sorted_off_compact.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
-- A test case for https://github.com/Percona-Lab/pg_tde/pull/21
--
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
DROP TABLE IF EXISTS sbtest1;
NOTICE: table "sbtest1" does not exist, skipping
CREATE TABLE sbtest1(
Expand Down
7 changes: 7 additions & 0 deletions expected/pgtde_is_encrypted.out
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
CREATE TABLE test_enc(
id SERIAL,
k INTEGER DEFAULT '0' NOT NULL,
Expand Down
12 changes: 12 additions & 0 deletions expected/toast_decrypt.out
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
pg_tde_set_master_key
-----------------------

(1 row)

CREATE TABLE src (f1 TEXT STORAGE EXTERNAL) USING pg_tde;
INSERT INTO src VALUES(repeat('abcdeF',1000));
SELECT * FROM src;
Expand Down
7 changes: 7 additions & 0 deletions expected/toast_extended_storage.out
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
-- test https://github.com/Percona-Lab/pg_tde/issues/63
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
CREATE TEMP TABLE src (f1 text) USING pg_tde;
-- Crash on INSERT
INSERT INTO src
Expand Down
7 changes: 7 additions & 0 deletions expected/trigger_on_view.out
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
CREATE extension pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
--
-- 2 -- Test triggers on a join view
--
Expand Down
7 changes: 7 additions & 0 deletions expected/update_compare_indexes.out
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
CREATE EXTENSION pg_tde;
SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
pg_tde_add_key_provider_file
------------------------------
1
(1 row)

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
DROP TABLE IF EXISTS pvactst;
NOTICE: table "pvactst" does not exist, skipping
CREATE TABLE pvactst (i INT, a INT[], p POINT) USING pg_tde;
Expand Down
3 changes: 3 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ pg_tde_sources = files(
'src/keyring/keyring_vault.c',
'src/keyring/keyring_api.c',

'src/catalog/tde_keyring.c',
'src/catalog/tde_master_key.c',
'src/common/pg_tde_shmem.c',
'src/pg_tde.c',
)

Expand Down
65 changes: 62 additions & 3 deletions pg_tde--1.0.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,62 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION pg_tde" to load this file. \quit

-- pg_tde catalog tables
CREATE SCHEMA percona_tde;
-- Note: The table is created using heap storage becasue we do not want this table
-- to be encrypted by pg_tde. This table is used to store key provider information
-- and we do not want to encrypt this table using pg_tde.
dutow marked this conversation as resolved.
Show resolved Hide resolved
CREATE TABLE percona_tde.pg_tde_key_provider(provider_id SERIAL,
keyring_type VARCHAR(10) CHECK (keyring_type IN ('file', 'vault-v2')),
provider_name VARCHAR(256) UNIQUE NOT NULL, options JSON, PRIMARY KEY(provider_id)) using heap;

-- If you want to add new provider types, you need to make appropriate changes
-- in include/catalog/tde_keyring.h and src/catalog/tde_keyring.c files.

SELECT pg_catalog.pg_extension_config_dump('percona_tde.pg_tde_key_provider', '');
-- Key Provider Management

CREATE OR REPLACE FUNCTION pg_tde_add_key_provider(provider_type VARCHAR(10), provider_name VARCHAR(128), options JSON)
RETURNS INT
AS $$
INSERT INTO percona_tde.pg_tde_key_provider (keyring_type, provider_name, options) VALUES (provider_type, provider_name, options) RETURNING provider_id;
$$
LANGUAGE SQL;

CREATE OR REPLACE FUNCTION pg_tde_add_key_provider_file(provider_name VARCHAR(128), file_path TEXT)
RETURNS INT
AS $$
-- JSON keys in the options must be matched to the keys in
-- load_file_keyring_provider_options function.

SELECT pg_tde_add_key_provider('file', provider_name,
json_object('type' VALUE 'file', 'path' VALUE file_path));
$$
LANGUAGE SQL;

CREATE OR REPLACE FUNCTION pg_tde_add_key_provider_vault_v2(provider_name VARCHAR(128),
valut_token TEXT,
valut_url TEXT,
valut_mount_path TEXT,
valut_ca_path TEXT)
RETURNS INT
AS $$
-- JSON keys in the options must be matched to the keys in
-- load_valutV2_keyring_provider_options function.
SELECT pg_tde_add_key_provider('vault-v2', provider_name,
json_object('type' VALUE 'vault-v2',
'url' VALUE valut_url,
'token' VALUE valut_token,
'mountPath' VALUE valut_mount_path,
'caPath' VALUE valut_ca_path));
$$
LANGUAGE SQL;

CREATE FUNCTION pg_tde_get_keyprovider(provider_name text)
RETURNS VOID
AS 'MODULE_PATHNAME'
LANGUAGE C;
-- Table access method
CREATE FUNCTION pg_tdeam_handler(internal)
RETURNS table_am_handler
AS 'MODULE_PATHNAME'
Expand All @@ -18,9 +74,12 @@ RETURNS boolean
AS 'MODULE_PATHNAME'
LANGUAGE C;

CREATE FUNCTION pg_tde_set_master_key(master_key_name VARCHAR(255), provider_name VARCHAR(255))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In percona_tde.pg_tde_key_provider, provider_name len is 256 but here is 255

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing it out. I've updated the catalog definition.

RETURNS VOID
AS 'MODULE_PATHNAME'
LANGUAGE C;


-- Access method
CREATE ACCESS METHOD pg_tde TYPE TABLE HANDLER pg_tdeam_handler;
COMMENT ON ACCESS METHOD pg_tde IS 'pg_tde table access method';

-- Opclasses

3 changes: 3 additions & 0 deletions sql/move_large_tuples.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
-- test pg_tde_move_encrypted_data()
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here and in other files: valut looks like a typo

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed!

--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

CREATE TABLE sbtest2(
id SERIAL,
k TEXT STORAGE PLAIN,
Expand Down
3 changes: 3 additions & 0 deletions sql/multi_insert.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
--
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

CREATE TABLE albums (
album_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
artist_id INTEGER,
Expand Down
4 changes: 4 additions & 0 deletions sql/non_sorted_off_compact.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
-- A test case for https://github.com/Percona-Lab/pg_tde/pull/21
--
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

DROP TABLE IF EXISTS sbtest1;
CREATE TABLE sbtest1(
id SERIAL,
Expand Down
3 changes: 3 additions & 0 deletions sql/pgtde_is_encrypted.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

CREATE TABLE test_enc(
id SERIAL,
k INTEGER DEFAULT '0' NOT NULL,
Expand Down
3 changes: 3 additions & 0 deletions sql/toast_decrypt.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

CREATE TABLE src (f1 TEXT STORAGE EXTERNAL) USING pg_tde;
INSERT INTO src VALUES(repeat('abcdeF',1000));
SELECT * FROM src;
Expand Down
3 changes: 3 additions & 0 deletions sql/toast_extended_storage.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
-- test https://github.com/Percona-Lab/pg_tde/issues/63
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this commented out?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right now we need to figure out a way to delete the files created by extension if the extension is deleted. So I have intentionally commented out these lines to take care of that. IMHO we can handle this as a separate PR


CREATE TEMP TABLE src (f1 text) USING pg_tde;
-- Crash on INSERT
INSERT INTO src
Expand Down
3 changes: 3 additions & 0 deletions sql/trigger_on_view.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
CREATE extension pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

--
-- 2 -- Test triggers on a join view
--
Expand Down
3 changes: 3 additions & 0 deletions sql/update_compare_indexes.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
CREATE EXTENSION pg_tde;

SELECT pg_tde_add_key_provider_file('file-valut','/tmp/pg_tde_test_keyring.per');
--SELECT pg_tde_set_master_key('test-db-master-key','file-valut');

DROP TABLE IF EXISTS pvactst;
CREATE TABLE pvactst (i INT, a INT[], p POINT) USING pg_tde;
INSERT INTO pvactst SELECT i, array[1,2,3], point(i, i+1) FROM generate_series(1,1000) i;
Expand Down
Loading
Loading