1. Tổng quan
Trong lúc vội vàng xây dựng các ứng dụng AI tạo sinh, chúng ta thường quên đi thành phần quan trọng nhất: An toàn.
Hãy tưởng tượng bạn đang xây dựng một Chatbot nhân sự. Bạn muốn công cụ này trả lời những câu hỏi như "Mức lương của tôi là bao nhiêu?" hoặc "Hiệu suất của nhóm tôi như thế nào?"
- Nếu Alice (một nhân viên thông thường) yêu cầu, cô ấy chỉ được phép xem dữ liệu của mình.
- Nếu Bob (một nhà quản lý) yêu cầu, thì anh ấy sẽ thấy dữ liệu của nhóm mình.
Vấn đề
Hầu hết các cấu trúc RAG (Tạo tăng cường truy xuất) đều cố gắng xử lý vấn đề này trong Lớp ứng dụng. Chúng lọc các khối sau khi truy xuất hoặc dựa vào LLM để "hành xử". Đây là hàng dễ vỡ. Nếu logic ứng dụng không thành công, dữ liệu sẽ bị rò rỉ.
Giải pháp
Đẩy tính năng bảo mật xuống Lớp cơ sở dữ liệu. Bằng cách sử dụng Bảo mật cấp hàng (RLS) của PostgreSQL trong AlloyDB, chúng tôi đảm bảo rằng cơ sở dữ liệu từ chối một cách vật lý trả về dữ liệu mà người dùng không được phép xem – bất kể AI yêu cầu gì.
Trong hướng dẫn này, chúng ta sẽ tạo "Kho lưu trữ riêng tư": Một Trợ lý nhân sự bảo mật, có thể thay đổi câu trả lời một cách linh hoạt dựa trên người đăng nhập.

Cấu trúc
Chúng ta không xây dựng logic phức tạp về quyền trong Python. Chúng tôi đang sử dụng chính công cụ cơ sở dữ liệu.
- Giao diện: Một ứng dụng Streamlit đơn giản mô phỏng quy trình đăng nhập.
- The Brain: AI AlloyDB (tương thích với PostgreSQL).
- Cơ chế: Chúng tôi đặt một biến phiên (
app.active_user) khi bắt đầu mỗi giao dịch. Các chính sách cơ sở dữ liệu sẽ tự động kiểm tra bảnguser_roles(đóng vai trò là Nhà cung cấp danh tính của chúng tôi) để lọc các hàng.
Sản phẩm bạn sẽ tạo ra
Một ứng dụng Trợ lý nhân sự an toàn. Thay vì dựa vào logic ứng dụng để lọc dữ liệu nhạy cảm, bạn sẽ triển khai tính năng Bảo mật cấp hàng (RLS) ngay trong công cụ cơ sở dữ liệu AlloyDB. Điều này đảm bảo rằng ngay cả khi mô hình AI của bạn "ảo tưởng" hoặc cố gắng truy cập vào dữ liệu trái phép, cơ sở dữ liệu sẽ từ chối trả về dữ liệu đó.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu:
- Cách thiết kế một lược đồ cho RLS (tách biệt Dữ liệu và Danh tính).
- Cách viết Chính sách PostgreSQL (
CREATE POLICY). - Cách bỏ qua trường hợp ngoại lệ "Chủ sở hữu bảng" bằng cách sử dụng
FORCE ROW LEVEL SECURITY. - Cách tạo một ứng dụng Python thực hiện "Chuyển đổi bối cảnh" cho người dùng.
Yêu cầu
2. Trước khi bắt đầu
Tạo dự án
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.
- Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Google Cloud.

- Sau khi kết nối với Cloud Shell, bạn có thể kiểm tra để đảm bảo rằng bạn đã được xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:
gcloud auth list
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn.
gcloud config list project
- Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <YOUR_PROJECT_ID>
- Bật các API bắt buộc: Truy cập vào đường liên kết rồi bật các API.
Ngoài ra, bạn có thể dùng lệnh gcloud cho việc này. Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.
gcloud services enable \
alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Các lỗi thường gặp và cách khắc phục
Hội chứng "Dự án ma" | Bạn đã chạy |
Rào chắn thanh toán | Bạn đã bật dự án nhưng quên tài khoản thanh toán. AlloyDB là một công cụ hiệu suất cao; công cụ này sẽ không khởi động nếu "bình xăng" (thanh toán) trống. |
Độ trễ truyền API | Bạn đã nhấp vào "Bật API", nhưng dòng lệnh vẫn hiển thị |
Quota Quags | Nếu đang sử dụng tài khoản dùng thử hoàn toàn mới, bạn có thể đạt đến hạn mức theo khu vực cho các phiên bản AlloyDB. Nếu |
3. Thiết lập cơ sở dữ liệu
Trong phòng thí nghiệm này, chúng ta sẽ sử dụng AlloyDB làm cơ sở dữ liệu cho dữ liệu kiểm thử. Nền tảng này sử dụng cụm để lưu giữ tất cả tài nguyên, chẳng hạn như cơ sở dữ liệu và nhật ký. Mỗi cụm có một phiên bản chính cung cấp một điểm truy cập vào dữ liệu. Các bảng sẽ chứa dữ liệu thực tế.
Hãy tạo một cụm, phiên bản và bảng AlloyDB nơi tập dữ liệu kiểm thử sẽ được tải.
- Nhấp vào nút hoặc Sao chép đường liên kết bên dưới vào trình duyệt mà bạn đã đăng nhập người dùng Google Cloud Console.
- Sau khi hoàn tất bước này, kho lưu trữ sẽ được sao chép vào trình chỉnh sửa Cloud Shell cục bộ và bạn có thể chạy lệnh bên dưới từ thư mục dự án (điều quan trọng là phải đảm bảo bạn đang ở trong thư mục dự án):
sh run.sh
- Bây giờ, hãy sử dụng giao diện người dùng (nhấp vào đường liên kết trong thiết bị đầu cuối hoặc nhấp vào đường liên kết "xem trước trên web" trong thiết bị đầu cuối.
- Nhập thông tin chi tiết về mã dự án, tên cụm và tên phiên bản để bắt đầu.
- Hãy đi lấy một tách cà phê trong khi nhật ký cuộn và bạn có thể đọc về cách nhật ký thực hiện việc này ở chế độ nền tại đây. Quá trình này có thể mất khoảng 10 đến 15 phút.
Các lỗi thường gặp và cách khắc phục sự cố
Vấn đề về "Tính kiên nhẫn" | Cụm cơ sở dữ liệu là cơ sở hạ tầng lớn. Nếu làm mới trang hoặc kết thúc phiên Cloud Shell vì phiên này "có vẻ bị treo", bạn có thể gặp phải một phiên bản "ảo" được cung cấp một phần và không thể xoá nếu không có sự can thiệp thủ công. |
Khu vực không khớp | Nếu đã bật API trong |
Nhóm zombie | Nếu trước đây bạn đã dùng cùng một tên cho một cụm và chưa xoá cụm đó, thì tập lệnh có thể cho biết tên cụm đã tồn tại. Tên cụm phải là duy nhất trong một dự án. |
Thời gian chờ của Cloud Shell | Nếu bạn giải lao uống cà phê trong 30 phút, Cloud Shell có thể chuyển sang chế độ ngủ và ngắt kết nối quy trình |
4. Cung cấp giản đồ
Trong bước này, chúng ta sẽ đề cập đến những nội dung sau:

Sau đây là các bước chi tiết:
Sau khi bạn chạy cụm và phiên bản AlloyDB, hãy chuyển đến trình chỉnh sửa SQL của AlloyDB Studio để bật các tiện ích AI và cung cấp giản đồ.

Bạn có thể phải đợi phiên bản của mình được tạo xong. Sau khi tạo xong, hãy đăng nhập vào AlloyDB bằng thông tin đăng nhập mà bạn đã tạo khi tạo cụm. Sử dụng dữ liệu sau để xác thực với PostgreSQL:
- Tên người dùng : "
postgres" - Cơ sở dữ liệu : "
postgres" - Mật khẩu : "
alloydb" (hoặc mật khẩu bạn đặt tại thời điểm tạo)
Sau khi bạn xác thực thành công vào AlloyDB Studio, các lệnh SQL sẽ được nhập vào Trình chỉnh sửa. Bạn có thể thêm nhiều cửa sổ Trình chỉnh sửa bằng cách nhấp vào dấu cộng ở bên phải cửa sổ cuối cùng.

Bạn sẽ nhập các lệnh cho AlloyDB trong cửa sổ trình chỉnh sửa, sử dụng các lựa chọn Chạy, Định dạng và Xoá khi cần.
Tạo bảng
Chúng ta cần 2 bảng: một bảng cho dữ liệu nhạy cảm (nhân viên) và một bảng cho các quy tắc nhận dạng (user_roles). Việc tách riêng hai loại này là rất quan trọng để tránh lỗi "Đệ quy vô hạn" trong các chính sách.
Bạn có thể tạo một bảng bằng câu lệnh DDL bên dưới trong 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.');
Các lỗi thường gặp và cách khắc phục sự cố
Đã phát hiện thấy đệ quy vô hạn trong khi xác định vai trò bên trong bảng nhân viên | Lý do thất bại: Nếu chính sách của bạn có nội dung "Kiểm tra bảng nhân viên để xem tôi có phải là người quản lý hay không", thì cơ sở dữ liệu phải truy vấn bảng để kiểm tra chính sách, điều này sẽ kích hoạt lại chính sách.Kết quả: Phát hiện thấy đệ quy vô hạn.Cách khắc phục: Luôn giữ một bảng tra cứu riêng (user_roles) hoặc sử dụng Người dùng cơ sở dữ liệu thực cho các vai trò. |
Xác minh dữ liệu:
SELECT count(*) FROM employees;
-- Output: 3
5. Bật và thực thi tính năng bảo mật
Bây giờ, chúng ta sẽ bật các lớp bảo vệ. Chúng ta cũng sẽ tạo một "Người dùng ứng dụng" chung mà mã Python của chúng ta sẽ dùng để kết nối.
Chạy câu lệnh SQL bên dưới trong Trình chỉnh sửa truy vấn 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;
Các lỗi thường gặp và cách khắc phục sự cố
Kiểm thử dưới dạng postgres (Người dùng có đặc quyền cao) và xem tất cả dữ liệu. | Lý do thất bại: Theo mặc định, RLS không áp dụng cho chủ sở hữu bảng hoặc siêu người dùng. Họ có thể bỏ qua mọi chính sách.Khắc phục sự cố: Nếu các chính sách của bạn có vẻ "bị hỏng" (cho phép mọi thứ), hãy kiểm tra xem bạn có đăng nhập với tư cách là |
6. Tạo chính sách truy cập
Chúng ta sẽ xác định 2 quy tắc bằng cách sử dụng Biến phiên (app.active_user) mà chúng ta sẽ đặt từ mã ứng dụng sau.
Chạy câu lệnh SQL bên dưới trong Trình chỉnh sửa truy vấn 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'
)
);
Các lỗi thường gặp và cách khắc phục sự cố
Sử dụng current_user thay vì app.active_user. | Vấn đề: Current_user là một từ khoá SQL dành riêng, trả về vai trò cơ sở dữ liệu (ví dụ: app_user). Chúng ta cần người dùng ứng dụng (ví dụ: Alice).Khắc phục: Luôn sử dụng không gian tên tuỳ chỉnh như app.variable_name. |
Quên tham số | Vấn đề: Nếu biến không được đặt, truy vấn sẽ gặp sự cố và báo lỗi.Cách khắc phục: current_setting('...', true) trả về giá trị NULL thay vì gặp sự cố. Điều này giúp trả về 0 hàng một cách an toàn. |
7. Tạo ứng dụng "Chameleon"
Chúng ta sẽ dùng Python và Streamlit để mô phỏng logic ứng dụng.

Mở Cloud Shell Terminal ở chế độ Editor (Trình chỉnh sửa), chuyển đến thư mục gốc hoặc thư mục mà bạn muốn tạo ứng dụng này. Tạo thư mục mới.
1. Cài đặt phần phụ thuộc:
Chạy lệnh sau trong Cloud Shell Terminal từ thư mục dự án mới của bạn:
pip install streamlit psycopg2-binary
2. Tạo app.py:
Tạo một tệp mới có tên app.py rồi sao chép nội dung từ tệp 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. Chạy ứng dụng:
Chạy lệnh sau trong Cloud Shell Terminal từ thư mục dự án mới của bạn:
streamlit run app.py --server.port 8080 --server.enableCORS false
Các lỗi thường gặp và cách khắc phục sự cố
Gộp kết nối. | Rủi ro: Nếu bạn sử dụng một nhóm kết nối, biến phiên SET app.active_user có thể vẫn tồn tại trên kết nối và "rò rỉ" cho người dùng tiếp theo lấy kết nối đó.Cách khắc phục: Trong quá trình sản xuất, hãy luôn sử dụng RESET app.active_user hoặc DISCARD ALL khi trả lại một kết nối cho nhóm. |
Màn hình trống trong Cloud Shell. | Khắc phục: Sử dụng nút "Web Preview" (Xem trước trên web) trên cổng 8080. Đừng nhấp vào đường liên kết localhost trong thiết bị đầu cuối. |
8. Xác minh theo nguyên tắc không tin tưởng bất cứ điều gì
Hãy thử ứng dụng để đảm bảo việc triển khai theo nguyên tắc Không tin tưởng bất cứ điều gì:
Chọn "Alice": Cô ấy sẽ thấy 1 hàng (Chính cô ấy).

Chọn "Bob": Anh ấy sẽ thấy 3 hàng (Mọi người).

Tại sao điều này lại quan trọng đối với các Đặc vụ AI
Hãy tưởng tượng việc kết nối mô hình của bạn với cơ sở dữ liệu này. Nếu người dùng yêu cầu mô hình của bạn: "Tóm tắt tất cả các bản đánh giá hiệu suất", thì mô hình sẽ tạo câu lệnh SELECT performance_review FROM employees.
- Không có RLS: Mô hình của bạn truy xuất các bài đánh giá riêng tư của mọi người và để lộ cho Alice.
- Với RLS: Mô hình của bạn chạy chính xác cùng một truy vấn, nhưng cơ sở dữ liệu chỉ trả về bài đánh giá của Alice.
Đây là AI không tin tưởng bất cứ điều gì. Bạn không tin tưởng mô hình lọc dữ liệu; bạn buộc cơ sở dữ liệu ẩn dữ liệu đó.
Đưa bản phát hành công khai này vào hoạt động
Cấu trúc được minh hoạ ở đây là cấp sản xuất, nhưng việc triển khai cụ thể được đơn giản hoá để học tập. Để triển khai một cách an toàn trong môi trường doanh nghiệp thực tế, bạn nên triển khai các điểm cải tiến sau:
- Xác thực thực: Thay thế trình đơn thả xuống "Trình chuyển đổi danh tính" bằng một Nhà cung cấp danh tính (IDP) mạnh mẽ như Nền tảng danh tính của Google, Okta hoặc Auth0. Ứng dụng của bạn phải xác minh mã thông báo của người dùng và trích xuất danh tính của họ một cách an toàn trước khi đặt biến phiên cơ sở dữ liệu, đảm bảo người dùng không thể giả mạo danh tính của họ.
- Độ an toàn của nhóm kết nối: Khi sử dụng nhóm kết nối, các biến phiên đôi khi có thể duy trì trên nhiều yêu cầu của người dùng nếu không được xử lý đúng cách. Đảm bảo ứng dụng của bạn đặt lại biến phiên (ví dụ: RESET app.active_user) hoặc xoá trạng thái kết nối khi trả về một kết nối cho nhóm để ngăn chặn rò rỉ dữ liệu giữa người dùng.
- Quản lý bí mật: Mã hoá cứng thông tin đăng nhập cơ sở dữ liệu là một rủi ro bảo mật. Sử dụng một dịch vụ quản lý khoá bí mật chuyên dụng như Google Secret Manager để lưu trữ và truy xuất mật khẩu cơ sở dữ liệu cũng như chuỗi kết nối một cách an toàn trong thời gian chạy.
9. Dọn dẹp
Sau khi hoàn tất bài thực hành này, đừng quên xoá cụm và phiên bản alloyDB.
Thao tác này sẽ dọn dẹp cụm cùng với(các) phiên bản của cụm.
10. Xin chúc mừng
Xin chúc mừng! Bạn đã chuyển thành công tính năng bảo mật xuống lớp dữ liệu. Ngay cả khi mã Python của bạn có một lỗi cố gắng print(all_salaries), cơ sở dữ liệu sẽ không trả về thông tin gì cho Alice.
Bước tiếp theo
- Hãy thử với tập dữ liệu của riêng bạn.
- Khám phá Tài liệu về AI của AlloyDB.
- Hãy truy cập trang web Code Vipassana để biết thêm các hội thảo.