Private Vault: สร้าง "ข่าวกรองแบบ Zero Trust" ด้วยความปลอดภัยระดับแถวของ AlloyDB

1. ภาพรวม

ในการเร่งสร้างแอปพลิเคชัน GenAI เรามักจะลืมองค์ประกอบที่สำคัญที่สุด นั่นก็คือความปลอดภัย

ลองนึกภาพการสร้างแชทบ็อตสำหรับฝ่ายทรัพยากรบุคคล คุณต้องการให้ตอบคำถาม เช่น "เงินเดือนของฉันคือเท่าไหร่" หรือ "ทีมของฉันมีผลงานเป็นอย่างไร"

  • หาก Alice (พนักงานทั่วไป) ถาม เธอควรเห็นเฉพาะข้อมูลของตนเอง
  • หาก Bob (ผู้จัดการ) ถาม เขาควรจะเห็นข้อมูลของทีม

ปัญหา

สถาปัตยกรรม RAG (Retrieval Augmented Generation) ส่วนใหญ่พยายามจัดการปัญหานี้ในเลเยอร์แอปพลิเคชัน โดยจะกรองข้อมูลหลังจากดึงข้อมูลมาแล้ว หรืออาศัย LLM ให้ "ทำงาน" นี่เป็นสิ่งเปราะบาง หากตรรกะของแอปทำงานไม่ถูกต้อง ข้อมูลจะรั่วไหล

วิธีแก้ปัญหา

ผลักดันการรักษาความปลอดภัยลงไปที่ชั้นฐานข้อมูล การใช้ความปลอดภัยระดับแถว (RLS) ของ PostgreSQL ใน AlloyDB ช่วยให้มั่นใจได้ว่าฐานข้อมูลจะปฏิเสธที่จะแสดงข้อมูลที่ผู้ใช้ไม่ได้รับอนุญาตให้ดู ไม่ว่า AI จะขออะไรก็ตาม

ในคู่มือนี้ เราจะสร้าง "ห้องเก็บข้อมูลส่วนตัว" ซึ่งเป็นผู้ช่วยฝ่ายทรัพยากรบุคคลที่ปลอดภัยซึ่งจะเปลี่ยนคำตอบแบบไดนามิกตามผู้ที่เข้าสู่ระบบ

1e095ac5fe069bb6.png

สถาปัตยกรรม

เราไม่ได้สร้างตรรกะการให้สิทธิ์ที่ซับซ้อนใน Python เรากำลังใช้เครื่องมือฐานข้อมูลเอง

  1. อินเทอร์เฟซ: แอป Streamlit ที่เรียบง่ายซึ่งจำลองการเข้าสู่ระบบ
  2. สมอง: AlloyDB AI (เข้ากันได้กับ PostgreSQL)
  3. กลไกการทำงาน: เราตั้งค่าตัวแปรเซสชัน (app.active_user) เมื่อเริ่มธุรกรรมทุกครั้ง นโยบายฐานข้อมูลจะตรวจสอบuser_rolesตาราง (ทำหน้าที่เป็นผู้ให้บริการข้อมูลประจำตัว) โดยอัตโนมัติเพื่อกรองแถว

สิ่งที่คุณจะสร้าง

แอปพลิเคชันผู้ช่วยฝ่ายทรัพยากรบุคคลที่ปลอดภัย คุณจะใช้การรักษาความปลอดภัยระดับแถว (RLS) ในเครื่องมือฐานข้อมูล AlloyDB โดยตรงแทนที่จะพึ่งพาตรรกะของแอปพลิเคชันเพื่อกรองข้อมูลที่ละเอียดอ่อน วิธีนี้ช่วยให้มั่นใจได้ว่าแม้โมเดล AI จะ "หลอน" หรือพยายามเข้าถึงข้อมูลที่ไม่ได้รับอนุญาต แต่ฐานข้อมูลจะไม่ยอมส่งข้อมูลดังกล่าวกลับมา

สิ่งที่คุณจะได้เรียนรู้

คุณจะได้เรียนรู้:

  • วิธีออกแบบสคีมาสำหรับ RLS (แยกข้อมูลกับข้อมูลประจำตัว)
  • วิธีเขียนนโยบาย PostgreSQL (CREATE POLICY)
  • วิธีข้ามข้อยกเว้น "เจ้าของตาราง" โดยใช้ FORCE ROW LEVEL SECURITY
  • วิธีสร้างแอป Python ที่ทำ "การสลับบริบท" ให้กับผู้ใช้

ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • สิทธิ์เข้าถึง Cloud Shell หรือเทอร์มินัลที่ติดตั้ง gcloud และ psql

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์

  1. ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
  2. ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าโปรเจ็กต์เปิดใช้การเรียกเก็บเงินแล้วหรือไม่
  1. คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

รูปภาพปุ่มเปิดใช้งาน Cloud Shell

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
  1. หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
  1. เปิดใช้ API ที่จำเป็น: ทำตามลิงก์และเปิดใช้ API

หรือจะใช้คำสั่ง gcloud สำหรับการดำเนินการนี้ก็ได้ โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ

gcloud services enable \
  alloydb.googleapis.com \
  compute.googleapis.com \
  cloudresourcemanager.googleapis.com \
  servicenetworking.googleapis.com \
  aiplatform.googleapis.com

ข้อควรระวังและการแก้ปัญหา

กลุ่มอาการ"โปรเจ็กต์ผี"

คุณเรียกใช้ gcloud config set project แต่จริงๆ แล้วคุณกำลังดูโปรเจ็กต์อื่นใน UI ของคอนโซล ตรวจสอบรหัสโปรเจ็กต์ในเมนูแบบเลื่อนลงด้านซ้ายบน

แผงกั้น การเรียกเก็บเงิน

คุณเปิดใช้โปรเจ็กต์แล้ว แต่ลืมบัญชีสำหรับการเรียกเก็บเงิน AlloyDB เป็นเครื่องมือที่มีประสิทธิภาพสูง จึงจะไม่เริ่มทำงานหาก "ถังน้ำมัน" (การเรียกเก็บเงิน) ว่างเปล่า

ความล่าช้าการเผยแพร่ API

คุณคลิก "เปิดใช้ API" แต่บรรทัดคำสั่งยังคงแสดง Service Not Enabled รอ 60 วินาที ระบบคลาวด์ต้องใช้เวลาสักครู่ในการเปิดใช้งานนิวรอน

คำถามที่พบบ่อยเกี่ยวกับโควต้า

หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ AlloyDB หาก us-central1 ไม่สำเร็จ ให้ลอง us-east1

3. การตั้งค่าฐานข้อมูล

ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ โดยจะใช้คลัสเตอร์เพื่อจัดเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง

มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่จะโหลดชุดข้อมูลทดสอบกัน

  1. คลิกปุ่มหรือคัดลอกลิงก์ด้านล่างไปยังเบราว์เซอร์ที่คุณเข้าสู่ระบบผู้ใช้ Google Cloud Console

  1. เมื่อทำขั้นตอนนี้เสร็จแล้ว ระบบจะโคลนที่เก็บไปยังโปรแกรมแก้ไข Cloud Shell ในเครื่อง และคุณจะเรียกใช้คำสั่งด้านล่างจากโฟลเดอร์โปรเจ็กต์ได้ (โปรดตรวจสอบว่าคุณอยู่ในไดเรกทอรีโปรเจ็กต์)
sh run.sh
  1. ตอนนี้ให้ใช้ UI (คลิกลิงก์ในเทอร์มินัลหรือคลิกลิงก์ "แสดงตัวอย่างบนเว็บ" ในเทอร์มินัล
  2. ป้อนรายละเอียดสำหรับรหัสโปรเจ็กต์ ชื่อคลัสเตอร์ และชื่ออินสแตนซ์เพื่อเริ่มต้นใช้งาน
  3. ไปหากาแฟดื่มระหว่างที่บันทึกเลื่อนลงมาเรื่อยๆ และคุณสามารถอ่านเกี่ยวกับวิธีที่ระบบดำเนินการนี้เบื้องหลังได้ที่นี่ ซึ่งอาจใช้เวลาประมาณ 10-15 นาที

ข้อควรระวังและการแก้ปัญหา

ปัญหาเรื่อง "ความอดทน"

คลัสเตอร์ฐานข้อมูลเป็นโครงสร้างพื้นฐานที่มีขนาดใหญ่ หากรีเฟรชหน้าเว็บหรือปิดเซสชัน Cloud Shell เนื่องจาก "ดูเหมือนว่าค้างอยู่" คุณอาจมีอินสแตนซ์ "ผี" ที่มีการจัดสรรบางส่วนและลบไม่ได้หากไม่ดำเนินการด้วยตนเอง

ภูมิภาคไม่ตรงกัน

หากเปิดใช้ API ใน us-central1 แต่พยายามจัดสรรคลัสเตอร์ใน asia-south1 คุณอาจพบปัญหาเกี่ยวกับโควต้าหรือการหน่วงเวลาของสิทธิ์ในบัญชีบริการ ใช้ภูมิภาคเดียวตลอดทั้งแล็บ

คลัสเตอร์ซอมบี้

หากก่อนหน้านี้คุณใช้ชื่อเดียวกันสำหรับคลัสเตอร์และไม่ได้ลบคลัสเตอร์ออก สคริปต์อาจแจ้งว่ามีชื่อคลัสเตอร์อยู่แล้ว ชื่อคลัสเตอร์ต้องไม่ซ้ำกันภายในโปรเจ็กต์

การหมดเวลาของ Cloud Shell

หากคุณพักดื่มกาแฟเป็นเวลา 30 นาที Cloud Shell อาจเข้าสู่โหมดสลีปและยกเลิกการเชื่อมต่อกระบวนการ sh run.sh อย่าปิดแท็บ

4. การจัดสรรสคีมา

ในขั้นตอนนี้ เราจะพูดถึงหัวข้อต่อไปนี้

d05d7d2706c689dc.png

การดำเนินการแบบทีละขั้นตอนโดยละเอียดมีดังนี้

เมื่อคลัสเตอร์และอินสแตนซ์ AlloyDB ทำงานแล้ว ให้ไปที่โปรแกรมแก้ไข SQL ของ AlloyDB Studio เพื่อเปิดใช้ส่วนขยาย AI และจัดสรรสคีมา

1e3ac974b18a8113.png

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จเรียบร้อย เมื่อพร้อมแล้ว ให้ลงชื่อเข้าใช้ AlloyDB โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างคลัสเตอร์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL

  • ชื่อผู้ใช้ : "postgres"
  • ฐานข้อมูล : "postgres"
  • รหัสผ่าน : "alloydb" (หรือรหัสผ่านที่คุณตั้งค่าไว้ตอนสร้าง)

เมื่อตรวจสอบสิทธิ์ใน AlloyDB Studio สำเร็จแล้ว ให้ป้อนคำสั่ง SQL ในเอดิเตอร์ คุณเพิ่มหน้าต่างเอดิเตอร์ได้หลายหน้าต่างโดยใช้เครื่องหมายบวกทางด้านขวาของหน้าต่างสุดท้าย

28cb9a8b6aa0789f.png

คุณจะป้อนคำสั่งสำหรับ AlloyDB ในหน้าต่างเอดิเตอร์โดยใช้ตัวเลือกเรียกใช้ จัดรูปแบบ และล้างตามที่จำเป็น

สร้างตาราง

เราต้องใช้ 2 ตาราง ได้แก่ ตารางสำหรับข้อมูลที่ละเอียดอ่อน (พนักงาน) และตารางสำหรับกฎระบุตัวตน (user_roles) การแยกทั้ง 2 อย่างนี้เป็นสิ่งสำคัญเพื่อหลีกเลี่ยงข้อผิดพลาด "การเรียกซ้ำไม่สิ้นสุด" ในนโยบาย

คุณสร้างตารางได้โดยใช้คำสั่ง DDL ด้านล่างใน AlloyDB Studio

-- 1. Create User Roles (The Identity Provider)
CREATE TABLE user_roles (
    username TEXT PRIMARY KEY,
    role TEXT -- 'employee', 'manager', 'admin'
);

INSERT INTO user_roles (username, role) VALUES
('Alice', 'employee'),
('Bob', 'manager'),
('Charlie', 'employee');

-- 2. Create the Data Table
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT,
    salary INTEGER,
    performance_review TEXT
);

INSERT INTO employees (name, salary, performance_review) VALUES
('Alice', 80000, 'Alice meets expectations but needs to improve punctuality.'),
('Bob', 120000, 'Bob is a strong leader. Team morale is high.'),
('Charlie', 85000, 'Charlie exceeds expectations. Ready for promotion.');

ข้อควรระวังและการแก้ปัญหา

ตรวจพบการเรียกซ้ำแบบไม่สิ้นสุดขณะกำหนดบทบาทภายในตารางพนักงาน

สาเหตุที่ล้มเหลว: หากนโยบายระบุว่า "ตรวจสอบตารางพนักงานเพื่อดูว่าฉันเป็นผู้จัดการหรือไม่" ฐานข้อมูลจะต้องค้นหาตารางเพื่อตรวจสอบนโยบาย ซึ่งจะทริกเกอร์นโยบายอีกครั้ง ผลลัพธ์: ตรวจพบการเรียกซ้ำแบบไม่มีที่สิ้นสุดวิธีแก้ไข: เก็บตารางการค้นหาแยกต่างหาก (user_roles) เสมอ หรือใช้ผู้ใช้ฐานข้อมูลจริงสำหรับบทบาท

ตรวจสอบข้อมูล

SELECT count(*) FROM employees;
-- Output: 3

5. เปิดใช้และบังคับใช้การรักษาความปลอดภัย

ตอนนี้เราจะเปิดใช้โล่ นอกจากนี้ เราจะสร้าง "ผู้ใช้แอป" ทั่วไปซึ่งโค้ด Python จะใช้ในการเชื่อมต่อด้วย

เรียกใช้คำสั่ง SQL ด้านล่างจากตัวแก้ไขการค้นหา AlloyDB

-- 1. Activate RLS
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;


-- 2. CRITICAL: Force RLS for Table Owners
ALTER TABLE employees FORCE ROW LEVEL SECURITY;


-- 3. Create the Application User
DO
$do$
BEGIN
   IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_user') THEN
      CREATE ROLE app_user LOGIN PASSWORD 'password';
   END IF;
END
$do$;


-- 4. Grant Access
GRANT SELECT ON employees TO app_user;
GRANT SELECT ON user_roles TO app_user;

ข้อควรระวังและการแก้ปัญหา

ทดสอบในฐานะ postgres (ผู้ดูแลระบบ) และดูข้อมูลทั้งหมด

สาเหตุที่ล้มเหลว: โดยค่าเริ่มต้น RLS จะไม่มีผลกับเจ้าของตารางหรือผู้ใช้ระดับสูง โดยจะข้ามผ่านนโยบายทั้งหมดการแก้ปัญหา: หากนโยบายดูเหมือน "ใช้งานไม่ได้" (อนุญาตทุกอย่าง) ให้ตรวจสอบว่าคุณเข้าสู่ระบบในฐานะ postgres หรือไม่การแก้ไข: คำสั่ง FORCE ROW LEVEL SECURITY จะช่วยให้มั่นใจได้ว่าแม้แต่เจ้าของก็ต้องปฏิบัติตามกฎ ซึ่งเป็นสิ่งสำคัญสำหรับการทดสอบ

6. สร้างนโยบายการเข้าถึง

เราจะกำหนดกฎ 2 ข้อโดยใช้ตัวแปรเซสชัน (app.active_user) ซึ่งเราจะตั้งค่าจากโค้ดแอปพลิเคชันในภายหลัง

เรียกใช้คำสั่ง SQL ด้านล่างจากตัวแก้ไขการค้นหา AlloyDB

-- Policy 1: Self-View
-- Users can see rows where their name matches the session variable
CREATE POLICY "view_own_data" ON employees
FOR SELECT
USING (name = current_setting('app.active_user', true));

-- Policy 2: Manager-View
-- Managers can see ALL rows.
CREATE POLICY "manager_view_all" ON employees
FOR SELECT
USING (
    EXISTS (
        SELECT 1 FROM user_roles
        WHERE username = current_setting('app.active_user', true)
        AND role = 'manager'
    )
);

ข้อควรระวังและการแก้ปัญหา

การใช้ current_user แทน app.active_user

ปัญหา: Current_user เป็นคีย์เวิร์ด SQL ที่สงวนไว้ซึ่งแสดงบทบาทฐานข้อมูล (เช่น app_user) เราต้องการผู้ใช้แอปพลิเคชัน (เช่น Alice)แก้ไข: ใช้เนมสเปซที่กำหนดเองเสมอ เช่น app.variable_name

ลืมพารามิเตอร์ true ใน current_setting

ปัญหา: หากไม่ได้ตั้งค่าตัวแปรไว้ การค้นหาจะหยุดทำงานพร้อมข้อผิดพลาดการแก้ไข: current_setting('...', true) จะแสดงผล NULL แทนที่จะหยุดทำงาน ซึ่งจะส่งผลให้ระบบแสดงผล 0 แถวอย่างปลอดภัย

7. สร้างแอป "Chameleon"

เราจะใช้ Python และ Streamlit เพื่อจำลองตรรกะของแอปพลิเคชัน

296a980887b5c700.png

เปิดเทอร์มินัล Cloud Shell ในโหมดเอดิเตอร์ แล้วไปที่โฟลเดอร์รูทหรือไดเรกทอรีที่คุณต้องการสร้างแอปพลิเคชันนี้ สร้างโฟลเดอร์ใหม่

1. ติดตั้งทรัพยากร Dependency

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของ Cloud Shell จากภายในไดเรกทอรีโปรเจ็กต์ใหม่

pip install streamlit psycopg2-binary

2. สร้าง app.py

สร้างไฟล์ใหม่ชื่อ app.py แล้วคัดลอกเนื้อหาจากไฟล์ repo

import streamlit as st
import psycopg2

# CONFIGURATION (Replace with your IP)
DB_HOST = "10.x.x.x"
DB_NAME = "postgres"
DB_USER = "postgres"
DB_PASS = "alloydb"

def get_db_connection():
    return psycopg2.connect(
        host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS
    )

def query_database(user_name):
    conn = get_db_connection()
    try:
        with conn.cursor() as cur:
            # THE SECURITY HANDSHAKE
            # We tell the database: "For this transaction, I am acting as..."
            cur.execute(f"SET app.active_user = '{user_name}';")
            
            # THE BLIND QUERY
            # We ask for EVERYTHING. The database silently filters it.
            cur.execute("SELECT name, role, salary, performance_review FROM employees;")
            return cur.fetchall()
    finally:
        conn.close()

# UI
st.title("🛡️ The Private Vault")
user = st.sidebar.radio("Act as User:", ["Alice", "Bob", "Charlie", "Eve"])

if st.button("Access Data"):
    results = query_database(user)
    if not results:
        st.error("🚫 Access Denied.")
    else:
        st.success(f"Viewing data as {user}")
        for row in results:
            st.write(row)

3. เรียกใช้แอป

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell จากภายในไดเรกทอรีโปรเจ็กต์ใหม่

streamlit run app.py --server.port 8080 --server.enableCORS false

ข้อควรระวังและการแก้ปัญหา

Connection Pooling

ความเสี่ยง: หากคุณใช้ Connection Pool ตัวแปรเซสชัน SET app.active_user อาจยังคงอยู่ในการเชื่อมต่อและ "รั่วไหล" ไปยังผู้ใช้รายถัดไปที่ใช้การเชื่อมต่อดังกล่าววิธีแก้ไข:ในสภาพแวดล้อมการใช้งานจริง ให้ใช้ RESET app.active_user หรือ DISCARD ALL เสมอเมื่อส่งคืนการเชื่อมต่อไปยังพูล

หน้าจอว่างเปล่าใน Cloud Shell

วิธีแก้ไข: ใช้ปุ่ม "ตัวอย่างเว็บ" บนพอร์ต 8080 อย่าคลิกลิงก์ localhost ในเทอร์มินัล

8. ยืนยัน Zero Trust

ลองใช้แอปเพื่อให้แน่ใจว่าการติดตั้งใช้งาน Zero Trust

เลือก "Alice": เธอควรเห็น 1 แถว (ตัวเธอเอง)

b3b7e374fa66ac87.png

เลือก "Bob": เขาควรเห็น 3 แถว (ทุกคน)

fdc65cb1acdee8a4.png

เหตุใดจึงสำคัญต่อ AI Agent

ลองนึกภาพการเชื่อมต่อโมเดลกับฐานข้อมูลนี้ หากผู้ใช้ถามโมเดลว่า "สรุปการประเมินประสิทธิภาพทั้งหมด" โมเดลจะสร้าง SELECT performance_review FROM employees

  1. หากไม่มี RLS: โมเดลจะดึงรีวิวส่วนตัวของทุกคนและรั่วไหลไปยังอลิซ
  2. เมื่อใช้ RLS โมเดลจะเรียกใช้คําค้นหาเดียวกันทุกประการ แต่ฐานข้อมูลจะแสดงเฉพาะรีวิวของอลิซ

นี่คือ AI แบบ Zero Trust คุณไม่เชื่อถือโมเดลในการกรองข้อมูล แต่บังคับให้ฐานข้อมูลซ่อนข้อมูล

การนำไปใช้ในเวอร์ชันที่ใช้งานจริง

สถาปัตยกรรมที่แสดงที่นี่เป็นระดับการใช้งานจริง แต่การติดตั้งใช้งานเฉพาะจะได้รับการลดความซับซ้อนเพื่อการเรียนรู้ หากต้องการติดตั้งใช้งานอย่างปลอดภัยในสภาพแวดล้อมขององค์กรในโลกแห่งความเป็นจริง คุณควรใช้การเพิ่มประสิทธิภาพต่อไปนี้

  1. การตรวจสอบสิทธิ์จริง: แทนที่เมนูแบบเลื่อนลง "Identity Switcher" ด้วยผู้ให้บริการข้อมูลประจำตัว (IDP) ที่มีประสิทธิภาพ เช่น Google Identity Platform, Okta หรือ Auth0 แอปพลิเคชันควรยืนยันโทเค็นของผู้ใช้และดึงข้อมูลประจำตัวของผู้ใช้อย่างปลอดภัยก่อนตั้งค่าตัวแปรเซสชันของฐานข้อมูล เพื่อให้มั่นใจว่าผู้ใช้จะปลอมแปลงข้อมูลประจำตัวไม่ได้
  2. ความปลอดภัยของ Connection Pooling: เมื่อใช้ Connection Pooling บางครั้งตัวแปรเซสชันอาจยังคงอยู่ในการร้องขอของผู้ใช้ที่แตกต่างกัน หากไม่ได้จัดการอย่างถูกต้อง ตรวจสอบว่าแอปพลิเคชันรีเซ็ตตัวแปรเซสชัน (เช่น RESET app.active_user) หรือล้างสถานะการเชื่อมต่อเมื่อส่งคืนการเชื่อมต่อไปยังพูลเพื่อป้องกันการรั่วไหลของข้อมูลระหว่างผู้ใช้
  3. การจัดการลับ: การฮาร์ดโค้ดข้อมูลเข้าสู่ระบบของฐานข้อมูลเป็นความเสี่ยงด้านความปลอดภัย ใช้บริการจัดการข้อมูลลับโดยเฉพาะ เช่น Google Secret Manager เพื่อจัดเก็บและดึงรหัสผ่านฐานข้อมูลและสตริงการเชื่อมต่ออย่างปลอดภัยในขณะรันไทม์

9. ล้างข้อมูล

เมื่อห้องทดลองนี้เสร็จสิ้นแล้ว อย่าลืมลบคลัสเตอร์และอินสแตนซ์ AlloyDB

ซึ่งควรล้างข้อมูลคลัสเตอร์พร้อมกับอินสแตนซ์

10. ขอแสดงความยินดี

ยินดีด้วย คุณได้ผลักดันการรักษาความปลอดภัยลงไปที่ชั้นข้อมูลเรียบร้อยแล้ว แม้ว่าโค้ด Python จะมีข้อบกพร่องที่พยายาม print(all_salaries) แต่ฐานข้อมูลก็จะไม่แสดงผลใดๆ ให้กับ Alice

ขั้นตอนถัดไป