Tải bản đầy đủ (.doc) (24 trang)

TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (294.48 KB, 24 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP LỚN MÔN HỌC
AN TOÀN CƠ SỞ DỮ LIỆU
Đề tài số 09
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU
RIÊNG ẢO TRONG ORACLE
Giảng viên: Trần Thị Lượng
Thực hiện:
HÀ NỘI 01/2015
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE

ii
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
MỤC LỤC
MỤC LỤC I
a. Các phiên bản VPD 2
b. Lợi ích của VPD 3
2.2. Ngữ cảnh mặc định USERENV 4
2.3. Ngữ cảnh cục bộ (Local Context) 6
a. Tạo một ngữ cảnh ứng dụng 6
b. Thiết lập các thuộc tính và giá trị cho ngữ cảnh ứng dụng 6
c. Áp dụng ngữ cảnh ứng dụng vào bảo mật 7
2.4. Ngữ cảnh toàn cục (Global Context) 8
a. Tạo schema quản trị VPD 14
b. Tạo ngữ cảnh ứng dụng 14
c. Tạo các chính sách VPD 15
KẾT LUẬN 17
TÀI LIỆU THAM KHẢO 18
AN TOÀN CƠ SỞ DỮ LIỆU
i


TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
DANH MỤC KÝ HIỆU VÀ TỪ VIẾT TẮT
Viết tắt Giải thích
CNTT Công nghệ thông tin
CSDL Cơ sở dữ liệu
DML Data Manipulation Language
PL/SQL Procedural Language/Structured Query Language
RDBMS Relational Database Management System
RLS Row-Level Security
VPD Virtual Private Database
AN TOÀN CƠ SỞ DỮ LIỆU
ii
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
DANH MỤC CÁC BẢNG
Bảng 1. Những thuộc tính xác định của USERENV 6
Bảng 2. Bảng nhân viên 13
Bảng 3. Bảng tài khoản 13
Bảng 4. Kiểm tra ngữ cảnh ứng dụng 15
Bảng 5. Các bản ghi xem được với tài khoản nhân viên 16
Bảng 6. Các bản ghi xem được với tài khoản trưởng phòng lập trình 16
Bảng 7. Các bản ghi xem được với tài khoản trưởng phòng kế hoạch 16
Bảng 8. Các bản ghi xem được với tài khoản giám đốc 16
Bảng 9. Các bản ghi sau khi thực hiện chính sách bảo mật mức cột 17
AN TOÀN CƠ SỞ DỮ LIỆU
iii
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
LỜI MỞ ĐẦU
Ngày nay chúng ta đã biết được tầm quan trọng của công nghệ thông tin
(CNTT) trong đời sống. Và riêng đối với các công ty, tổ chức thì CSDL là trái
tim, là nguồn sống của họ. Sự bùng nổ của Internet đã đánh thức nhu cầu trao

đổi và tìm kiếm thông tin trên mạng. Nhu cầu càng cao, sự tìm kiếm thông tin
càng mạnh đã khiến cho các công ty, tổ chức lao đao trước bài toán bảo vệ và
quản lý dữ liệu.
Trước nhu cầu thực tế đó, việc bắt buộc tìm kiếm một giải pháp tối ưu thật
là khó đối với các nhà quản lý thông tin nhưng không phải là không có hướng
giải quyết. Oracle là một trong những giải pháp mà hầu hết các công ty đã lựa
chọn.
Dưới sự lựa chọn và tin tưởng của các công ty, tổ chức, Oracle không thể
không ngừng nỗ lực phát triển để đáp ứng các nhu cầu của họ. Nhiều giải pháp
tiếp tục được đưa ra và VPD là một giải pháp mới dùng để thực thi kiểm soát
truy cập dữ liệu tại máy chủ. Dưới sự cần thiết và những tính mới của nó nên
nhóm em đã lựa chọn đề tài “Tìm hiểu về cơ sở dữ liệu riêng ảo trong Oracle”
cho bài tập lớn môn An toàn cơ sở dữ liệu.
Dù cả nhóm đã nỗ lực cố gắng nhưng do thời gian có hạn nên đề tài vẫn còn
nhiều thiếu sót. Chúng em mong nhận được sự chỉ bảo cuả thầy cô và các bạn.
AN TOÀN CƠ SỞ DỮ LIỆU
iv
CẤU TRÚC ĐỊNH DẠNG PHÂN VÙNG Ổ ĐĨA CỨNG NTFS
CHƯƠNG 1. 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à
1 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 12. 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). Version 10 và 11 là g (grid). Version 12 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
AN TOÀN CƠ SỞ DỮ LIỆU
1
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
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’;
a. 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.
AN TOÀN CƠ SỞ DỮ LIỆU
2
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
- 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.
b. 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.
AN TOÀN CƠ SỞ DỮ LIỆU
3
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
CHƯƠNG 2. 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 lư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 USERENV
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')
AN TOÀN CƠ SỞ DỮ LIỆU
4
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
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_CURSORID

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_IDENTITY
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_IDENTIFIER
Trả về ID được thiết lập bởi ứng dụng thông qua thủ tục
DBMS_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.
CURRENT_SCHEMA
Tên của schema hiện tại.
CURRENT_SCHEMAID
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_LENGTH
Độ 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_IDENTITY
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_TYPE
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_PROTOCOL
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_FORMAT
Định dạng ngày của phiên.
NLS_DATE_LANGUAGE
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_ENTERPRISE_IDENT
ITY
Trả về Oracle Internet Directory DN khi tài khoản proxy là tài khoản

doanh nghiệp.
AN TOÀN CƠ SỞ DỮ LIỆU
5
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
PROXY_GLOBAL_UID
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.
SERVER_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.
Bảng 1. Những thuộc tính xác định của USERENV
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.
a. 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;
b. 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.
Để 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.
AN TOÀN CƠ SỞ DỮ LIỆU
6
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
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;
c. Áp dụng ngữ cảnh ứng dụng vào 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.
AN TOÀN CƠ SỞ DỮ LIỆU
7
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
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 3. BẢO MẬT MỨC HÀNG VỚI VPD
3.1. Giới thiệu về RLS (Row-Level Security)
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 mệnh đề WHERE.
AN TOÀN CƠ SỞ DỮ LIỆU
8
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
Một ưu điểm của RLS là ta có thể thay đổi nội dung của chính sách bảo mật
bằng cách viết lại function hiện thực chính sách đó (Bước 1) mà không cần phải
đăng ký lại chính sách đó cho đối tượng cần bảo vệ (Bước 2).
3.2. Tạo Function PL/SQL trả về chuỗi String
Giả sử ta có một chính sách bảo mật quy định không một người dùng nào
được truy xuất đến bản ghi có mã nhân viên là nv001 trong bảng NhanVien. Để
chính sách này có thể áp dụng cho CSDL, đầu tiên ta cần tạo 1 Function
PL/SQL có chuỗi trả về là điều kiện của chính sách bảo mật trên:
CREATE OR REPLACE FUNCTION no_nv001 (
p_schema IN VARCHAR2,
p_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'maNV != ''nv001''';
END;
Trên đây là ví dụ đơn giản về Function PL/SQL trả về một chuỗi String. Tuy
nhiên, trong thực tế người ta sử dụng thêm ngữ cảnh ứng dụng để có thể tạo ra
các chuỗi String linh hoạt hơn.
Như đã đề cập ở chương 2, chúng ta đã tạo ra một ngữ cảnh ứng dụng có
chức năng lấy được tên phòng làm việc của nhân viên đang kết nối tới CSDL.

Từ ngữ cảnh ứng dụng này có thể tạo được chính sách bảo mật quy định chỉ xem
được các bản ghi có nhân viên làm việc cùng phòng với mình.
CREATE OR REPLACE FUNCTION cung_phong (
p_schema IN VARCHAR2,
AN TOÀN CƠ SỞ DỮ LIỆU
9
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
p_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'Phong = (SELECT SYS_CONTEXT(''Info'', ''GetPhong'') FROM
DUAL)';
END;
Tất cả các Function PL/SQL mà ta tạo ra đều phải có đúng 2 tham số truyền
vào. Tham số đầu tiên là tên của schema sở hữu đối tượng mà chính sách RLS
đó bảo vệ. Tham số thứ hai là tên của đối tượng được bảo vệ. Hai tham số này
rất hữu ích vì chính sách bảo mật có thể được áp dụng cho nhiều đối tượng khác
nhau trong nhiều schema khác nhau.
3.3. Tạo chính sách bảo mật áp dụng vào bảng, khung nhìn…
Sau khi tạo Function PL/SQL trên thì cần phải tạo Policy để áp dụng chúng
vào các đối tượng như bảng, khung nhìn:
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'CongTyA',
object_name => 'nhanvien',
policy_name => 'VPD_cungphong',
function_schema => 'QuanTriVPD',
policy_function => 'cung_phong',
statement_types => 'SELECT,INSERT,UPDATE,DELETE',

);
END;
Có thể thấy statement_types là nơi thiết lập những câu lệnh ảnh hưởng bởi
chính sách này.
Lưu ý rằng các Function PL/SQL và chính sách bảo mật được tạo ra trong
schema của người quản trị bảo mật. Điều này quan trọng vì việc truy xuất vào
các chính sách bảo mật cần được bảo vệ. Các user khác không nên có quyền
Execute, Alter hay Drop trên các chính sách bảo mật này. Một yêu cầu nữa là
nên tách biệt khỏi schema chứa dữ liệu mà nó sẽ áp dụng.
Khi làm việc với RLS ta cần lưu ý một số điều sau:
• Các hàm PL/SQL được đăng ký cho các table, view hay synonym bằng cách
gọi thủ tục DBMS_RLS.ADD_POLICY
• Thủ tục ADD_POLICY đòi hỏi ít nhất phải có 3 tham số nhập vào:
object_name, policy_name, policy_function
• Sự kết hợp của object_schema, object_name, policy_name phải là duy nhất.
AN TOÀN CƠ SỞ DỮ LIỆU
10
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
• Mặc định, chính sách sẽ được áp dụng cho tất cả các lệnh SELECT,
INSERT, UPDATE, INDEX, và DELETE. Người quản trị có thể dùng tham số
STATEMENT_TYPES để chỉ ra chính sách áp dụng cho loại câu lệnh nào.
• Khi 1 user truy xuất một cách trực tiếp hay gián tiếp vào đối tượng được bảo
vệ, RLS sẽ được gọi một cách trong suốt, hàm PL/SQL đã đăng ký sẽ được thực
thi, và rồi lệnh SQL của user sẽ được chỉnh sửa và thực thi.
• Schema SYS không bị ảnh hưởng bởi bất kỳ chính sách bảo mật nào.
• Nhiều chính sách cũng có thể áp dụng cho cùng 1 đối tượng. Khi đó CSDL
sẽ kết hợp tất cả các policy đó lại với nhau theo phép AND
3.4. Riêng tư mức cột trong VPD
Oracle 10g cung cấp thêm 1 tính năng mới cho VPD gọi là Column
Sensitive VPD. Mục đích của tính năng này là thực hiện các chính sách bảo mật

lên mức cột.
Giả sử ta có một chính sách bảo vệ trên bảng NhanVien quy định một user
có thể thấy tất cả các thông tin của những nhân viên khác ngoại trừ lương của
họ. Khi đó ta cần hiện thực 1 chính sách bảo mật trên bảng NhanVien quy định
một user chỉ được truy xuất đến bản ghi của bản thân người đó nếu trong câu
lệnh truy xuất có tham khảo đến cột Luong:
CREATE OR REPLACE FUNCTION only_view_salary (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
VARCHAR2
AS
BEGIN
RETURN 'MaNV=(SELECT SYS_CONTEXT(''Info'',''GetMaNV'') FROM DUAL)';
END;
Điều ta mong đợi là khi câu truy vấn có tham khảo đến cột Luong, tất cả các
bản ghi hợp lệ đều được trả về không hợp lệ là các giá trị NULL. Ta cần phải
thực hiện chính sách bảo mật như sau:
BEGIN
DBMS_RLS.add_policy
(object_schema => 'congty',
object_name => 'nhanvien',
policy_name => 'VPD_only_view_salary',
function_schema => 'QuanTriVPD',
policy_function => 'only_view_salary',
statement_types => 'SELECT',
sec_relevant_cols => 'Luong',
sec_relevant_cols_opt => DBMS_RLS.all_rows);
END;
AN TOÀN CƠ SỞ DỮ LIỆU
11

TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
Tham số sec_relevant_cols_opt chỉ có thể áp dụng cho câu lệnh SELECT
3.5. Xóa Policy RLS
Để xóa bỏ việc 1 chính sách bảo mật đã được đăng ký cho một bảng, khung
nhìn…ta dùng thủ tục DROP_POLICY của package DBMS_RLS. Ví dụ:
BEGIN
DBMS_RLS.drop_policy (
object_schema => 'CongTyA',
object_name => 'nhanvien',
policy_name => 'VPD_cungphong');
END;
3.6. Quyền Exempt Access Policy
Tuy RLS cung cấp một kỹ thuật bảo mật rất tốt, nhưng nó cũng dẫn đến một
sự khó chịu khi thực hiện các tác vụ quản trị CSDL (Ví dụ: Backup dữ liệu).
Như đã biết, ngay cả các DBA và người chủ của các đối tượng đó cũng không
thể tránh được các chính sách bảo mật. Nếu người chủ của một bảng nào đó thực
hiện backup dữ liệu của bảng đó trong khi các chính sách bảo mật trên nó vẫn có
tác dụng, rất có thể file backup sẽ không có dữ liệu nào hết. Vì lý do này, Oracle
cung cấp quyền EXEMPT ACCESS POLICY. Người được cấp quyền này sẽ
được miễn khỏi tất cả các chính sách. Người quản trị có nhiệm vụ thực hiện
backup cần có quyền này để đảm bảo rằng tất cả các dữ liệu sẽ được backup lại.
GRANT EXEMPT ACCESS POLICY TO Backup_CSDL;
Do đây là quyền rất mạnh, không chỉ định trên cụ thể một schema hay object
nào nên ta cần cẩn trọng trong việc quản lý xem ai được phép nắm giữ quyền
này. Mặc định, những user có các quyền SYSDBA sẽ có quyền này (account
SYS).
AN TOÀN CƠ SỞ DỮ LIỆU
12
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
CHƯƠNG 4. ÁP DỤNG VPD VÀO MỘT CSDL CỤ THỂ

4.1. Đặt vấn đề
Nếu một CSDL đơn giản về nhân sự của một công ty được mô tả trên bảng
NHANVIEN theo như dưới đây:
Bảng 2. Bảng nhân viên
Và một bảng TAIKHOAN mô tả tên tài khoản CSDL của nhân viên:
Bảng 3. Bảng tài khoản
Yêu cầu: Có ba lớp người dùng cần phân quyền trên bảng CSDL này tương
ứng với ba loại chức vụ: Giám đốc, Trưởng phòng và Nhân viên:
• Giám đốc là người có quyền cao nhất nên có mọi quyền (xem, xóa, sửa, cập
nhật) trên bảng NHANVIEN.
• Các trưởng phòng được xem và sửa tất cả các bản ghi thuộc phòng đó trong
bảng NHANVIEN.
• Các nhân viên chỉ được xem thông tin của bản thân.
• Mỗi người dùng chỉ có thể xem được lương của bản thân.
4.2. Giải quyết bài toán
AN TOÀN CƠ SỞ DỮ LIỆU
13
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
a. Tạo schema quản trị VPD
Chúng ta cần phải tạo một schema để quản lý các chính sách bảo mật VPD
dễ dàng hơn. Lần lượt thực hiện các câu lệnh dưới đây tạo schema QuanTriVPD
và phân quyền cho nó.
create user QuanTriVPD identified by 123456;
grant create session to QuanTriVPD;
grant create session,
create any context,
create procedure,
create trigger,
administer database
trigger to QuanTriVPD;

grant execute on dbms_session to QuanTriVPD;
grant execute on dbms_rls to QuanTriVPD;
b. Tạo ngữ cảnh ứng dụng
Với schema vừa tạo, chúng ta sẽ luôn sử dụng nó để quản lý cho các chính
sách VPD sau này.
Theo yêu cầu bài toán, cần phải có một ngữ cảnh ứng dụng hỗ trợ việc lấy ra
tên Phòng, tên Chức vụ, tên Tài khoản tại mỗi phiên kết nối tới CSDL.
CREATE OR REPLACE CONTEXT Info USING Info_pkg;
CREATE OR REPLACE PACKAGE Info_pkg IS
PROCEDURE GetInfo;
END;

CREATE OR REPLACE PACKAGE BODY Info_pkg IS
PROCEDURE GetInfo
AS
tenusername varchar(20);
tenphong varchar(50);
tenchucvu varchar(50);
tenmaNV varchar(50);
BEGIN
tenusername := LOWER(SYS_CONTEXT('USERENV','SESSION_USER'));
DBMS_SESSION.set_context('Info','GetUsername',tenusername);
SELECT MaNV into tenmaNV FROM TaiKhoan WHERE username =
tenusername;
SELECT NhanVien.Phong into tenphong FROM NhanVien,TaiKhoan
WHERE Taikhoan.manv = nhanvien.manv and TaiKhoan.username = tenusername;
SELECT NhanVien.ChucVu into tenchucvu FROM NhanVien,TaiKhoan
WHERE Taikhoan.manv = nhanvien.manv and TaiKhoan.username = tenusername;
DBMS_SESSION.set_context('Info','GetMaNV',tenmaNV);
DBMS_SESSION.set_context('Info','GetPhong',tenphong);

DBMS_SESSION.set_context('Info','GetChucVu',tenchucvu);
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END GetInfo;
END;
Để ngữ cảnh ứng dụng này có hiệu lực tại mỗi phiên kết nối, cần phải thêm
một TRIGGER như sau:
CREATE OR REPLACE TRIGGER Set_Info AFTER LOGON ON DATABASE
AN TOÀN CƠ SỞ DỮ LIỆU
14
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
BEGIN quantrivpd.Info_pkg.GetInfo;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
Tiến hành kết nối vào một tài khoản trưởng phòng để kiểm tra tính hiệu lực
của ngữ cảnh ứng dụng vừa tạo:
SELECT
SYS_CONTEXT('Info', 'GetMaNV') MaNV,
SYS_CONTEXT('Info', 'GetUsername') TaiKhoan,
SYS_CONTEXT('Info', 'GetPhong') Phong,
SYS_CONTEXT('Info', 'GetChucVu') ChucVu
FROM DUAL;
Bảng 4. Kiểm tra ngữ cảnh ứng dụng
c. Tạo các chính sách VPD
Quay trở về với schema quản trị VPD, chúng ta thiết lập chính sách bảo mật
để phân quyền phù hợp với 3 loại chức vụ trên
CREATE OR REPLACE FUNCTION fn_ChucVu(

schema_p IN VARCHAR2,
table_p IN VARCHAR2)
RETURN VARCHAR2
AS
getChucVu varchar(50);
trave varchar2(1000);
BEGIN
SELECT SYS_CONTEXT('Info', 'GetChucVu') into getChucVu FROM DUAL;
trave := '1=2';
if (getChucVu = 'Giam Doc') then
trave := NULL;
else
if (getChucVu = 'Truong phong') then
trave := 'NhanVien.Phong = (SELECT SYS_CONTEXT(''Info'',
''GetPhong'') FROM DUAL)';
else
trave := 'NhanVien.MaNV = (SELECT MaNV FROM TaiKhoan WHERE
username = (SELECT SYS_CONTEXT(''Info'', ''GetUsername'') FROM DUAL))';
end if;
end if;
RETURN trave;
END;
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'c##congty',
object_name => 'nhanvien',
policy_name => 'VPD_chinhsach',
function_schema => 'c##QuanTriVPD',
policy_function => 'fn_ChucVu',
statement_types => 'SELECT,INSERT,UPDATE,DELETE',

);
END;
AN TOÀN CƠ SỞ DỮ LIỆU
15
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
Tiến hành kết nối bằng các tài khoản để kiểm tra tính hiệu lực:
Bảng 5. Các bản ghi xem được với tài khoản nhân viên.
Bảng 6. Các bản ghi xem được với tài khoản trưởng phòng lập trình.
Bảng 7. Các bản ghi xem được với tài khoản trưởng phòng kế hoạch.
Bảng 8. Các bản ghi xem được với tài khoản giám đốc.
Với yêu cầu mỗi người dùng chỉ có thể xem được lương của bản thân thì cần
phải có thêm một chính sách riêng cho nó:
CREATE OR REPLACE FUNCTION only_view_salary (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
RETURN 'NhanVien.MaNV = (SELECT SYS_CONTEXT(''Info'',
''GetMaNV'') FROM DUAL)';
END;
BEGIN
DBMS_RLS.add_policy
(object_schema => 'c##congty',
object_name => 'nhanvien',
policy_name => 'VPD_only_view_salary',
function_schema => 'c##QuanTriVPD',
policy_function => 'only_view_salary',
statement_types => 'SELECT',
sec_relevant_cols => 'Luong',

AN TOÀN CƠ SỞ DỮ LIỆU
16
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
sec_relevant_cols_opt => DBMS_RLS.all_rows);
END;
Bảng 9. Các bản ghi sau khi thực hiện chính sách bảo mật mức cột
KẾT LUẬN
Hiện nay, bảo mật cơ sở dữ liệu có rất nhiều phương pháp như: Mã hóa dữ
liệu minh bạch (Transparent Data Encryption), phương pháp xác thực
(Authentication Methods), quyền hạn (Authorization), hạn chế truy cập vào các
đối tượng (Access Restrictions On Objects), chính sách bảo mật (Security
Policies), kiểm toán CSDL (Database Auditing). Và VPD là một trong những
giải pháp hữu hiệu đã được nhiều công ty, tổ chức tin dùng.
Do thời gian nghiên cứu có hạn nên đề tài của nhóm còn nhiều thiếu sót, rất
mong nhận được sự chỉ bảo của thầy cô và các bạn.
Một lần nữa chúng em xin chân thành cảm ơn cô Trần Thị Lượng đã tận
tình hướng dẫn và giúp đỡ em trong thời gian qua.
AN TOÀN CƠ SỞ DỮ LIỆU
17
TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU RIÊNG ẢO TRONG ORACLE
TÀI LIỆU THAM KHẢO
[1] T.S Nguyễn Nam Hải, Giáo trình An toàn cơ sở dữ liệu
[2] Cơ chế an toàn dựa vào nhãn và CSDL trên Oracle, http:// goo.gl/btfCq2
[3] 1 bài demo về VPD (Virtual Private Database),
/>[4] Oracle Database Security Guide 10g Release 2,
/>AN TOÀN CƠ SỞ DỮ LIỆU
18

×