mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Add key management system
This adds a key management system that stores (currently) two data encryption keys of length 128, 192, or 256 bits. The data keys are AES256 encrypted using a key encryption key, and validated via GCM cipher mode. A command to obtain the key encryption key must be specified at initdb time, and will be run at every database server start. New parameters allow a file descriptor open to the terminal to be passed. pg_upgrade support has also been added. Discussion: https://postgr.es/m/CA+fd4k7q5o6Nc_AaX6BcYM9yqTbC6_pnH-6nSD=54Zp6NBQTCQ@mail.gmail.com Discussion: https://postgr.es/m/20201202213814.GG20285@momjian.us Author: Masahiko Sawada, me, Stephen Frost
This commit is contained in:
@ -44,11 +44,13 @@
|
||||
#include "commands/tablespace.h"
|
||||
#include "common/controldata_utils.h"
|
||||
#include "executor/instrument.h"
|
||||
#include "crypto/kmgr.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pg_trace.h"
|
||||
#include "pgstat.h"
|
||||
#include "port/atomics.h"
|
||||
#include "postmaster/bgwriter.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "postmaster/startup.h"
|
||||
#include "postmaster/walwriter.h"
|
||||
#include "replication/basebackup.h"
|
||||
@ -81,6 +83,7 @@
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
extern uint32 bootstrap_data_checksum_version;
|
||||
extern int bootstrap_file_encryption_keylen;
|
||||
|
||||
/* Unsupported old recovery command file names (relative to $PGDATA) */
|
||||
#define RECOVERY_COMMAND_FILE "recovery.conf"
|
||||
@ -4618,6 +4621,7 @@ InitControlFile(uint64 sysidentifier)
|
||||
ControlFile->wal_log_hints = wal_log_hints;
|
||||
ControlFile->track_commit_timestamp = track_commit_timestamp;
|
||||
ControlFile->data_checksum_version = bootstrap_data_checksum_version;
|
||||
ControlFile->file_encryption_keylen = bootstrap_file_encryption_keylen;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -4717,6 +4721,7 @@ ReadControlFile(void)
|
||||
pg_crc32c crc;
|
||||
int fd;
|
||||
static char wal_segsz_str[20];
|
||||
static char file_encryption_keylen_str[20];
|
||||
int r;
|
||||
|
||||
/*
|
||||
@ -4905,6 +4910,12 @@ ReadControlFile(void)
|
||||
/* Make the initdb settings visible as GUC variables, too */
|
||||
SetConfigOption("data_checksums", DataChecksumsEnabled() ? "yes" : "no",
|
||||
PGC_INTERNAL, PGC_S_OVERRIDE);
|
||||
|
||||
Assert(ControlFile != NULL);
|
||||
snprintf(file_encryption_keylen_str, sizeof(file_encryption_keylen_str), "%d",
|
||||
ControlFile->file_encryption_keylen);
|
||||
SetConfigOption("file_encryption_keylen", file_encryption_keylen_str, PGC_INTERNAL,
|
||||
PGC_S_OVERRIDE);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -5354,6 +5365,16 @@ BootStrapXLOG(void)
|
||||
/* some additional ControlFile fields are set in WriteControlFile() */
|
||||
WriteControlFile();
|
||||
|
||||
/* Enable file encryption if required */
|
||||
if (ControlFile->file_encryption_keylen > 0)
|
||||
BootStrapKmgr();
|
||||
|
||||
if (terminal_fd != -1)
|
||||
{
|
||||
close(terminal_fd);
|
||||
terminal_fd = -1;
|
||||
}
|
||||
|
||||
/* Bootstrap the commit log, too */
|
||||
BootStrapCLOG();
|
||||
BootStrapCommitTs();
|
||||
|
Reference in New Issue
Block a user