You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ra...@apache.org on 2021/05/17 23:05:15 UTC
[trafficcontrol] branch master updated: AES encryption for all
Postgres TV (#5860)
This is an automated email from the ASF dual-hosted git repository.
rawlin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new f469a47 AES encryption for all Postgres TV (#5860)
f469a47 is described below
commit f469a47bae84218b97da56dffb3d705502b1c42a
Author: mattjackson220 <33...@users.noreply.github.com>
AuthorDate: Mon May 17 17:04:56 2021 -0600
AES encryption for all Postgres TV (#5860)
---
traffic_ops/app/db/trafficvault/create_tables.sql | 6 +--
.../trafficvault/backends/postgres/postgres.go | 50 +++++++++++++++++-----
.../backends/postgres/uri_signing_keys.go | 23 ++++++----
3 files changed, 58 insertions(+), 21 deletions(-)
diff --git a/traffic_ops/app/db/trafficvault/create_tables.sql b/traffic_ops/app/db/trafficvault/create_tables.sql
index 9126672..6ba75c2 100644
--- a/traffic_ops/app/db/trafficvault/create_tables.sql
+++ b/traffic_ops/app/db/trafficvault/create_tables.sql
@@ -62,7 +62,7 @@ SET default_table_access_method = heap;
CREATE TABLE IF NOT EXISTS dnssec (
cdn text NOT NULL,
- data jsonb NOT NULL,
+ data bytea NOT NULL,
last_updated timestamp with time zone DEFAULT now() NOT NULL
);
@@ -75,7 +75,7 @@ ALTER TABLE dnssec OWNER TO traffic_vault;
CREATE TABLE IF NOT EXISTS sslkey (
id bigint NOT NULL,
- data jsonb NOT NULL,
+ data bytea NOT NULL,
deliveryservice text NOT NULL,
cdn text NOT NULL,
version text NOT NULL,
@@ -112,7 +112,7 @@ ALTER SEQUENCE sslkey_id_seq OWNED BY sslkey.id;
CREATE TABLE IF NOT EXISTS uri_signing_key (
deliveryservice text NOT NULL,
- data jsonb NOT NULL,
+ data bytea NOT NULL,
last_updated timestamp with time zone DEFAULT now() NOT NULL
);
diff --git a/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/postgres.go b/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/postgres.go
index 993fb23..7e4e669 100644
--- a/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/postgres.go
+++ b/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/postgres.go
@@ -114,12 +114,12 @@ func (p *Postgres) GetDeliveryServiceSSLKeys(xmlID string, version string, tx *s
return tc.DeliveryServiceSSLKeysV15{}, false, err
}
defer p.commitTransaction(tvTx, dbCtx, cancelFunc)
- var jsonKeys string
+ var encryptedSslKeys []byte
query := "SELECT data FROM sslkey WHERE deliveryservice=$1 AND version=$2"
if version == "" {
version = "latest"
}
- err = tvTx.QueryRow(query, xmlID, version).Scan(&jsonKeys)
+ err = tvTx.QueryRow(query, xmlID, version).Scan(&encryptedSslKeys)
if err != nil {
if err == sql.ErrNoRows {
return tc.DeliveryServiceSSLKeysV15{}, false, nil
@@ -127,6 +127,12 @@ func (p *Postgres) GetDeliveryServiceSSLKeys(xmlID string, version string, tx *s
e := checkErrWithContext("Traffic Vault PostgreSQL: executing SELECT SSL Keys query", err, ctx.Err())
return tc.DeliveryServiceSSLKeysV15{}, false, e
}
+
+ jsonKeys, err := aesDecrypt(encryptedSslKeys, p.aesKey)
+ if err != nil {
+ return tc.DeliveryServiceSSLKeysV15{}, false, err
+ }
+
sslKey := tc.DeliveryServiceSSLKeysV15{}
err = json.Unmarshal([]byte(jsonKeys), &sslKey)
if err != nil {
@@ -155,8 +161,13 @@ func (p *Postgres) PutDeliveryServiceSSLKeys(key tc.DeliveryServiceSSLKeys, tx *
return e
}
+ encryptedKey, err := aesEncrypt(keyJSON, p.aesKey)
+ if err != nil {
+ return errors.New("encrypting keys: " + err.Error())
+ }
+
// insert the new ssl keys now
- res, err := tvTx.Exec("INSERT INTO sslkey (deliveryservice, data, cdn, version) VALUES ($1, $2, $3, $4), ($5, $6, $7, $8)", key.DeliveryService, keyJSON, key.CDN, strconv.FormatInt(int64(key.Version), 10), key.DeliveryService, keyJSON, key.CDN, latestVersion)
+ res, err := tvTx.Exec("INSERT INTO sslkey (deliveryservice, data, cdn, version) VALUES ($1, $2, $3, $4), ($5, $6, $7, $8)", key.DeliveryService, encryptedKey, key.CDN, strconv.FormatInt(int64(key.Version), 10), key.DeliveryService, encryptedKey, key.CDN, latestVersion)
if err != nil {
e := checkErrWithContext("Traffic Vault PostgreSQL: executing INSERT SSL Key query", err, ctx.Err())
return e
@@ -235,11 +246,18 @@ func (p *Postgres) GetCDNSSLKeys(cdnName string, tx *sql.Tx, ctx context.Context
}
defer rows.Close()
for rows.Next() {
- jsonKey := ""
- if err := rows.Scan(&jsonKey); err != nil {
+ encryptedSslKeys := []byte{}
+ if err := rows.Scan(&encryptedSslKeys); err != nil {
e := checkErrWithContext("Traffic Vault PostgreSQL: scanning CDN SSL keys", err, ctx.Err())
return keys, e
}
+
+ jsonKey, err := aesDecrypt(encryptedSslKeys, p.aesKey)
+ if err != nil {
+ log.Errorf("couldn't decrypt key: %v", err)
+ continue
+ }
+
err = json.Unmarshal([]byte(jsonKey), &key)
if err != nil {
log.Errorf("couldn't unmarshal json key: %v", err)
@@ -256,14 +274,20 @@ func (p *Postgres) GetDNSSECKeys(cdnName string, tx *sql.Tx, ctx context.Context
return tc.DNSSECKeysTrafficVault{}, false, err
}
defer p.commitTransaction(tvTx, dbCtx, cancelFunc)
- var dnssecJSON string
- if err := tvTx.QueryRow("SELECT data FROM dnssec WHERE cdn = $1", cdnName).Scan(&dnssecJSON); err != nil {
+ var encryptedDnssecKey []byte
+ if err := tvTx.QueryRow("SELECT data FROM dnssec WHERE cdn = $1", cdnName).Scan(&encryptedDnssecKey); err != nil {
if err == sql.ErrNoRows {
return tc.DNSSECKeysTrafficVault{}, false, nil
}
e := checkErrWithContext("Traffic Vault PostgreSQL: executing SELECT DNSSEC keys query", err, ctx.Err())
return tc.DNSSECKeysTrafficVault{}, false, e
}
+
+ dnssecJSON, err := aesDecrypt(encryptedDnssecKey, p.aesKey)
+ if err != nil {
+ return tc.DNSSECKeysTrafficVault{}, false, err
+ }
+
dnssecKeys := tc.DNSSECKeysTrafficVault{}
if err := json.Unmarshal([]byte(dnssecJSON), &dnssecKeys); err != nil {
return tc.DNSSECKeysTrafficVault{}, false, errors.New("unmarshalling DNSSEC keys: " + err.Error())
@@ -286,7 +310,13 @@ func (p *Postgres) PutDNSSECKeys(cdnName string, keys tc.DNSSECKeysTrafficVault,
e := checkErrWithContext("Traffic Vault PostgreSQL: executing DELETE DNSSEC keys query prior to INSERT", err, ctx.Err())
return e
}
- res, err := tvTx.Exec("INSERT INTO dnssec (cdn, data) VALUES ($1, $2)", cdnName, dnssecJSON)
+
+ encryptedKey, err := aesEncrypt(dnssecJSON, p.aesKey)
+ if err != nil {
+ return errors.New("encrypting keys: " + err.Error())
+ }
+
+ res, err := tvTx.Exec("INSERT INTO dnssec (cdn, data) VALUES ($1, $2)", cdnName, encryptedKey)
if err != nil {
e := checkErrWithContext("Traffic Vault PostgreSQL: executing INSERT DNSSEC keys query", err, ctx.Err())
return e
@@ -348,7 +378,7 @@ func (p *Postgres) GetURISigningKeys(xmlID string, tx *sql.Tx, ctx context.Conte
return []byte{}, false, err
}
defer p.commitTransaction(tvTx, dbCtx, cancelFunc)
- return getURISigningKeys(xmlID, tvTx, ctx)
+ return getURISigningKeys(xmlID, tvTx, ctx, p.aesKey)
}
func (p *Postgres) PutURISigningKeys(xmlID string, keysJson []byte, tx *sql.Tx, ctx context.Context) error {
@@ -358,7 +388,7 @@ func (p *Postgres) PutURISigningKeys(xmlID string, keysJson []byte, tx *sql.Tx,
}
defer p.commitTransaction(tvTx, dbCtx, cancelFunc)
- return putURISigningKeys(xmlID, tvTx, keysJson, ctx)
+ return putURISigningKeys(xmlID, tvTx, keysJson, ctx, p.aesKey)
}
func (p *Postgres) DeleteURISigningKeys(xmlID string, tx *sql.Tx, ctx context.Context) error {
diff --git a/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/uri_signing_keys.go b/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/uri_signing_keys.go
index 8378ae2..055e96e 100644
--- a/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/uri_signing_keys.go
+++ b/traffic_ops/traffic_ops_golang/trafficvault/backends/postgres/uri_signing_keys.go
@@ -22,15 +22,13 @@ package postgres
import (
"context"
"database/sql"
- "encoding/json"
"errors"
-
"github.com/jmoiron/sqlx"
)
-func getURISigningKeys(xmlID string, tvTx *sqlx.Tx, ctx context.Context) ([]byte, bool, error) {
- var jsonUriKeys json.RawMessage
- if err := tvTx.QueryRow("SELECT data FROM uri_signing_key WHERE deliveryservice = $1", xmlID).Scan(&jsonUriKeys); err != nil {
+func getURISigningKeys(xmlID string, tvTx *sqlx.Tx, ctx context.Context, aesKey []byte) ([]byte, bool, error) {
+ var encryptedUriSigningKey []byte
+ if err := tvTx.QueryRow("SELECT data FROM uri_signing_key WHERE deliveryservice = $1", xmlID).Scan(&encryptedUriSigningKey); err != nil {
if err == sql.ErrNoRows {
return []byte{}, false, nil
}
@@ -38,17 +36,26 @@ func getURISigningKeys(xmlID string, tvTx *sqlx.Tx, ctx context.Context) ([]byte
return []byte{}, false, e
}
+ jsonUriKeys, err := aesDecrypt(encryptedUriSigningKey, aesKey)
+ if err != nil {
+ return []byte{}, false, err
+ }
+
return []byte(jsonUriKeys), true, nil
}
-func putURISigningKeys(xmlID string, tvTx *sqlx.Tx, keys []byte, ctx context.Context) error {
-
+func putURISigningKeys(xmlID string, tvTx *sqlx.Tx, keys []byte, ctx context.Context, aesKey []byte) error {
// Delete old keys first if they exist
if err := deleteURISigningKeys(xmlID, tvTx, ctx); err != nil {
return err
}
- res, err := tvTx.Exec("INSERT INTO uri_signing_key (deliveryservice, data) VALUES ($1, $2)", xmlID, keys)
+ encryptedKey, err := aesEncrypt(keys, aesKey)
+ if err != nil {
+ return errors.New("encrypting keys: " + err.Error())
+ }
+
+ res, err := tvTx.Exec("INSERT INTO uri_signing_key (deliveryservice, data) VALUES ($1, $2)", xmlID, encryptedKey)
if err != nil {
e := checkErrWithContext("Traffic Vault PostgreSQL: executing INSERT URI Sig Keys query", err, ctx.Err())
return e