PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách kiểm tra cơ sở dữ liệu PostgreSQL

Kiểm toán là một cách tốt để giữ cho dữ liệu của bạn an toàn nhất có thể và để biết điều gì đang xảy ra trong cơ sở dữ liệu của bạn. Nó cũng được yêu cầu đối với nhiều quy định hoặc tiêu chuẩn bảo mật, như PCI - Ngành thẻ thanh toán. Đây không phải là một ngoại lệ cho cơ sở dữ liệu PostgreSQL của bạn.

PostgreSQL đã gây được tiếng vang lớn nhờ kiến ​​trúc đã được chứng minh, độ tin cậy, tính toàn vẹn của dữ liệu, bộ tính năng mạnh mẽ, khả năng mở rộng và sự cống hiến của cộng đồng nguồn mở đằng sau phần mềm để liên tục cung cấp các giải pháp hiệu quả và sáng tạo.

Như đã nói, nó phải là một tùy chọn để kiểm tra cơ sở dữ liệu PostgreSQL, phải không? Vâng, câu trả lời là có. Trong blog này, chúng ta sẽ xem tiện ích mở rộng pgAudit là gì và cách cài đặt và sử dụng nó trong cơ sở dữ liệu PostgreSQL của bạn.

pgAudit là gì?

Phần mở rộng Kiểm tra PostgreSQL (pgAudit) cung cấp ghi nhật ký kiểm tra phiên và đối tượng chi tiết thông qua cơ sở ghi nhật ký PostgreSQL tiêu chuẩn.

Cơ sở ghi nhật ký tiêu chuẩn có thể cung cấp ghi nhật ký câu lệnh cơ bản với log_statement =all. Điều này có thể chấp nhận được đối với hoạt động giám sát và các cách sử dụng cơ bản khác nhưng không cung cấp mức độ chi tiết thường được yêu cầu để đánh giá. Không đủ để có một danh sách tất cả các hoạt động được thực hiện đối với cơ sở dữ liệu. Cũng phải có khả năng tìm thấy các báo cáo cụ thể mà kiểm toán viên quan tâm. Cơ sở ghi nhật ký tiêu chuẩn hiển thị những gì người dùng yêu cầu, trong khi pgAudit tập trung vào chi tiết về những gì đã xảy ra trong khi cơ sở dữ liệu đáp ứng yêu cầu.

Cách cài đặt pgAudit trên PostgreSQL

Đối với ví dụ này, chúng tôi sẽ sử dụng cài đặt CentOS 7. Tại thời điểm này, chúng tôi cho rằng bạn đã cài đặt cơ sở dữ liệu PostgreSQL của mình, nếu không, bạn có thể theo dõi bài đăng trên blog này để thiết lập và chạy nó một cách dễ dàng bằng cách sử dụng ClusterControl.

Bây giờ, bạn sẽ có kho lưu trữ PostgreSQL trong hệ điều hành của mình, giống như sau:

$ cat /etc/yum.repos.d/postgresql.repo

# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions

[pgdg-common]

name=PostgreSQL common for RHEL/CentOS $releasever - $basearch

baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

# PGDG Red Hat Enterprise Linux / CentOS stable repositories:

[pgdg]

name=PostgreSQL 12 $releasever - $basearch

#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch

baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/

enabled=1

gpgcheck=0

[pgdg-source]

name=PostgreSQL 12 $releasever - $basearch - Source

baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch

enabled=0

gpgcheck=0

Nếu bạn kiểm tra các gói pgaudit có sẵn, bạn nên có:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Vậy, hãy cài đặt nó:

$ yum install pgaudit14_12

Bây giờ, bạn sẽ cần thêm nó vào tệp cấu hình postgresql.conf, được đặt theo mặc định trong /var/lib/pgsql/12/data/postgresql.conf và khởi động lại dịch vụ PostgreSQL để áp dụng sự thay đổi.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Sau khi khởi động lại dịch vụ cơ sở dữ liệu, bạn cần tạo phần mở rộng:

postgres=# CREATE EXTENSION pgaudit;

CREATE EXTENSION

And now, you can run the following query to check the new extension created:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Cấu hình pgAudit

Bạn có thể xác minh cấu hình hiện tại bằng cách chạy truy vấn sau:

postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';

            name            | setting

----------------------------+---------

 pgaudit.log                | none

 pgaudit.log_catalog        | on

 pgaudit.log_client         | off

 pgaudit.log_level          | log

 pgaudit.log_parameter      | off

 pgaudit.log_relation       | off

 pgaudit.log_statement_once | off

 pgaudit.role               |

(8 rows)

Hãy xem từng thông số này.

  • pgaudit.log :Chỉ định các lớp câu lệnh nào sẽ được ghi lại bằng ghi nhật ký kiểm tra phiên. Mặc định là không có. Giá trị có thể là:
    • ĐỌC:CHỌN và SAO CHÉP khi nguồn là một quan hệ hoặc một truy vấn.
    • VIẾT:CHÈN, CẬP NHẬT, XÓA, TRUNCATE và SAO CHÉP khi đích là một quan hệ.
    • FUNCTION:Lệnh gọi hàm và khối DO.
    • VAI TRÒ:Các câu lệnh liên quan đến vai trò và đặc quyền:GRANT, REVOKE, CREATE / ALTER / DROP ROLE.
    • DDL:Tất cả DDL không có trong lớp ROLE.
    • MISC:Các lệnh khác, ví dụ:TIẾT KIỆM, TÌM HIỂU, KIỂM TRA, VACUUM, ĐẶT.
    • MISC_SET:Các lệnh SET khác, ví dụ:ĐẶT VAI TRÒ.
    • TẤT CẢ:Bao gồm tất cả những điều trên.
  • pgaudit.log_catalog :Chỉ định rằng ghi nhật ký phiên sẽ được bật trong trường hợp tất cả các quan hệ trong một câu lệnh đều nằm trong pg_catalog. Việc tắt cài đặt này sẽ giảm nhiễu trong nhật ký từ các công cụ như psql và PgAdmin truy vấn danh mục nhiều. Mặc định đang bật.
  • pgaudit.log_client :Chỉ định liệu thông báo nhật ký có được hiển thị cho một quy trình khách hàng chẳng hạn như psql hay không. Cài đặt này thường bị tắt nhưng có thể hữu ích cho việc gỡ lỗi hoặc các mục đích khác. Mặc định bị tắt.
  • pgaudit.log_level :Chỉ định mức nhật ký sẽ được sử dụng cho các mục nhập nhật ký. Cài đặt này được sử dụng để kiểm tra hồi quy và cũng có thể hữu ích cho người dùng cuối để kiểm tra hoặc các mục đích khác. Mặc định là nhật ký.
  • pgaudit.log_parameter :Chỉ định rằng ghi nhật ký kiểm tra phải bao gồm các tham số đã được chuyển với câu lệnh. Khi các tham số hiện diện, chúng sẽ được đưa vào định dạng CSV sau văn bản câu lệnh. Mặc định bị tắt.
  • pgaudit.log_relation :Chỉ định liệu việc ghi nhật ký kiểm tra phiên có nên tạo mục nhập nhật ký riêng biệt cho mỗi quan hệ (BẢNG, XEM, v.v.) được tham chiếu trong một câu lệnh SELECT hoặc DML hay không. Đây là một phím tắt hữu ích để ghi nhật ký toàn diện mà không cần sử dụng ghi nhật ký kiểm tra đối tượng. Mặc định bị tắt.
  • pgaudit.log_statement_once :Chỉ định liệu việc ghi nhật ký sẽ bao gồm văn bản câu lệnh và các tham số với mục nhập nhật ký đầu tiên cho một tổ hợp câu lệnh / câu lệnh con hoặc với mọi mục nhập. Việc tắt cài đặt này sẽ dẫn đến việc ghi ít chi tiết hơn nhưng có thể gây khó khăn hơn trong việc xác định câu lệnh đã tạo mục nhập nhật ký, mặc dù cặp câu lệnh / câu lệnh con cùng với id quy trình đủ để xác định văn bản câu lệnh được ghi bằng mục nhập trước đó. Mặc định bị tắt.
  • pgaudit.role :Chỉ định vai trò chính để sử dụng cho việc ghi nhật ký kiểm tra đối tượng. Nhiều vai trò đánh giá có thể được xác định bằng cách cấp chúng cho vai trò chính. Điều này cho phép nhiều nhóm phụ trách các khía cạnh khác nhau của việc ghi nhật ký đánh giá. Không có mặc định.

pgAudit Sử dụng

Bây giờ chúng ta đã xem xét các thông số cấu hình, hãy xem ví dụ về cách sử dụng nó trong thế giới thực.

Để kiểm tra tất cả các truy vấn đọc, ghi và DDL, hãy chạy:

test1=# set pgaudit.log = 'read,write,ddl';

SET

Và sau đó, chạy các câu sau:

test1=# CREATE TABLE table1 (id int, name text);

CREATE TABLE

test1=# INSERT INTO table1 (id, name) values (1, 'name1');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (2, 'name2');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (3, 'name3');

INSERT 0 1

test1=# SELECT * FROM table1;

 id | name

----+-------

  1 | name1

  2 | name2

  3 | name3

(3 rows)

Nếu bạn kiểm tra tệp nhật ký PostgreSQL, bạn sẽ thấy điều này:

2020-11-20 19:17:13.848 UTC [25142] LOG:  AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>

2020-11-20 19:18:45.334 UTC [25142] LOG:  AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>

2020-11-20 19:18:52.332 UTC [25142] LOG:  AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>

2020-11-20 19:18:58.103 UTC [25142] LOG:  AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>

2020-11-20 19:19:07.261 UTC [25142] LOG:  AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>

Tất nhiên, đây là một ví dụ cơ bản. Bạn có thể sử dụng các thông số cấu hình được mô tả trong phần trước để phù hợp với doanh nghiệp của mình.

Bật pgAudit với ClusterControl

Thay vì cài đặt và bật pgAudit theo cách thủ công, một tùy chọn khác là sử dụng ClusterControl CLI để thực hiện công việc cho bạn. Đối với điều này, bạn có thể chạy lệnh sau từ máy chủ ClusterControl của mình:

$ s9s cluster --setup-audit-logging --cluster-id=ID

Trong đó ID là id cụm PostgreSQL.

Trong khi nó đang chạy, bạn có thể theo dõi trạng thái bằng cách kiểm tra công việc ClusterControl. Đầu tiên, bạn sẽ cần id công việc mà bạn có thể lấy từ danh sách công việc:

$ s9s job --list

163  18 RUNNING  test_dba                     admins 19:41:45            90% Setup Audit Logging

Bây giờ, hãy kiểm tra chi tiết công việc:

$ s9s job --log --job-id=163

Using SSH credentials from cluster.

Cluster ID is 18.

The username is 'root'.

10.10.10.129:5432: Configuring audit logging.

10.10.10.129:5432: Installing 'pgaudit14_12'.

10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.

Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.

10.10.10.129:5432: Restarting PostgreSQL node.

10.10.10.129: waiting for server to shut down.... done

server stopped

waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG:  pgaudit extension initialized

2020-11-20 19:41:52.069 UTC [25137] LOG:  starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv6 address "::", port 5432

2020-11-20 19:41:52.080 UTC [25137] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2020-11-20 19:41:52.102 UTC [25137] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"

2020-11-20 19:41:52.130 UTC [25137] LOG:  redirecting log output to logging collector process

2020-11-20 19:41:52.130 UTC [25137] HINT:  Future log output will appear in directory "log".

 done

server started

10.10.10.129:5432: Waiting for node to be accessible.

10.10.10.129:5432: pgaudit 1.4.1 is enabled.

Hành động này sẽ yêu cầu khởi động lại dịch vụ cơ sở dữ liệu sẽ được thực hiện bởi ClusterControl trong cùng một tác vụ. Sau khi khởi động lại, tiện ích mở rộng pgAudit được bật và sẵn sàng sử dụng:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Thế là xong! Giờ đây, bạn có thể định cấu hình và sử dụng pgAudit theo cách giống như cách mà chúng tôi đã trình bày trước đây.

Kết luận

Kiểm tra là bắt buộc đối với nhiều quy định bảo mật và nó cũng rất hữu ích nếu bạn muốn biết điều gì đã xảy ra trong cơ sở dữ liệu của mình, khi nào và ai chịu trách nhiệm về điều đó.

Trong blog này, chúng tôi đã nói về tiện ích mở rộng pgAudit PostgreSQL như một cách tốt để kiểm tra cơ sở dữ liệu PostgreSQL của bạn và chúng tôi cũng chỉ cho bạn cách triển khai thủ công và sử dụng ClusterControl CLI.

Hãy nhớ rằng, tùy thuộc vào cấu hình, pgAudit có thể tạo ra một lượng lớn dữ liệu. Vì vậy, bạn nên cẩn thận xác định những gì bạn cần kiểm tra và trong thời gian bao lâu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách đóng lỗ hổng bảo mật trong PostgreSQL

  2. Nhận n danh mục được nhóm lại và tổng hợp các danh mục khác thành một

  3. Có cách nào để tắt cập nhật / xóa nhưng vẫn cho phép trình kích hoạt thực hiện chúng không?

  4. Cách kiểm tra phiên bản PostgreSQL của bạn

  5. Cách hoạt động của hàm timezone () trong PostgreSQL