Trong bài viết này, tôi sẽ tiếp tục với Oracle Database Security và tôi sẽ trình bày một số thông tin quan trọng về kiểm toán cơ sở dữ liệu tiêu chuẩn, kích hoạt kiểm toán và chính sách kiểm toán trong Oracle. Kiểm toán cơ sở dữ liệu có hai thành phần:giám sát và đăng ký liên tục các bộ hoạt động và sự kiện cơ sở dữ liệu đã thiết lập. Mục đích của việc kiểm tra cơ sở dữ liệu là không từ chối, điều tra các hoạt động đáng ngờ, phát hiện các vấn đề do cấu hình tạo ra liên quan đến ủy quyền (truy cập tài nguyên), tuân thủ luật pháp và kiểm soát thực tế.
Kiểm toán Chuẩn
Chúng tôi kiểm toán những hoạt động nào? Việc khởi động và dừng cơ sở dữ liệu cũng như các kết nối do người quản trị cơ sở dữ liệu thực hiện đều được Oracle kiểm tra ngầm và dữ liệu được lưu trữ tự động trong hệ điều hành. Bảng dưới đây cho thấy các hoạt động khác có thể được giám sát:
Chúng tôi lưu giữ các hoạt động đã được kiểm toán ở đâu?
- trong cơ sở dữ liệu , sử dụng đường mòn kiểm tra cơ sở dữ liệu, nơi chúng tôi có hai khả năng:
-
- Audit_trail =DB
có thể được thực hiện bằng mã sau:alter system set audit_trail=db scope=spfile;
- Audit_trail =DB
-
- Audit_trail =DB, EXTENDED
bằng cách sử dụng mã sau:alter system set audit_trail= db, extended scope=spfile;
Sự khác biệt giữa DB và DB, EXTENDED là cột thứ hai điền các cột SQLBIND và SQLTEXT CLOB của bảng SYS.AUD $.
- Audit_trail =DB, EXTENDED
- bên ngoài , sử dụng đường mòn kiểm tra hệ điều hành, với các khả năng sau:
- Audit_trail =OS
và mã được sử dụng là:alter system set audit_trail=os scope=spfile;
- Audit_trail =XML và đường dẫn tệp AUDIT_FILE_DEST =(ngầm định là $ ORACLE_BASE / admin / $ ORACLE_SID / adump)
với mã:alter system set audit_trail=xml scope=spfile;
- Audit_trail =OS
Để tìm cấu hình hiện tại của các hoạt động được kiểm toán đã lưu trữ, người ta có thể chạy truy vấn sau, được viết bằng chữ thường:
select value from v$parameter where name='audit_trail';
Các lệnh hữu ích hơn:
[id bảng =43 /]
Bây giờ, hãy xem một số ví dụ về kiểm tra cơ sở dữ liệu.
Dưới đây là một ví dụ về kiểm toán tiêu chuẩn với thông tin đã kiểm toán được lưu trữ trong cơ sở dữ liệu:
Thông tin được kiểm toán bao gồm các câu lệnh SELECT được thực thi trên các bảng cơ sở dữ liệu.
Trong Nhà phát triển SQL, hãy thực thi tập lệnh sau:
alter system set audit_trail= db, extended scope=spfile; AUDIT SELECT TABLE;
Sau đó, cơ sở dữ liệu phải được khởi động lại. Để làm điều đó, trong thiết bị đầu cuối SQLPlus, kết nối với sys tên người dùng dưới dạng sysdba / password và chạy các câu lệnh sau:
SHUTDOWN IMMEDIATE STARTUP
Lưu ý rằng các kích thước trên khác nhau giữa các hệ thống.
Để xác minh xem lộ trình kiểm tra có được đặt chính xác hay không, hãy chạy truy vấn sau:
select value from v$parameter where name='audit_trail';
hoặc:
show parameter audit_trail;
Khi bạn muốn dừng kiểm tra, hãy thực hiện:
NOAUDIT SELECT TABLE;
Để xem những báo cáo nào đã được ghi lại bởi cuộc kiểm toán, bạn có thể sử dụng:
select dbms_lob.substr( sqltext, 4000, 1 ) from SYS.AUD$ where OBJ$NAME IN ('EMPLOYEES','DEPARTMENTS','JOBS','LOCATIONS');
hoặc
select count(*), OBJ$NAME, USERID from SYS.AUD$ where OBJ$NAME IN ('EMPLOYEES','DEPARTMENTS','JOBS','LOCATIONS') group by rollup (OBJ$NAME, USERID);
Một ví dụ khác là đối với kiểm toán tiêu chuẩn với dữ liệu đã kiểm toán được lưu trữ trong tệp XML, trong đường dẫn tiêu chuẩn.
alter system set audit_trail=xml scope=spfile; AUDIT SELECT, INSERT, UPDATE, DELETE ON employees WHENEVER NOT SUCCESSFUL;
Một lần nữa, khởi động lại cơ sở dữ liệu:kết nối với thiết bị đầu cuối SQLPlus với tên người dùng sysdba / password và chạy các lệnh SHUTDOWN IMMEDIATE và STARTUP.
Sau đó, mỗi khi truy vấn chọn, chèn, cập nhật và xóa không thành công trên bảng nhân viên, nó sẽ được ghi lại trong tệp XML.
Khi chúng tôi muốn dừng kiểm tra, chúng tôi chạy các lệnh sau trong môi trường phát triển cơ sở dữ liệu:
NOAUDIT ALL; NOAUDIT ALL ON DEFAULT;
Và khôi phục lộ trình kiểm tra mặc định:
alter system set audit_trail=db scope=spfile;
Dưới đây là ví dụ về một phần của tệp kiểm tra XML:
Làm cách nào để chúng tôi xóa thông tin đã kiểm toán?
Khối lượng dữ liệu được kiểm toán có thể trở nên rất lớn do số lượng các hoạt động được kiểm toán và tần suất của chúng. Đây là lý do tại sao nên lưu trữ định kỳ dữ liệu đã được kiểm toán và xóa dữ liệu đó khỏi hệ thống sản xuất.
Nếu dữ liệu đã kiểm toán được lưu trữ trong cơ sở dữ liệu (đường mòn kiểm tra cơ sở dữ liệu), thì chúng tôi có thể sử dụng câu lệnh xóa (nhưng chỉ sau khi chúng tôi đã lưu trữ dữ liệu!):
DELETE FROM SYS.AUD$;
Bạn có thể chọn xóa thông tin đã được kiểm toán cho một đối tượng cơ sở dữ liệu cụ thể, ví dụ:một bảng có tên là sản phẩm:
DELETE FROM SYS.AUD$ WHERE OBJ$NAME='PRODUCTS';
Kích hoạt kiểm tra
Trình kích hoạt là một khối PL / SQL hoặc câu lệnh CALL của một thủ tục PL / SQL được thực thi tự động mỗi khi một sự kiện xảy ra. Có hai loại trình kích hoạt:ở cấp cơ sở dữ liệu (các câu lệnh cơ sở dữ liệu) và ở cấp ứng dụng (ví dụ nhấn một nút trên Biểu mẫu Oracle). Các trình kích hoạt được sử dụng để kiểm tra là các trình kích hoạt mức cơ sở dữ liệu. Họ phân loại thành các loại sau:
- Trình kích hoạt DML - nơi một câu lệnh DML được kích hoạt trên một bảng. Các trình kích hoạt đó có thể được thực thi một lần ở cấp lệnh bất kể số lượng bản ghi (trình kích hoạt ở cấp câu lệnh) hoặc chúng có thể được thực thi CHO MỌI ROW (kích hoạt ở cấp bản ghi). Các loại trình kích hoạt mức bản ghi:BÁO CÁO TRƯỚC, BÁO CÁO SAU, TRƯỚC MỖI ROW, SAU MỖI ROW;
- INSTEAD OF trigger - nơi một câu lệnh DML được kích hoạt trên một khung nhìn;
- Trình kích hoạt HỆ THỐNG - được kích hoạt bởi các sự kiện như khởi động / dừng cơ sở dữ liệu, câu lệnh DDL, đăng nhập / đăng xuất của người dùng. Các loại kích hoạt hệ thống:SAU SỰ KIỆN, TRƯỚC SỰ KIỆN.
Truy vấn SYS.TRIGGER $ bảng hoặc ALL_TRIGGERS chế độ xem cung cấp thông tin về tất cả các trình kích hoạt cấp cơ sở dữ liệu. Ví dụ:loại trình kích hoạt khác biệt từ cơ sở dữ liệu có thể được tìm thấy như sau:
SELECT DISTINCT TRIGGER_TYPE FROM ALL_TRIGGERS;
Chế độ xem DBA_TRIGGERS cung cấp thông tin về các trình kích hoạt được tạo tự động bởi các sản phẩm Oracle khi cài đặt. Nếu chúng tôi muốn tìm thông tin về các trình kích hoạt HỆ THỐNG (‘TRƯỚC SỰ KIỆN’ và ‘SAU SỰ KIỆN’), chúng tôi có thể chạy câu lệnh sau:
SELECT SUBSTR(OWNER,1,20) OWNER ,SUBSTR(TRIGGER_NAME,1,30), TRIGGER_NAME, SUBSTR(TRIGGERING_EVENT,1,30) TRIGGERING_EVENT, TRIGGER_TYPE FROM DBA_TRIGGERS WHERE TRIGGER_TYPE='BEFORE EVENT' OR TRIGGER_TYPE='AFTER EVENT' ORDER BY TRIGGER_TYPE DESC;
Ngoài ra, khi cài đặt, các trình kích hoạt DML được tạo tự động trên lược đồ người dùng HR:
SELECT SUBSTR(TABLE_NAME,1,20) TABLE_NAME, SUBSTR(TRIGGER_TYPE,1,30) TRIGGER_TYPE,TRIGGER_BODY FROM DBA_TRIGGERS WHERE OWNER='HR';
Để kiểm tra, chúng tôi có thể tạo các trình kích hoạt tùy chỉnh để ghi lại thông tin mong muốn, nhưng người ta nên tạo một bảng đặc biệt để lưu trữ thông tin đã được kiểm toán.
Điều quan trọng là đảm bảo rằng các trình kích hoạt đã phát triển không ảnh hưởng đến hoạt động bình thường của cơ sở dữ liệu. Mục đích của kiểm toán là theo dõi thụ động hoạt động bình thường hàng ngày của cơ sở dữ liệu và lưu trữ nó để phân tích sau này. Do đó, không nên tạo trình kích hoạt INSTEAD OF để trả kết quả từ các bảng mục tiêu đến bảng kiểm tra.
Trình kích hoạt DML ở cấp câu lệnh có thể cùng tồn tại với trình kích hoạt DML ở cấp bản ghi. Thứ tự cuộc gọi là:
- kích hoạt câu lệnh BEFORE
- đối với mỗi bản ghi bị ảnh hưởng
- kích hoạt bản ghi TRƯỚC KHI
- hành động DML hiện tại
- kích hoạt SAU bản ghi
- kích hoạt câu lệnh SAU KHI
Theo Oracle, các trình kích hoạt do người dùng định nghĩa sẽ chỉ được thực thi nếu, theo Oracle, câu lệnh là đúng và có thể xảy ra. Đối với một câu lệnh DML sai hoặc một câu lệnh vi phạm một ràng buộc, một lỗi sẽ được trả về và trình kích hoạt sẽ không được thực thi. Do đó, để đánh giá, chúng tôi khuyến nghị sử dụng đặc biệt là các trình kích hoạt LMD ở cấp báo cáo.
Ví dụ về trình kích hoạt kiểm tra:
Giả sử chúng ta muốn tạo một trình kích hoạt để ghi vào bảng kiểm toán (được gọi là TAB_AUDIT_EMP) thông tin về các báo cáo DML thiết lập mức lương trên 20000 (đơn vị tiền tệ ở đây không quan trọng) cho nhân viên của công ty. Chúng tôi muốn lưu trữ trong TAB_AUDIT_EMP số thứ tự của truy vấn, tên người dùng, phiên, máy chủ lưu trữ và ngày.
Điều này có thể được thực hiện với những điều sau:
CREATE TABLE TAB_AUDIT_EMP (secv_id NUMBER(3) PRIMARY KEY, username VARCHAR2(20), session_nr NUMBER(10), hostname VARCHAR2(100), query_date DATE ); CREATE SEQUENCE secv_aud_emp START WITH 1 INCREMENT BY 1; CREATE OR REPLACE TRIGGER huge_salary AFTER INSERT OR UPDATE OR DELETE OF SALARY ON EMPLOYEES FOR EACH ROW WHEN (NEW.salary>20000) BEGIN INSERT INTO TAB_AUDIT_EMP VALUES(secv_aud_emp.NEXTVAL , sys_context('userenv', 'session_user'), sys_context('userenv', 'sessionid'), sys_context('userenv', 'host'), sysdate); END;
Giả sử chúng tôi thực hiện sửa đổi tiền lương cho các nhân viên trong một bộ phận cụ thể:
UPDATE EMPLOYEES SET SALARY=25000 WHERE ID_DEPARTMENT = 1;
Và sau đó chúng tôi xác minh việc giám sát:
select secv_id, substr(username,1,20) username, session_nr, substr(hostname,1,30) hostname, query_date from TAB_AUDIT_EMP;
Chính sách kiểm tra
Phương pháp kiểm toán thứ ba đề cập đến các chính sách kiểm toán. Định nghĩa về chính sách kiểm toán bao gồm những điều sau:
- đặc điểm kỹ thuật của đối tượng (lược đồ, tên đối tượng, các cột) được theo dõi
- đặc tả của các hành động được kiểm tra cho một đối tượng (CHỌN, CHÈN, CẬP NHẬT, XÓA):ngầm hiểu đó là CHỌN
- đặc tả các điều kiện phải được đáp ứng để ghi lại thông tin đã được kiểm toán, nó được thực hiện trong mệnh đề WHEN của trình kích hoạt và là tùy chọn
- một trình xử lý sự kiện xử lý thêm sự kiện, đây là tùy chọn.
Chính sách kiểm toán có thể hoạt động (trạng thái ĐÃ BẬT) hoặc không hoạt động (trạng thái BỊ TẮT). Có thể thu thập danh sách các chính sách kiểm toán bằng cách thẩm vấn chế độ xem ALL_AUDIT_POLICIES:
SELECT POLICY_TEXT, ENABLED FROM ALL_AUDIT_POLICIES
Để quản lý chính sách kiểm toán, chúng tôi có gói DBMS_FGA. Để sử dụng gói này, cần phải cấp đặc quyền cho người dùng sẽ viết mã PL / SQL:
grant execute on dbms_fga to username;
Ví dụ về chính sách kiểm toán:
Chúng tôi muốn tạo chính sách kiểm tra để ghi lại các câu lệnh DML sửa đổi trình quản lý (MANAGER_ID) trong bảng DEPARTMENTS. Chúng tôi có thể chọn tạo một trình xử lý cho chính sách, được gọi là proc_audit_alert, thông báo cho chúng tôi về một sửa đổi liên quan đến người quản lý:
CREATE OR REPLACE PROCEDURE proc_audit_alert ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ) AS BEGIN DBMS_OUTPUT.PUT_LINE('Alert! Manager Changed !'); END;
Và chính sách có thể là:
CREATE OR REPLACE PROCEDURE proc_audit_manager AS BEGIN DBMS_FGA.ADD_POLICY ( object_schema=>'ADMINDB', object_name=>'DEPARTMENTS', policy_name=>'proc_audit_manager', audit_column=>'ID_MANAGER', enable=>false, statement_types=>'UPDATE', handler_module=>'proc_audit_alert' ); DBMS_FGA.ENABLE_POLICY ( object_schema=>'ADMINDB', object_name=>'DEPARTMENTS', policy_name=>'proc_audit_manager'); END;
Lưu ý rằng object_schema, object_name, policy_name, Audit_column, statement_types và handler_module phải được điều chỉnh cho phù hợp với chính sách bạn muốn viết.
Sau đó, chúng tôi thực hiện thủ tục:
EXECUTE proc_audit_manager;
Chúng tôi có thể xác minh xem chính sách có được bật không:
SELECT ENABLED, POLICY_NAME FROM ALL_AUDIT_POLICIES WHERE OBJECT_NAME='DEPARTMENTS';
Sau đó, xác minh xem quy trình và chính sách có hoạt động chính xác hay không bằng cách thực hiện cập nhật:
UPDATE DEPARTMENTS SET ID_MANAGER=2 WHERE ID_DEPARTAMENT=1;
Tóm lại, việc kiểm tra là cần thiết đối với từng cơ sở dữ liệu và các phương pháp được cung cấp ở trên giúp bạn tìm ra hoạt động đáng ngờ có thể ảnh hưởng đến bảo mật cơ sở dữ liệu của bạn. Để biết thêm chi tiết về kiểm tra cơ sở dữ liệu Oracle, hãy xem thư mục dưới đây.
Thư mục:
- http://www.datadisk.co.uk/html_docs/oracle/auditing.htm
- http://docs.oracle.com/cd/B10501_01/server.920/a96521/audit.htm
- https://docs.oracle.com/cd/E11882_01/server.112/e10575/tdpsg_auditing.htm#TDPSG50000