Strategi privasi data

Privasi data melindungi data seperti informasi identitas pribadi (PII) dari orang yang seharusnya tidak memiliki akses ke data tersebut. Halaman ini menjelaskan beberapa pendekatan terhadap privasi data yang dapat Anda gunakan untuk melindungi PII Anda di Cloud SQL.

Anda dapat menggunakan Cloud SQL untuk menyimpan PII Anda dengan aman. Anda ingin memastikan bahwa informasi ini diproses dengan perlindungan privasi tertinggi sehingga tidak dapat diakses tanpa sengaja. Misalnya, jika Anda menyimpan informasi kartu kredit atau data layanan kesehatan di database, Anda dapat menggunakan Cloud SQL untuk menyembunyikan atau menyamarkan PII dari pengguna yang tidak memiliki hak istimewa.

Gunakan strategi berikut untuk membantu Anda mengamankan PII Anda di Cloud SQL:

Keamanan tingkat kolom

Keamanan tingkat kolom memungkinkan Anda membatasi siapa saja yang dapat melihat konten di kolom tabel database tertentu. Hak istimewa tingkat kolom berlaku untuk pernyataan INSERT, UPDATE, SELECT, dan REFERENCES.

Misalnya, pertimbangkan situs retail tempat Anda ingin mengatur PII untuk dua pengguna: Jack dan Ali.

--User: "admin"

CREATE SCHEMA secure_schema;

CREATE TABLE secure_schema.user_details(id bigint, name text, age smallint, email_id text, password text);

--For this example, passwords are stored in plain text for demonstration
--purposes only. In production, never store passwords in plain text.

INSERT INTO secure_schema.user_details VALUES(1,'jack',34,'jack@example.com','testpass');
INSERT INTO secure_schema.user_details VALUES(2,'alice',37,'alice@example.com','testpass');

GRANT USAGE ON SCHEMA secure_schema TO analyst_ro;

--Grant read permissions on specific columns only.

GRANT SELECT (id, name, age) ON secure_schema.user_details TO analyst_ro;

--User: "analyst_ro"

SELECT * FROM secure_schema.user_details;
ERROR:  permission denied for table user_details

SELECT name, age, password FROM secure_schema.user_details;
ERROR:  permission denied for table user_details

SELECT id, name,age FROM secure_schema.user_details;
 id | name  | age
----+-------+----
  1 | jack  |  34
  2 | alice |  37

Jika Anda menyertakan kolom terbatas dalam pernyataan SELECT atau memasukkan SELECT *, pesan error akan muncul. Cloud SQL mengamankan PII untuk Jack dan Alice di kolom ini.

Anda juga dapat menggunakan satu pernyataan GRANT untuk menggabungkan hak istimewa yang berbeda.

GRANT SELECT (id,name,age), UPDATE (name) ON secure_schema.user_details TO analyst_ro;

Pendekatan berbasis tampilan

Anda juga bisa mendapatkan keamanan tingkat kolom dengan membuat tampilan di tabel, mengecualikan atau menutupi kolom yang ingin Anda sembunyikan dari pengguna lain, dan memberikan akses ke tampilan sebagai ganti ke tabel.

Contoh berikut menunjukkan cara menggunakan pendekatan berbasis tampilan untuk situs retail guna mengamankan PII untuk Jack dan Anisa:

--User: "admin"

CREATE SCHEMA analyst_ro;
CREATE VIEW analyst_ro.user_details AS SELECT id, name, age FROM secure_schema.user_details;
GRANT USAGE ON SCHEMA analyst_ro TO analyst_ro;
GRANT SELECT ON analyst_ro.user_details TO analyst_ro;

--User: "analyst_ro"

SELECT id,name,age FROM user_details;
 id | name  | age
----+-------+----
  1 | jack  |  34
  2 | alice |  37

SELECT * FROM user_details;
 id | name  | age
----+-------+----
  1 | jack  |  34
  2 | alice |  37

Dalam contoh ini, skema terpisah dibuat untuk tampilan agar namanya tetap sama dengan tabel. Dengan pendekatan berbasis tampilan, Anda dapat menggunakan SELECT *.

Anda juga dapat membuat tampilan dan menyamarkan kolom tabel database sehingga pengguna yang tidak memiliki hak istimewa tidak dapat melihat PII yang disamarkan.

CREATE VIEW analyst_ro.user_details AS SELECT id, name, age, 'redacted@example.com' as email_id,'*****'::text as password FROM secure_schema.user_details;

SELECT * FROM user_details;
 id | name  | age |     email_id         | password
----+-------+-----+----------------------+---------
  1 | jack  |  34 | redacted@example.com | *****
  2 | alice |  37 | redacted@example.com | *****

Keamanan tingkat baris

Keamanan tingkat kolom dan pendekatan berbasis tampilan memungkinkan Anda menyembunyikan PII di kolom tabel database dari pengguna tertentu. Namun, terkadang Anda ingin memfilter data ini dan memberikan akses ke baris tabel tertentu. Tabel ini berisi PII yang hanya dapat diakses oleh pengguna tertentu, berdasarkan kondisi pengguna yang memenuhi syarat. Hal ini dikenal sebagai keamanan tingkat baris.

Keamanan tingkat baris berguna untuk aplikasi multi-tenant tempat pengguna memiliki hak istimewa akses baca dan akses tulis untuk PII mereka sendiri saja. Di Cloud SQL, tabel dapat memiliki kebijakan keamanan tingkat baris yang membatasi, per pengguna, baris mana yang dapat dilihat pengguna dengan membuat kueri, atau baris yang dapat disisipkan, diperbarui, atau dihapus pengguna dengan menjalankan perintah modifikasi data.

Untuk contoh situs retail, Anda dapat menerapkan keamanan tingkat baris untuk Jaka dan Anisa sehingga mereka dapat melihat PII mereka sendiri, tetapi tidak dapat mengubah atau menghapusnya.

--User: "admin"
--Create and enable a policy for row-level security

CREATE POLICY user_details_rls_pol ON secure_schema.user_details FOR ALL TO PUBLIC USING (name=current_user);
ALTER TABLE secure_schema.user_details ENABLE ROW LEVEL SECURITY;

SELECT * FROM secure_schema.user_details;
 id | name  | age |     email_id      | password
----+-------+-----+-------------------+---------
  1 | jack  |  34 | jack@example.com  | testpass
  2 | alice |  37 | alice@example.com | testpass

--User: "jack"

SELECT * FROM secure_schema.user_details;
 id | name | age |    email_id      | password
----+------+-----+------------------+---------
  1 | jack |  34 | jack@example.com | testpass

--User: "alice"

SELECT * FROM secure_schema.user_details;
 id | name  | age |    email_id       | password
----+-------+-----+-------------------+---------
  2 | alice |  37 | alice@example.com | testpass

Pengguna yang diberi peran yang memiliki atribut BYPASSRLS dapat mengabaikan keamanan tingkat baris saat mereka mengakses tabel. Pemilik tabel juga dapat mengabaikan keamanan tingkat baris. Jika Anda ingin pemilik tabel menerapkan keamanan tingkat baris, gunakan perintah ALTER TABLE ... FORCE ROW LEVEL SECURITY.

Terkadang, Anda tidak ingin menerapkan keamanan tingkat baris ke baris tabel database. Misalnya, jika menggunakan pg_dump untuk mengambil cadangan tabel, Anda tidak ingin baris apa pun dihilangkan dari cadangan. Untuk mencegah hal ini terjadi, bagi pengguna yang melakukan cadangan, tetapkan parameter konfigurasi row_security ke OFF. Jika ada baris yang difilter berdasarkan keamanan tingkat baris, pesan error akan muncul.

Menyamarkan dan menganonimkan data

Selain menyamarkan data menggunakan pendekatan berbasis tampilan, Anda dapat menyamarkan data dengan menggunakan ekstensi postgresql_anonymizer. Ekstensi ini menyamarkan atau mengganti data PII atau data sensitif secara komersial dari database PostgreSQL.

Menggunakan ekstensi dibandingkan pendekatan berbasis tampilan akan memberi Anda manfaat berikut:

  • Anda memiliki berbagai fungsi penyamaran seperti substitusi, pengacakan, pemalsuan, pseudonimisasi, pengacakan parsial, pengacakan, penambahan derau, dan generalisasi.

  • Anda dapat membuat data disamarkan yang bermakna yang dapat digunakan untuk pengujian fungsional dan pemrosesan data.

  • Anda dapat menggunakan PostgreSQL Data Definition Language (DDL) untuk mendeklarasikan aturan masking dan menentukan strategi anonimisasi di dalam definisi tabel.

Menginstal dan mengonfigurasi ekstensi postgresql_anonymizer

Untuk menggunakan ekstensi ini pada instance Cloud SQL, selesaikan langkah-langkah berikut:

  1. Edit instance, lalu tetapkan cloudsql.enable_anon flag ke on. Untuk mengetahui informasi tentang cara menetapkan tanda dan meninjau tanda yang didukung untuk ekstensi, lihat Mengonfigurasi tanda database.

  2. Buat ekstensi di database dengan menjalankan perintah berikut:

    --Connect to the PostgreSQL database
    
    CREATE EXTENSION IF NOT EXISTS anon CASCADE;
    SELECT anon.init();
    

Setelah Anda menginstal dan mengonfigurasi ekstensi, gunakan ekstensi tersebut pada instance untuk menerapkan strategi anonimisasi dinamis, masker statis, dan dump anonim.

Mask dinamis

Gunakan mask dinamis untuk menentukan aturan masking bagi pengguna tertentu. Pengguna ini tidak dapat melihat PII. Sebagai gantinya, mereka akan melihat data yang disamarkan. Semua pengguna lain akan melihat data yang tidak disamarkan. Cara ini berguna dalam lingkungan produksi jika Anda tidak ingin mengubah PII, tetapi hanya menyembunyikannya dari pengguna tertentu.

Untuk contoh {i>website<i} ritel, Anda dapat menerapkan mask dinamis sehingga administrator dapat melihat alamat email dan kata sandi yang tidak bersembunyi untuk Jack dan Alice, tetapi analis hanya dapat melihat data yang disamarkan.

--Activate the dynamic masking engine

SELECT anon.start_dynamic_masking();

--Declare the masking user and masking rules
--analyst_ro is the masked user with select privileges on the
--user_details table

SECURITY LABEL FOR anon ON ROLE analyst_ro IS 'MASKED';

SECURITY LABEL FOR anon ON COLUMN secure_schema.user_details.email_id IS 'MASKED WITH FUNCTION anon.fake_email()';
SECURITY LABEL FOR anon ON COLUMN secure_schema.user_details.password  IS 'MASKED WITH FUNCTION anon.hash(password)';

--User: "admin" (can see all unmasked data)

SELECT * FROM secure_schema.user_details;
 id | name  | age |    email_id       | password
----+-------+-----+------------  -----+---------
  1 | jack  |  34 | jack@example.com  | testpass
  2 | alice |  37 | alice@example.com | testpass

--User:"analyst_ro" (note that the "email_id" and "password" columns are
--replaced with masked data,)
--Data in the password column is truncated for better formatting.

SELECT * FROM secure_schema.user_details;
 id | name  | age |       email_id         | password
----+-------+-----+-----------------  -----+----------------
  1 | jack  |  34 | alisontodd@example.com | 13d249f2cb4127b
  2 | alice |  37 | amanda35@example.com   | 13d249f2cb4127b

Mask statis

Gunakan mask statis untuk menghapus PII dalam tabel, sesuai dengan kriteria yang ditentukan dalam aturan penyamaran, dan ganti informasi ini dengan data yang disamarkan. Pengguna tidak dapat mengambil data yang tidak disamarkan. Hal ini berguna dalam lingkungan pengujian jika Anda ingin mengubah PII dan Anda tidak ingin ada pengguna yang melihat informasi ini.

Untuk contoh situs retail, Anda dapat menerapkan mask statis sehingga tidak ada pengguna yang dapat melihat sandi dan alamat email yang tidak disamarkan untuk Jack dan Alice. Sebagai gantinya, mereka hanya melihat data yang disamarkan.

--User: "admin"

SELECT * FROM secure_schema.user_details;
 id | name  | age |    email_id       | password
----+-------+-----+--------------  ---+---------
  1 | jack  |  34 | jack@example.com  | testpass
  2 | alice |  37 | alice@example.com | testpass

--Apply earlier defined masking rules to the table permanently.
--Now all users see masked data only.

SELECT anon.anonymize_table('secure_schema.user_details');
 anonymize_table
-----------------
 t

--User: "analyst_ro"
--Data in the password column is truncated for better formatting.

select * from secure_schema.user_details;
 id | name  | age |           email_id              |  password
----+-------+-----+-------------------------  ------+---------------
  1 | jack  |  34 | christophercampbell@example.com | 13d249f2cb412c
  2 | alice |  37 | annebenitez@example.com         | 13d249f2cb4127

Dump anonim

Gunakan dump anonim untuk mengekspor data yang disamarkan ke file SQL. Untuk contoh situs retail, Anda dapat membuat file dump untuk data disamarkan yang terdapat di tabel user_details.

--Launch pg_dump_anon with the masked user to apply earlier defined --masking rules

pg_dump_anon -h HOSTIP -p 5432 -d DATABASE_NAME -U analyst_ro --table=secure_schema.user_details --file=user_details_anonysms.sql

Mengenkripsi data

Meskipun Anda dapat menyamarkan PII, informasi tersebut disimpan di database sebagai teks biasa. Administrator dapat melihat informasi ini.

Gunakan ekstensi pgcrypto untuk mengenkripsi PII sebelum menyimpannya. Dengan cara ini, hanya pengguna yang memiliki kunci enkripsi valid yang dapat mendekripsi informasi dan melihatnya sebagai teks biasa.

Ekstensi pgcrypto memiliki sejumlah fungsi hash dan encrypt.

Hash

Hash adalah fungsi kriptografi satu arah yang mengharuskan Anda mengenkripsi PII saja. Hal ini berguna untuk menyimpan {i>password<i} dalam format {i>hash<i} dan mencocokkan {i>password<i} yang dimasukkan pengguna dengan {i>password<i} yang di-hash. Sandi yang di-hash tidak pernah didekripsi dalam teks biasa.

Untuk contoh situs retail, Anda dapat menggunakan ekstensi pgcrypto untuk melakukan hashing pada sandi Jack sebelum menyimpannya di tabel user_details.

--Hash passwords before storing them in the user_details table.

TRUNCATE TABLE secure_schema.user_details;
INSERT INTO secure_schema.user_details VALUES(1,'jack',34,'jack@example.com',crypt('testpassword', gen_salt('bf')));

--Match the hashed data with user entered password

SELECT id, name FROM secure_schema.user_details WHERE email_id = 'jack@example.com' AND password = crypt('testpassword', password);
 id | name
----+-----
  1 | jack

Enkripsikan

Gunakan fungsi kriptografi enkripsi untuk mengenkripsi PII dengan kunci. Pengguna kemudian memerlukan kunci ini untuk mendekripsi informasi menjadi teks biasa. Hal ini berguna untuk menyimpan informasi kartu kredit dan detail bank jika aplikasi ingin mengambil PII dalam format yang dapat dibaca.

Untuk contoh situs web ritel, {i>password<i} dan alamat email Jack telah dienkripsi. Pengguna yang memiliki kunci enkripsi dapat mendekripsi informasi ini dan melihatnya sebagai teks biasa. Untuk semua pengguna lainnya, pesan error akan muncul.

--"user_acc_key" is the encryption key

TRUNCATE TABLE secure_schema.user_details;
INSERT INTO secure_schema.user_details VALUES(1,'jack',34,pgp_sym_encrypt('jack@example.com','user_acc_key'),pgp_sym_encrypt('testpassword','user_acc_key'));

--User: "admin" (queries without an encryption key)
--Data in the email_id and password columns are truncated for better
--formatting.

SELECT * FROM secure_schema.user_details;
 id | name  | age |    email_id     | password
----+-------+-----+-----------------+-------------------
  1 | jack |  34 | \xc30d0407030209 | \xc30d040703028962

--User: "app_user" (queries with a valid encryption key)

SELECT name,pgp_sym_decrypt(email_id::bytea,'user_acc_key'),pgp_sym_decrypt(password::bytea,'user_acc_key') FROM secure_schema.user_details;
 name | pgp_sym_decrypt   | pgp_sym_decrypt
------+-------------------+----------------
 jack | jack@example.com  | testpassword

--If a user uses the wrong encryption key, then the following error message appears:

SELECT name,pgp_sym_decrypt(email_id::bytea,'user_bad_key'),
pgp_sym_decrypt(password::bytea,'user_bad_key') FROM secure_schema.user_details;
ERROR:  Wrong key or corrupt data

Langkah selanjutnya

Pelajari kontrol tambahan berikut yang dapat Anda gunakan untuk melindungi PII dari akses yang tidak sah: