1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| -- Cloud SQL PostgreSQL暗号化設定
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 暗号化テーブル作成
CREATE TABLE customer_data (
id SERIAL PRIMARY KEY,
account_number VARCHAR(20) NOT NULL,
-- 個人識別情報暗号化
customer_name_encrypted BYTEA,
ssn_encrypted BYTEA,
-- クレジットカード情報(PCI DSS準拠)
card_number_encrypted BYTEA,
card_expiry_encrypted BYTEA,
-- メタデータ
created_at TIMESTAMP DEFAULT NOW(),
encryption_key_version VARCHAR(50),
-- 検索用ハッシュ(可逆性なし)
customer_name_hash VARCHAR(64),
account_hash VARCHAR(64)
);
-- 暗号化関数
CREATE OR REPLACE FUNCTION encrypt_pii(
plaintext TEXT,
key_version TEXT
) RETURNS BYTEA AS $$
BEGIN
-- HSM派生キーによる暗号化
-- 実装では Cloud KMS API を使用
RETURN pgp_sym_encrypt(plaintext, key_version);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 復号化関数(監査ログ付き)
CREATE OR REPLACE FUNCTION decrypt_pii(
ciphertext BYTEA,
key_version TEXT,
access_reason TEXT
) RETURNS TEXT AS $$
BEGIN
-- アクセス監査ログ記録
INSERT INTO pii_access_log (
accessed_at,
user_id,
table_name,
reason,
key_version
) VALUES (
NOW(),
current_user,
TG_TABLE_NAME,
access_reason,
key_version
);
-- 復号化実行
RETURN pgp_sym_decrypt(ciphertext, key_version);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
|