Khi bạn đã hoàn tất quá trình cài đặt máy chủ cơ sở dữ liệu PostgreSQL của mình, bạn cần phải bảo vệ nó trước khi đi vào sản xuất. Trong bài đăng này, chúng tôi sẽ chỉ cho bạn cách tăng cường bảo mật xung quanh cơ sở dữ liệu của bạn để giữ cho dữ liệu của bạn an toàn và bảo mật.
1. Kiểm soát xác thực ứng dụng khách
Khi cài đặt PostgreSQL, một tệp có tên pg_hba.conf được tạo trong thư mục dữ liệu của cụm cơ sở dữ liệu. Tệp này kiểm soát xác thực ứng dụng khách.
Từ tài liệu postgresql chính thức, chúng ta có thể xác định tệp pg_hba.conf dưới dạng một tập hợp các bản ghi, một bản ghi trên mỗi dòng, trong đó mỗi bản ghi chỉ định kiểu kết nối, dải địa chỉ IP của ứng dụng khách (nếu có liên quan đến kiểu kết nối), tên cơ sở dữ liệu, tên người dùng và phương thức xác thực được sử dụng cho các kết nối phù hợp với các tham số này. Bản ghi đầu tiên có loại kết nối phù hợp, địa chỉ máy khách, cơ sở dữ liệu được yêu cầu và tên người dùng được sử dụng để thực hiện xác thực.
Vì vậy, định dạng chung sẽ giống như sau:
# TYPE DATABASE USER ADDRESS METHOD
Ví dụ về cấu hình có thể như sau:
# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.93.0/24 ident
# Reject any user from any host with IP address 192.168.94.x to connect
# to database "postgres
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.94.0/24 reject
Có rất nhiều cách kết hợp bạn có thể thực hiện để tinh chỉnh các quy tắc (tài liệu chính thức mô tả chi tiết từng tùy chọn và có một số ví dụ tuyệt vời), nhưng hãy nhớ tránh các quy tắc quá dễ dãi, chẳng hạn như cho phép truy cập các dòng sử dụng DATABASE all hoặc ADDRESS 0.0.0.0/0.
Để đảm bảo tính bảo mật, ngay cả khi bạn quên thêm quy tắc, bạn có thể thêm hàng sau ở dưới cùng:
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 reject
Vì tệp được đọc từ trên xuống dưới để tìm các quy tắc phù hợp, theo cách này, bạn đảm bảo rằng để được phép, bạn sẽ cần thêm quy tắc phù hợp ở trên một cách rõ ràng.
2. Cấu hình máy chủ
Có một số tham số trên postgresql.conf mà chúng tôi có thể sửa đổi để tăng cường bảo mật.
Bạn có thể sử dụng tham số nghe_address để kiểm soát ips nào sẽ được phép kết nối với máy chủ. Đây là một phương pháp hay để chỉ cho phép các kết nối từ các ips đã biết hoặc mạng của bạn và tránh các giá trị chung chung như “*”, ”0.0.0.0:0” hoặc “::”, điều này sẽ yêu cầu PostgreSQL chấp nhận kết nối từ bất kỳ IP nào.
Thay đổi cổng mà postgresql sẽ lắng nghe (theo mặc định là 5432) cũng là một tùy chọn. Bạn có thể thực hiện việc này bằng cách sửa đổi giá trị của tham số cổng.
Các tham số như work_mem, Maint_work_mem, temp_buffer, max_prepared_transactions, temp_file_limit rất quan trọng cần ghi nhớ trong trường hợp bạn bị tấn công từ chối dịch vụ. Đây là các tham số câu lệnh / phiên có thể được đặt ở các cấp độ khác nhau (db, người dùng, phiên), vì vậy việc quản lý các thông số này một cách khôn ngoan có thể giúp chúng tôi giảm thiểu tác động của cuộc tấn công.
3. Quản lý Người dùng và Vai trò
Quy tắc vàng về bảo mật liên quan đến quản lý người dùng là cấp cho người dùng số lượng quyền truy cập tối thiểu mà họ cần.
Quản lý điều này không phải lúc nào cũng dễ dàng và nó có thể trở nên thực sự lộn xộn nếu không được thực hiện tốt ngay từ đầu.
Một cách tốt để giữ các đặc quyền trong tầm kiểm soát là sử dụng vai trò, nhóm, chiến lược người dùng.
Trong postgresql, mọi thứ đều được coi là một vai trò, nhưng chúng tôi sẽ thực hiện một số thay đổi đối với điều này.
Trong chiến lược này, bạn sẽ tạo ba loại hoặc vai trò khác nhau:
- role role (được xác định bằng tiền tố r_)
- vai trò nhóm (được xác định bằng tiền tố g_)
- vai trò người dùng (thường là tên cá nhân hoặc tên ứng dụng)
Các vai trò (r_ role) sẽ là những người có đặc quyền đối với các đối tượng. Các vai trò nhóm (vai trò g_) sẽ được cấp cho các vai trò r_, vì vậy chúng sẽ là một tập hợp các vai trò r_. Và cuối cùng, vai trò người dùng sẽ được cấp một hoặc nhiều vai trò nhóm và sẽ là những người có đặc quyền đăng nhập.
Hãy đưa ra một ví dụ về điều này. Chúng tôi sẽ tạo một nhóm chỉ đọc cho example_schema và sau đó cấp nó cho người dùng:
Chúng tôi tạo vai trò chỉ đọc và cấp đặc quyền đối tượng cho nó
CREATE ROLE r_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT USAGE ON SCHEMA example to r_example_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA example to r_example_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA example GRANT SELECT ON TABLES TO r_example_ro;
Chúng tôi tạo nhóm chỉ đọc và cấp vai trò cho nhóm đó
CREATE ROLE g_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION';
GRANT r_example_ro to g_example_ro;
Chúng tôi tạo vai trò app_user và làm cho nó "tham gia" vào nhóm chỉ đọc
CREATE ROLE app_user WITH LOGIN ;
ALTER ROLE app_user WITH PASSWORD 'somePassword' ;
ALTER ROLE app_user VALID UNTIL 'infinity' ;
GRANT g_example_ro TO app_user;
Sử dụng phương pháp này, bạn có thể quản lý mức độ chi tiết của các đặc quyền và bạn có thể dễ dàng cấp và thu hồi các nhóm quyền truy cập cho người dùng. Hãy nhớ chỉ cấp đặc quyền đối tượng cho các vai trò thay vì cấp trực tiếp cho người dùng và chỉ cấp đặc quyền đăng nhập cho người dùng.
Đây là một phương pháp hay để thu hồi rõ ràng các đặc quyền công khai trên các đối tượng, chẳng hạn như thu hồi quyền truy cập công khai vào một cơ sở dữ liệu cụ thể và chỉ cấp nó thông qua một vai trò.
REVOKE CONNECT ON my_database FROM PUBLIC;
GRANT CONNECT ON my_database TO r_example_ro;
Hạn chế quyền truy cập SUPERUSER, chỉ cho phép các kết nối superuser từ localhost / miền unix.
Sử dụng những người dùng cụ thể cho các mục đích khác nhau, như người dùng ứng dụng cụ thể hoặc người dùng sao lưu và chỉ giới hạn kết nối cho người dùng đó từ các ips bắt buộc.
4. Quản lý người dùng cấp cao
Duy trì chính sách mật khẩu mạnh là điều bắt buộc để giữ cho cơ sở dữ liệu của bạn an toàn và tránh bị hack mật khẩu. Đối với một chính sách mạnh mẽ, hãy ưu tiên sử dụng các ký tự đặc biệt, số, ký tự viết hoa và viết thường và có ít nhất 10 ký tự.
Ngoài ra còn có các công cụ xác thực bên ngoài, như LDAP hoặc PAM, có thể giúp bạn đảm bảo chính sách sử dụng lại và hết hạn mật khẩu của mình, đồng thời xử lý việc khóa tài khoản do lỗi xác thực.
5. Mã hóa dữ liệu (trên kết nối ssl)
PostgreSQL có hỗ trợ riêng cho việc sử dụng kết nối SSL để mã hóa giao tiếp máy khách / máy chủ nhằm tăng cường bảo mật. SSL (Lớp cổng bảo mật) là công nghệ bảo mật tiêu chuẩn để thiết lập liên kết được mã hóa giữa máy chủ web và trình duyệt. Liên kết này đảm bảo rằng tất cả dữ liệu được truyền giữa máy chủ web và trình duyệt vẫn riêng tư và không thể tách rời.
Vì các ứng dụng khách postgresql gửi truy vấn ở dạng văn bản thuần túy và dữ liệu cũng được gửi không được mã hóa, nên nó rất dễ bị giả mạo mạng.
Bạn có thể bật SSL bằng cách đặt thông số ssl thành bật trong postgresql.conf.
Máy chủ sẽ lắng nghe cả kết nối thông thường và SSL trên cùng một cổng TCP và sẽ thương lượng với bất kỳ máy khách kết nối nào về việc có sử dụng SSL hay không. Theo mặc định, đây là tùy chọn của khách hàng, nhưng bạn có tùy chọn thiết lập máy chủ để yêu cầu sử dụng SSL cho một số hoặc tất cả các kết nối bằng cách sử dụng tệp cấu hình pg_hba được mô tả ở trên.
6. Mã hóa dữ liệu lúc còn lại (pg_crypto)
Có hai loại mã hóa cơ bản, một chiều và hai chiều. Theo một cách nào đó, bạn không bao giờ quan tâm đến việc giải mã dữ liệu thành dạng có thể đọc được, mà bạn chỉ muốn xác minh rằng người dùng biết văn bản bí mật cơ bản là gì. Điều này thường được sử dụng cho mật khẩu. Trong mã hóa theo hai cách, bạn muốn khả năng mã hóa dữ liệu cũng như cho phép người dùng được ủy quyền giải mã nó thành một dạng có ý nghĩa. Dữ liệu như thẻ tín dụng và SSN sẽ thuộc danh mục này.
Đối với mã hóa một chiều, hàm mật mã được đóng gói trong pgcrypto cung cấp mức độ bảo mật bổ sung cao hơn cách md5. Lý do là với md5, bạn có thể biết ai có cùng mật khẩu vì không có muối nào (Trong mật mã, muối là dữ liệu ngẫu nhiên được sử dụng làm đầu vào bổ sung cho hàm một chiều "băm" dữ liệu, mật khẩu. hoặc cụm mật khẩu), vì vậy tất cả những người có cùng mật khẩu sẽ có cùng một chuỗi md5 được mã hóa. Với crypt, chúng sẽ khác.
Đối với dữ liệu mà bạn quan tâm đến việc truy xuất, bạn không muốn biết liệu hai phần thông tin có giống nhau hay không, nhưng bạn không biết thông tin đó và bạn muốn chỉ những người dùng được ủy quyền mới có thể truy xuất nó. Pgcrypto cung cấp một số cách để thực hiện điều này, vì vậy để đọc thêm về cách sử dụng nó, bạn có thể kiểm tra tài liệu postgresql của bộ tư pháp trên https://www.postgresql.org/docs/current/static/pgcrypto.html.
7. Ghi nhật ký
Postgresql cung cấp nhiều thông số cấu hình để kiểm soát cái gì, khi nào và ở đâu để ghi nhật ký.
Bạn có thể bật kết nối / ngắt kết nối phiên, truy vấn chạy dài, kích thước tệp tạm thời, v.v. Điều này có thể giúp bạn hiểu rõ hơn về khối lượng công việc của mình để xác định những hành vi kỳ quặc. Bạn có thể nhận được tất cả các tùy chọn để đăng nhập trên liên kết sau https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html
Để biết thêm thông tin chi tiết về khối lượng công việc của mình, bạn có thể kích hoạt mô-đun pg_stat_statements, mô-đun này cung cấp phương tiện để theo dõi thống kê thực thi của tất cả các câu lệnh SQL được thực thi bởi máy chủ. Có một số công cụ bảo mật có thể nhập dữ liệu từ bảng này và sẽ tạo danh sách trắng sql, để giúp bạn xác định các truy vấn không tuân theo các mẫu mong đợi.
Để biết thêm thông tin, https://www.postgresql.org/docs/9.6/static/pgstatstatements.html.
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức8. Kiểm toán
Phần mở rộng Kiểm tra PostgreSQL (pgAudit) cung cấp ghi nhật ký kiểm tra phiên và / hoặc đối tượng chi tiết thông qua cơ sở ghi nhật ký PostgreSQL tiêu chuẩn.
Việc ghi nhật ký câu lệnh cơ bản có thể được cung cấp bởi cơ sở ghi nhật ký tiêu chuẩn với log_statement =all. Điều này có thể chấp nhận được đối với việc giám sát và các cách sử dụng khác nhưng không cung cấp mức độ chi tiết thường được yêu cầu cho một cuộc đá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.
9. Bản vá
Kiểm tra trang thông tin bảo mật của PostgreSQL thường xuyên và thường xuyên để biết các bản cập nhật và bản vá bảo mật quan trọng.
Hãy nhớ rằng lỗi bảo mật hệ điều hành hoặc thư viện cũng có thể dẫn đến rò rỉ cơ sở dữ liệu, vì vậy hãy đảm bảo bạn luôn cập nhật bản vá cho những lỗi này.
ClusterControl cung cấp một báo cáo hoạt động cung cấp cho bạn thông tin này và sẽ thực hiện các bản vá và nâng cấp cho bạn.
10. Bảo mật cấp độ hàng
Ngoài hệ thống đặc quyền chuẩn SQL có sẵn thông qua GRANT, các bảng có thể có các chính sách bảo mật hàng hạn chế, trên cơ sở mỗi người dùng, các hàng có thể được trả về bằng truy vấn thông thường hoặc được chèn, cập nhật hoặc xóa bằng lệnh sửa đổi dữ liệu. Tính năng này còn được gọi là Bảo mật cấp hàng.
Khi bật bảo mật hàng trên bảng, tất cả quyền truy cập bình thường vào bảng để chọn hàng hoặc sửa đổi hàng phải được chính sách bảo mật hàng cho phép.
Dưới đây là một ví dụ đơn giản về cách tạo chính sách về mối quan hệ tài khoản để chỉ cho phép các thành viên của vai trò người quản lý truy cập vào các hàng và chỉ các hàng trong tài khoản của họ:
CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);
Bạn có thể biết thêm thông tin về tính năng này trên tài liệu postgresql của bộ tư pháp https://www.postgresql.org/docs/9.6/static/ddl-rowsecurity.html
Nếu bạn muốn tìm hiểu thêm, đây là một số tài nguyên có thể giúp bạn tăng cường bảo mật cơ sở dữ liệu của mình tốt hơn…
- https://www.postgresql.org/docs/9.6/static/auth-pg-hba-conf.html
- https://www.postgresql.org/docs/9.6/static/ssl-tcp.html
- https://www.postgresql.org/docs/current/static/pgcrypto.html
- http://www.postgresonline.com/journal/archives/165-Encrypting-data-with-pgcrypto.html
- https://github.com/pgaudit/pgaudit
- https://www.postgresql.org/docs/9.6/static/pgstatstatements.html
Kết luận
Nếu bạn làm theo các mẹo ở trên, máy chủ của bạn sẽ an toàn hơn, nhưng điều này không có nghĩa là nó sẽ không thể bị phá vỡ.
Để bảo mật cho riêng bạn, chúng tôi khuyên bạn nên sử dụng một công cụ kiểm tra bảo mật như Nessus, để biết lỗ hổng chính của bạn là gì và cố gắng giải quyết chúng.
Bạn cũng có thể giám sát cơ sở dữ liệu của mình với ClusterControl. Với điều này, bạn có thể xem những gì đang xảy ra bên trong cơ sở dữ liệu của mình theo thời gian thực và phân tích nó.