Kiểm toán trong lĩnh vực công nghệ thông tin (CNTT) là quá trình kiểm tra cơ sở hạ tầng CNTT của tổ chức để đảm bảo tuân thủ các yêu cầu do các tiêu chuẩn được công nhận hoặc các chính sách đã thiết lập. Các quy tắc bảo vệ dữ liệu, chẳng hạn như quy định GDPR mới, ngày càng trở nên nghiêm ngặt để bảo vệ dữ liệu người dùng, vì vậy, điều quan trọng là các hoạt động kiểm tra cơ sở dữ liệu của bạn phải được thiết lập đúng cách để đảm bảo cả ứng dụng và dữ liệu người dùng của bạn đều được bảo mật khỏi các lỗ hổng bảo mật. Trong bài đăng trên blog này, chúng ta sẽ thảo luận về pgAudit - một công cụ tạo nhật ký kiểm tra cần thiết để tạo điều kiện thuận lợi cho việc kiểm tra PostgreSQL.
pgAudit là gì?
Phần mở rộng Kiểm tra PostgreSQL, pgAudit, là một phần mở rộng mã nguồn mở ghi lại các sự kiện trong cơ sở dữ liệu PostgreSQL trong một nhật ký kiểm tra chi tiết. Nó sử dụng cơ sở ghi nhật ký PostgreSQL gốc, vì vậy các nhật ký kiểm tra sẽ là một phần của nhật ký PostgreSQL. Phần mở rộng dựa trên dự án pgAudit 2ndQuadrant do Simon Riggs, Abhijit Menon-Sen và Ian Barwick, và bao gồm các cải tiến của David Steele từ Crunchy Data.
Tại sao pgAudit hơn log_statement =all?
Chúng ta có thể ghi lại tất cả các câu lệnh trong PostgreSQL chỉ bằng cách đặt log_statement=all
. Vậy tại sao lại sử dụng pgAudit? Ghi nhật ký câu lệnh cơ bản (sử dụng log_statement
) sẽ chỉ liệt kê các hoạt động được thực hiện đối với cơ sở dữ liệu. Nó sẽ không cung cấp khả năng lọc các hoạt động và nhật ký sẽ không ở định dạng thích hợp cần thiết để kiểm tra. pgAudit cũng cung cấp tính chi tiết để ghi nhật ký các lớp câu lệnh cụ thể như READ
(SELECT
và COPY
), WRITE
(INSERT
, UPDATE
, DELETE
, v.v.), DDL
v.v ... Hơn nữa, nó cung cấp kiểm tra mức đối tượng, nơi chỉ các hoạt động trên các quan hệ cụ thể mới được ghi lại.
Một ưu điểm khác của pgAudit so với ghi nhật ký câu lệnh cơ bản là nó cung cấp thông tin chi tiết về hoạt động được thực hiện thay vì chỉ ghi lại hoạt động được yêu cầu. Ví dụ:hãy xem xét việc thực thi khối mã ẩn danh bằng câu lệnh DO.
DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
Việc ghi nhật ký câu lệnh cơ bản sẽ dẫn đến:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: statement: DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
pgAudit sẽ ghi lại hoạt động tương tự như:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;",<not logged> 2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>
Phần trên chỉ rõ chức năng pgAudit ghi lại hoạt động và nội bộ của nó với đầu ra có cấu trúc giúp giảm bớt tìm kiếm.
Cách kiểm tra PostgreSQL bằng pgAuditClick To TweetCách cài đặt pgAudit?
pgAudit là một tiện ích mở rộng có sẵn để tải xuống từ kho lưu trữ PostgreSQL hoặc có thể được biên dịch và xây dựng từ nguồn. Bước đầu tiên, gói cần được tải xuống và cài đặt trên máy chạy PostgreSQL (gói mở rộng này được cài đặt sẵn trên tất cả các triển khai ScaleGrid PostgreSQL).
Sau khi cài đặt, nó cần được tải vào PostgreSQL. Điều này đạt được bằng cách thêm pgaudit
tới shared_preload_libraries
tham số cấu hình. Cần phải khởi động lại PostgreSQL để thay đổi cấu hình này có hiệu lực. Bước tiếp theo là bật tiện ích mở rộng trên cơ sở dữ liệu bằng cách chạy CREATE EXTENSION pgaudit
.
Bây giờ tiện ích mở rộng đã sẵn sàng, chúng ta cần đảm bảo thiết lập các thông số cấu hình để tiện ích mở rộng bắt đầu ghi nhật ký. Điều này có thể đơn giản như cài đặt tham số pgaudit.log
thành giá trị all
và pgAudit sẽ bắt đầu đăng nhập session
chế độ.
Bây giờ chúng ta đã biết cách cài đặt và bật pgAudit, hãy thảo luận về hai chế độ ghi nhật ký kiểm tra mà nó cung cấp, phiên và đối tượng.
Ghi nhật ký kiểm tra phiên
Ở chế độ phiên, pgAudit sẽ ghi lại tất cả các thao tác do người dùng thực hiện. Đặt pgaudit.log
tham số cho bất kỳ giá trị nào đã xác định, ngoại trừ NONE
, sẽ cho phép ghi nhật ký kiểm tra phiên. pgaudit.log
tham số chỉ định các lớp của câu lệnh sẽ được ghi trong chế độ phiên. Các giá trị có thể là:READ
, WRITE
, FUNCTION
, ROLE
, DDL
, MISC
, MISC_SET
, ALL
và NONE
.
Đặt pgaudit.log
tham số thành ALL
sẽ ghi lại tất cả các câu lệnh. Tham số có thể chấp nhận nhiều lớp bằng cách sử dụng danh sách được phân tách bằng dấu phẩy và các lớp cụ thể có thể được loại trừ bằng dấu -. Ví dụ:nếu bạn muốn ghi lại tất cả các câu lệnh ngoại trừ MISC
lớp, giá trị của pgaudit.log
sẽ là ALL, -MISC, -MISC_SET
. Bạn cũng có thể bật pgAudit để tạo một mục nhật ký riêng cho từng tham chiếu quan hệ trong một câu lệnh bằng cách đặt pgaudit.log_relation
tiếp tục.
Hãy xem xét một ví dụ về cách tạo bảng. Câu lệnh SQL sẽ là:
CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));
Các mục nhật ký kiểm tra tương ứng là:
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
Ghi nhật ký kiểm tra đối tượng
Trong các trường hợp cụ thể, có thể chỉ được yêu cầu kiểm tra một nhóm quan hệ cụ thể. Trong những trường hợp như vậy, việc sử dụng chế độ phiên sẽ chỉ dẫn đến một số lượng lớn các bản ghi kiểm tra không tương ứng với các quan hệ bắt buộc một cách không cần thiết. Chế độ đối tượng đặc biệt phù hợp cho mục đích này và chỉ có thể kiểm tra một nhóm quan hệ cụ thể.
Ghi nhật ký kiểm tra đối tượng được thực hiện bằng cách sử dụng các vai trò PostgreSQL. Một vai trò có thể được tạo và gán quyền chỉ truy cập vào một nhóm quan hệ cụ thể. Vai trò này phải được chỉ định trong tham số cấu hình pgaudit.role
. Chế độ đối tượng chỉ hỗ trợ SELECT
, INSERT
, UPDATE
và DELETE
các câu lệnh. Các lớp câu lệnh được ghi lại phụ thuộc vào các quyền được cấp cho vai trò. Ví dụ:nếu vai trò chỉ có quyền thực hiện SELECT
, sau đó chỉ SELECT
các câu lệnh sẽ được ghi lại.
Dưới đây là ví dụ về ghi nhật ký kiểm tra đối tượng:
Tạo vai trò và chỉ cấp cho SELECT
quyền. Đặt pgaudit.role
với vai trò đó và chạy SELECT
Câu lệnh SQL:
CREATE ROLE audit_person; GRANT SELECT ON persons TO audit_person; SET pgaudit.role = 'audit_person'; SELECT * FROM persons WHERE ID=404;
Câu lệnh select ở trên sẽ được ghi lại là:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
|
Cách diễn giải mục nhập nhật ký kiểm tra?
Cho đến nay, chúng tôi đã cung cấp chi tiết về giao diện của mục nhập nhật ký kiểm tra, bây giờ chúng ta hãy xem định dạng mục nhập nhật ký kiểm tra. Mỗi mục nhập bắt đầu bằng log_line_prefix được đề cập cho ghi nhật ký PostgreSQL, sau đó phần còn lại của đầu ra sẽ ở định dạng CSV. Hãy xem xét mục nhập nhật ký kiểm tra đơn giản sau:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
Trong mục nhập ở trên, giá trị
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]:
là từ định dạng log_line_prefix %t:%r:%u@%d:[%p]:
. Nội dung mục kiểm toán bắt đầu từ LOG: AUDIT:
và nó tuân theo định dạng CSV. Định dạng giá trị có dạng:
AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER
Chúng ta hãy xem xét từng trường một:
Trường | Mô tả | Giá trị từ mục nhập kiểm tra mẫu |
---|---|---|
AUDIT_TYPE | Cho biết chế độ kiểm tra:SESSION hoặc OBJECT | ĐỐI TƯỢNG |
STATEMENT_ID | Mã định danh câu lệnh duy nhất cho mỗi phiên | 10 |
SUBSTATEMENT_ID | Mã định danh cho mỗi câu lệnh phụ trong câu lệnh chính | 1 |
LỚP | Cho biết lớp các câu lệnh như READ, WRITE, v.v. là các giá trị được xác định cho tham số pgaudit.log. | ĐỌC |
COMMAND | Lệnh được sử dụng trong câu lệnh SQL | CHỌN |
OBJECT_TYPE | Có thể là TABLE, INDEX, VIEW, v.v. | BẢNG |
OBJECT_NAME | Tên đối tượng đủ điều kiện | public.persons |
BÁO CÁO | Câu lệnh thực được thực thi | chọn * từ những người có ID =404; |
THÔNG SỐ | Khi pgaudit.log_parameter được đặt thành true, CSV được trích dẫn của các tham số sẽ được liệt kê nếu có hoặc “không” nếu không có tham số. Khi pgaudit.log_parameter không được đặt, giá trị sẽ là “ | |
Suy luận
pgAudit, với tất cả khả năng của mình, đơn giản hóa quá trình đánh giá bằng cách tạo nhật ký quá trình đánh giá. Mặc dù có một số lưu ý, chẳng hạn như ghi nhật ký các đối tượng đã đổi tên dưới cùng một tên, nó vẫn là một công cụ mạnh mẽ cung cấp các chức năng cần thiết. Tuy nhiên, thông tin đánh giá được viết trong nhật ký có thể không chỉ lý tưởng cho quá trình đánh giá - quá trình đánh giá thậm chí còn tốt hơn khi những nhật ký đó có thể được chuyển đổi thành lược đồ cơ sở dữ liệu và dữ liệu đánh giá có thể được tải vào cơ sở dữ liệu để bạn có thể dễ dàng truy vấn thông tin. Đây là nơi mà Trình phân tích nhật ký kiểm tra PostgreSQL (pgAudit Analyze) rất hữu ích. Để biết thêm thông tin, hãy tham khảo các trang github của pgAudit và pgAudit Analyze.