Khi người dùng bắt đầu truy vấn: SELECT * FROM NhanVien; Chức năng thực thiện chính sách bảo mật trả về vị từ Phong = ‘Lập trình’ và CSDL viết lại một cách trong suốt truy vấn.. Từ đó đế
Trang 1HỌC VIỆN KĨ THUẬT MẬT MÃ KHOA : AN TOÀN THÔNG TIN
AN TOÀN CƠ SỞ DỮ LIỆU
Đề tài:
TÌM HIỂU VỀ VIRTUAL PRIVATE DATABASE
TRONG ORACLE
Giáo viên bộ môn: Th.S Phạm Duy Trung Sinh viên thực hiện: Nguyễn Hoàng Lân
Phan Hoàng Trung
Lê Thanh Lâm
Trang 2MỤC LỤC
CHƯƠNG I: GIỚI THIỆU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO 2
1.1 Giới thiệu về hệ quản trị CSDL Oracle: 2
1.2 Giới thiệu chung về VPD: 3
1.2.1 Các phiên bản VPD: 4
1.2.2 Lợi ích của VPD: 2
CHƯƠNG II: NGỮ CẢNH ỨNG DỤNG 3
2.1 Giới thiệu về ngữ cảnh ứng dụng: 3
2.2 Ngữ cảnh mặc định USERNV: 3
2.3 Ngữ cảnh cục bộ (Local Context): 5
2.3.1 Tạo một ngữ cảnh ứng dụng: 6
2.3.2 Thiết lập các thuộc tính và giá trị cho ngữ cảnh ứng dụng: 6
2.3.3 Áp dụng ngữ cảnh ứng dụng và bảo mật: 7
2.4 Ngữ cảnh toàn cục (Global Context): 7
CHƯƠNG III: BẢO MẬT MỨC HÀNG VỚI VPD 7
3.1 Giới thiệu về RLS: 7
3.2 Tạo Function PL/SQL trả về chuỗi string: 8
3.3 Tạo chính sách bảo mật áp dụng vào bảng, khung nhìn: 9
3.4 Riêng tư mức cột trong VPD: 10
3.5 Xóa Policy RLS: 11
3.6 Quyền Exempt Access Policy: 11
TÀI LIỆU THAM KHẢO 12
CHƯƠNG I: GIỚI THIỆU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO
1.1 Giới thiệu về hệ quản trị CSDL Oracle:
Oracle Database hay còn gọi là Oracle RDBMS hoặc đơn giản là Oracle, là một hệ quản trị cơ sở dữ liệu quan hệ, được phát triển và phân phối bởi tập đoàn Oracle Oracle version 1 ra đời từ năm 1978 Sau vài chục năm, hiện tại Oracle Database đã lên đến version 19 Trước kia các version Oracle Database chỉ được đánh số Bắt đầu
từ version 8 trở đi có thêm ký tự phía sau version Với version 8 và 9 là i (internet),
Trang 3version 10 và 11 là g (grid)… Version 19 mới nhất là c (cloud) Các ký tự thể hiện đặc tính nền tảng/kiến trúc của version đó
Không giống như các nhà cung cấp CSDL khác, Oracle xem trọng việc bảo mật và các đặc tính của CSDL để từ đó xây dựng các quan hệ an ninh vào trong hệ thống quản lý CSDL
1.2 Giới thiệu chung về VPD:
VPD là tên viết tắt của Virtual Private Database hay còn được gọi là CSDL riêng ảo VPD cho phép bạn thực hiện bảo mật tới một mức thấp nhất trực tiếp trên các bảng hoặc các khung nhìn Bởi vì chính sách bảo mật gán trực tiếp vào các bảng, khung nhìn và được tự động áp dụng bất cứ khi nào người dùng truy xuất dữ liệu, không có cách nào để
bỏ qua sự kiểm tra này
Khi một người dùng trực tiếp hoặc gián tiếp truy xuất một bảng, khung nhìn đã được bảo vệ bằng một chính sách VPD, máy chủ tự điều chỉnh một cách động câu lệnh SQL của người sử dụng Sự điều chỉnh này dựa trên điều kiện WHERE (vị từ) được trả lại bởi một chức năng thực hiện chính sách bảo mật Câu lệnh được điều chỉnh một cách động, trong suốt với người dùng, sử dụng bất kỳ điều kiện có thể được biểu diễn bên trong, hoặc được trả lại bằng một chức năng Những chính sách VPD có thể được áp dụng cho những câu lệnh SELECT, INSERT, UPDATE, INDEX, và DELETE
Những chức năng mà trả lại những vị từ cũng có thể bao gồm lời gọi đến các chức năng khác Bên trong gói PL/SQL của bạn, bạn có thể nhúng vào C hoặc Java mà có thể truy xuất thông tin hệ điều hành, hoặc trả về những mệnh đề WHERE tùy biến Một chức năng chính sách có thể trả về những vị từ khác nhau cho từng người dùng, từng nhóm hoặc cho từng ứng dụng Sử dụng những chức năng chính sách trên từ đồng nghĩa
có thể thay thế cho việc duy trì một khung nhìn riêng biệt cho mỗi người dùng hoặc lớp người dùng, sự lưu trữ trên không đáng kể trong bộ nhớ và tài nguyên xử lý
Lấy ví dụ một nhân viên là người mà chỉ được phép thấy các bảng ghi NhanVien trong phòng lập trình Khi người dùng bắt đầu truy vấn:
SELECT * FROM NhanVien;
Chức năng thực thiện chính sách bảo mật trả về vị từ Phong = ‘Lập trình’ và CSDL viết lại một cách trong suốt truy vấn Câu truy vấn thực sự được thực hiện trở thành:
SELECT * FROM NhanVien WHERE Phong = ‘Lập trình’;
Trang 41.2.1 Các phiên bản VPD:
VPD được bắt đầu sử dụng trong Oracle 8i (phiên bản 8.1.5), nó được xem như là một giải pháp mới để thực thi kiểm soát truy cập dữ liệu tại máy chủ Từ đó đến nay VPD
có các phiên bản đi kèm với sự phát triển của Oracle, bao gồm:
Oracle 8i
- Điều khiển truy cập mức mịn (Fine-grained Access Control)
- Ngữ cảnh ứng dụng (Application Context)
- Bảo mật mức hàng (Row Level Security)
- Hỗ trợ cho các bảng và khung nhìn (VPD support for table and view)
Oracle 9i
- Chính sách quản lý Oracle (Oracle Policy Manager)
- Điều khiển truy cập mức mịn và sự phân chia (Partitioned fine-grained access
control)
- Ngữ cảnh ứng dụng toàn cục (Global application context)
- Hỗ trợ cho synonyms (VPD support for synonyms)
Oracle 10g
- Tùy biến Có thể tùy chỉnh VPD để luôn luôn thực hiện các predicate cùng với một chính sách tĩnh hoặc ta có thể có các predicate VPD thay đổi với các chính sách không tĩnh
- Tính riêng tư mức cột
- Chính sách chia sẻ cho nhiều đối tượng để giảm thiểu chi phí
Oracle 11g cung cấp cho người quản lý doanh nghiệp sự tích hợp các chính sách bảo mật mức hàng
Oracle 12c cung cấp nhiều hỗ trợ liên quan đến điện toán đám mây
Trong khoảng thời gian gần đây, Oracle cung cấp them cho người dùng nhiều phiên bản như 18c, 19c them nhiều tiện ích mới
Trang 51.2.2 Lợi ích của VPD:
VPD cho phép người quản trị gán các chính sách bảo mật lên các bảng, khung nhìn
để những người dùng với quyền hạn khác nhau sẽ được truy xuất các bản ghi khác nhau trong bảng, khung nhìn đó Việc giới hạn này sẽ trong suốt đối với mọi người dùng Đồng thời chính sách bảo mật đó sẽ được áp dụng cho bất kỳ user nào truy xuất đến bảng, khung nhìn đó mà không cần người quản trị phải gán chính sách cho từng user VPD mang lại rất nhiều lợi ích trong việc bảo mật CSDL và dưới đây là một số lợi ích mà ta có thể nhận thấy dễ dàng đó là:
Chi phí thấp: Có thể tiết kiệm được một khoản chi phí rất lớn bằng cách xây dựng một hệ thống bảo mật cho máy chủ dữ liệu thay vì phải thực thi các chính bảo mật giống nhau cho mỗi ứng dụng khi có truy cập dữ liệu
Trong suốt với người dùng: Người dùng có thể truy cập dữ liệu mà không hề biết tới các chính sách bảo mật được áp dụng Bởi các chính sách bảo mật được đính kèm với CSDL và được thực thi một cách tự động, trong suốt trên máy chủ
Cơ hội kinh doanh: Trong quá khứ, các công ty không thể cho khách hàng, đối tác truy cập trực tiếp vào CSDL của họ bởi họ chưa có cách nào để làm an toàn dữ liệu của
họ Ngày nay, bằng cách kiểm soát truy cập mức mịn, dữ liệu sẽ được bảo mật trên máy chủ, và việc truy cập dữ liệu sẽ được giới hạn ở mức độ ủy quyền khác nhau
CHƯƠNG II: NGỮ CẢNH ỨNG DỤNG
2.1 Giới thiệu về ngữ cảnh ứng dụng:
Ngữ cảnh ứng dụng (Application context) là một tập các cặp thuộc tính - giá trị được lưu trong bộ nhớ Nó được xác định, thiết lập và lấy ra bởi người dùng và các ứng dụng Các thuộc tính liên quan được nhóm lại thành một nhóm và được truy cập theo tên của
nó Bằng cách lưu trữ các giá trị và các thuộc tính trong bộ nhớ, sau đó chia sẻ chúng dựa trên ngữ cảnh sẽ giúp việc truy xuất các giá trị nhanh chóng hơn
Thông thường các ngữ cảnh ứng dụng chứa một số thuộc tính chẳng hạn như tên một người dùng, một tổ chức, một quy tắc, hay một tiêu đề Các chính sách bảo mật có thể được tham chiếu tới các thuộc tính này khi người dùng đang kiểm soát truy nhập Việc
Trang 6lưu trữ các giá trị trong bộ nhớ, với các câu truy vấn giống nhau, hệ thống sẽ lấy cùng một giá trị trong ngữ cảnh ứng dụng, như vậy sẽ tiết kiệm được thời gian Vì vậy mà trong tài liệu bảo mật thường chứa các ngữ cảnh ứng dụng Tuy nhiên không phải tất cả ngữ cảnh ứng dụng được sử dụng trong việc thực thi bảo mật hay ngược lại
2.2 Ngữ cảnh mặc định USERNV:
Oracle cung cấp một ngữ cảnh mặc định cho mỗi phiên sử dụng CSDL Nó có không
gian tên là USERNV Hầu hết các thuộc tính trong USRENV được định sẵn bởi CSDL.
Nếu ta sử dụng các ngữ cảnh mặc định này thì vấn đề trở nên đơn giản và sáng sủa
hơn Bởi USERENV cung cấp rất nhiều thuộc tính hữu ích chẳng hạn như thông tin về
môi trường người dùng, địa chỉ IP của máy khách, tên người dùng ủy quyền, giao thức được sử dụng để kết nối
Tất cả thuộc tính của ngữ cảnh ứng dụng đều được tham chiếu thông qua function SYS_CONTEXT Function SYS_CONTEXT có không gian tên giống như tham số đầu
và tên thuộc tính giống như tham số thứ hai và trả về giá trị của một thuộc tính liên quan
Ví dụ cú pháp sau đây để trả về thông tin của phiên hiện tại
SYS_CONTEXT('userenv', 'tên thuộc tính')
Tên thuộc tính Giá trị trả về
ACTION ID vị trí trong module (application name) và được thiết lập
thông qua DBMS_APPLICATION_INFO package hoặc OCI
AUDITED_CURSORI
D Trả về ID cursor của phiên mà Triggered bởi kiểm toán Tham số này
không hợp lệ trong một môi trường kiểm toán mức mịn
AUTHENTICATED_I
DENTITY Trả về ID người dùng đã được sử dụng trong xác thực.
AUTHENTICATION_
DATA Dữ liệu đang được sử dụng để xác thực người dùng đăng nhập
AUTHENTICATION_
METHOD Trả về phương thức xác thực.
BG_JOB_ID ID công việc của phiên hiện tại nếu nó được thành lập bởi
một tiến trình nền
CLIENT_IDENTIFIE
R Trả về ID được thiết lập bởi ứng dụng thông qua thủ tụcDBMS_SESSION.SET_IDENTIFIER, thuộc tính
OCI_ATTR_CLIENT_IDENTIFIER của OCI, hoặc lớp Java
Oracle.jdbc.OracleConnection.setClientIdentifier
CLIENT_INFO Trả về kích thước lên tới 64 byte thông tin phiên người dùng
được lưu trữ bởi DBMS_APPLICATION_INFO package
CURRENT_BIND Các biến ràng buộc đối với kiểm toán mức mịn
Trang 7CURRENT_SCHEMA Tên của schema hiện tại.
CURRENT_SCHEMA
ID ID schema hiện tại.
CURRENT_SQL
CURRENT_SQLn
CURRENT_SQL trả về 4K byte dầu tiên của SQL Triggered kiểm toán mức mịn hiện tại
CURRENT_SQLn trả về 4K byte tiếp theo
CURRENT_SQL_LEN
GTH Độ dài của SQL Triggered kiểm toán mức mịn hiện tại. DB_DOMAIN Tên miền của CSDL
DB_NAME Tên của CSDL
DB_UNIQUE_NAME Tên duy nhất của CSDL
ENTRYID Số Entry kiểm toán hiện tại
ENTERPRISE_IDENT
ITY Trả về ID người dùng doanh nghiệp.
FG_JOB_ID ID công việc của phiên hiện tại nếu nó được thành lập bởi
một tiến trình nổi bật
GLOBAL_CONTEXT
_MEMORY Trả về số đang được sử dụng System Global Area.
GLOBAL_UID Trả về ID người dùng toàn cục từ Oracle Internet Directory
for Enterprise User Security
HOST Tên máy chủ mà Client đã kết nối tới
IDENTIFICATION_T
YPE Trả về cách mà schema đã được tạo trong CSDL.
INSTANCE Số ID của Instance hiện tại
INSTANCE_NAME Tên của Instance hiện tại
IP_ADDRESS Địa chỉ IP của máy chủ mà Client đã kết nối tới
ISDBA Trả về TRUE nếu người dùng xác thực có đặc quyền DBA
LANG Chữ viết tắt ISO cho tên ngôn ngữ
LANGUAGE Ngôn ngữ và lãnh thổ đang được sử dụng bởi phiên người
dùng
MODULE Tên ứng dụng được thiết lập thông qua OCI hoặc
DBMS_APPLICATION_INFO
NETWORK_PROTO
COL Giao thức mạng được sử dụng để liên lạc.
NLS_CALENDAR Lịch của phiên hiện tại
NLS_CURRENCY Đơn vị tiền tệ của phiên hiện tại
NLS_DATE_FORMA
T Định dạng ngày của phiên.
NLS_DATE_LANGUA
GE Ngôn ngữ được sử dụng để diễn tả ngày.
NLS_SORT BINARY hoặc linguistic
NLS_TERRITORY Lãnh thổ của phiên hiện tại
OS_USER Tên tài khoản OS đã bắt đầu phiên
POLICY_INVOKER Invoker của RLS policy functions
PROXY_ENTERPRI
SE_IDENT ITY
Trả về Oracle Internet Directory DN khi tài khoản proxy là tài khoản
doanh nghiệp
PROXY_GLOBAL_U
ID
ID tài khoản toàn cục từ Oracle Internet Directory for Enterprise User
Security NULL cho tất cả tài khoản proxy khác
PROXY_USER Tên của người dùng đã mở phiên hiện tại trên danh nghĩa
của
SESSION_USER
PROXY_USERID ID của người dùng đã mở phiên hiện tại trên danh nghĩa của
SESSION_USER
Trang 8SERVER_HOST Tên máy chủ đang chạy.
SERVICE_NAME Tên dịch vụ mà phiên đã kết nối.
SESSION_USER Đối với tài khoản doanh nghiệp thì trả về schema Đối với
người dùng khác, trả về tên tài khoản CSDL mà người dùng hiện tại đã xác thực
SESSION_USERID ID của người dùng CSDL mà người dùng hiện tại đã được
xác thức
SESSIONID ID phiên kiểm toán.
SID Số phiên (khác với sessionID).
STATEMENTID Định danh báo cáo kiểm toán STATEMENTID trả về số
lượng các câu SQL được kiểm toán trong phiên cụ thể
TERMINAL Định danh OS của client trong phiên hiện tại.
2.3 Ngữ cảnh cục bộ (Local Context):
Khác với USERENV định danh người dùng và thuộc tính khách hàng đều được thiết
lập bởi người dùng thì ngữ cảnh cục bộ được thiết lập riêng cho từng phiên làm việc Ngữ cảnh cục bộ hỗ trợ khả năng xác định không gian tên riêng dựa trên các thuộc tính bổ sung
Trong khi các giá trị trong USERENV được tự động thiết lập bởi CSDL thì các giá trị
trong ngữ cảnh cục bộ được thiết lập thông qua các PL/SQL Đó là quy định khi tạo ngữ cảnh ứng dụng
2.3.1 Tạo một ngữ cảnh ứng dụng:
Khi tạo một ngữ cảnh ứng dụng, ta cần phải cho nó một cái tên và liên kết nó với một Package PL/SQL chứa các hàm định nghĩa giá trị của các thuộc tính
Dưới đây là câu lệnh tạo một ngữ cảnh ctx_KetNoi liên kết với PL/SQL ctx_KetNoi _pkg
CREATE CONTEXT ctx_KetNoi USING ctx_KetNoi _pkg;
2.3.2 Thiết lập các thuộc tính và giá trị cho ngữ cảnh ứng dụng:
Các giá trị trong ngữ cảnh ứng dụng được thiết lập bằng cách gọi thủ tục DBMS_SESION.SET_CONTEXT từ trình quản lý không gian tên Trong ngữ cảnh ứng dụng ta tạo một cặp thuộc tính - giá trị liên quan tới ứng dụng của chúng ta
Trang 9Để minh họa điều này, chúng ta tạo một bảng chứa các thông tin nhân viên Giả sử muốn hạn chế hồ sơ của một số người dùng trong tổ chức, ta sử dụng ngữ cảnh ứng dụng
để nắm bắt và thiết lập thông tin người dùng
Sau khi tạo bảng thì sẽ thiết lập các giá trị trong ngữ cảnh, bằng cách gọi một
function có tên là ctx_KetNoi _pkg
Ví dụ dưới đây là cách thiết lập một PACKAGE PL/SQL:
CREATE OR REPLACE PACKAGE ctx_KetNoi_pkg AS
PROCEDURE GetInfo_KetNoi; END;
CREATE OR REPLACE PACKAGE BODY ctx_KetNoi _pkg IS
PROCEDURE GetInfo_KetNoi; AS
TenTK varchar(20); TenPhong
varchar(50);
BEGIN
TenTK := SYS_CONTEXT('USERENV','SESSION_USER');
SELECT Phong into TenPhong FROM NhanVien WHERE TenTK = TenTK; DBMS_SESSION.set_context('ctx_KetNoi','tt_TaiKhoan', TenTK);
DBMS_SESSION.set_context('ctx_KetNoi','tt_Phong', TenPhong);
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END GetInfo;
END;
Với ngữ cảnh ứng dụng ctx_KetNoi trên thì ở mỗi phiên kết nối chúng ta có thể lấy
được tên người dùng và tên phòng làm việc của trong 2 thuộc tính tương ứng là
tt_TaiKhoan và tt_TenPhong.
Tuy nhiên muốn thiết lập ngữ cảnh ứng dụng tự động thì phải thêm một TRIGGER ràng buộc sau khi đăng nhập vào CSDL:
CREATE OR REPLACE TRIGGER trg_KetNoi AFTER LOGON ON DATABASE BEGIN QuanTriVPD.ctx_KetNoi_pkg.GetInfo_KetNoi; EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
Trang 102.3.3 Áp dụng ngữ cảnh ứng dụng và bảo mật:
Chúng ta có thể áp dụng ngữ cảnh ứng dụng vào việc thực thi các chính sách bảo mật
CSDL Đây là một ví dụ về việc giới hạn truy vấn của người dùng:
CREATE OR REPLACE VIEW view_NhanVien AS
SELECT * FROM NhanVien
WHERE Phong = SYS_CONTEXT('ctx_KetNoi','tt_Phong');
Sau câu lệnh trên chúng ta sẽ có được một khung nhìn để mỗi người dùng chỉ có thể xem được dữ liệu các nhân viên thuộc cùng phòng làm việc của mình
2.4 Ngữ cảnh toàn cục (Global Context):
Ngữ cảnh toàn cục được sử dụng khi chúng muốn chia sẻ các giá trị trong các phiên làm việc với nhau, hoặc trong trường hợp muốn kết nối các ứng dụng với nhau Khi ấy các giá trị sẽ không được xác nhận cụ thể là của người nào cũng như việc liệu dữ liệu có tin cậy hay không Tuy nhiên, chúng ta không nên sử dụng ngữ cảnh toàn cục mà nên sử dụng ngữ cảnh cục bộ bởi các thuộc tính thì được thiết lập cho từng phiên và nó là dữ liệu nhạy cảm
CHƯƠNG III: BẢO MẬT MỨC HÀNG VỚI VPD
3.1 Giới thiệu về RLS:
RLS là một chính sách bảo mật mức hàng cho phép giới hạn việc truy xuất các hàng dựa trên một chính sách bảo mật được hiện thực bằng PL/SQL Một chính sách bảo mật
mô tả các quy định quản lý việc truy xuất các dòng dữ liệu
Để thực hiện RLS, đầu tiên ta tạo 1 hàm PL/SQL trả về một chuỗi String String này chứa các điều kiện của chính sách bảo mật mà ta muốn hiện thực Hàm PL/SQL vừa được tạo ở trên sau đó được đăng ký cho các bảng, khung nhìn mà ta muốn bảo vệ bằng cách dùng package PL/SQL DBMS_RLS Khi có một câu truy vấn của bất kỳ user nào trên đối tượng được bảo vệ, Oracle sẽ nối chuỗi được trả về từ hàm nêu trên vào mệnh đề WHERE của câu lệnh SQL ban đầu, nhờ đó sẽ lọc được các hàng dữ liệu theo các điều kiện của chính sách bảo mật Vậy ta có thể tóm lược cơ chế làm việc của LRS gồm 3 bước sau:
Bước 1: Tạo Function PL/SQL trả về String A
Bước 2: Tạo chính sách bảo mật áp dụng vào table, view mà muốn bảo vệ
Bước 3: Khi User thực hiện một câu truy vấn SQL Hệ thống sẽ gán String A vào sau