Thứ năm, 22/08/2013 | 00:00 GMT+7

Cách bảo mật PostgreSQL trên VPS Ubuntu


PostgreSQL là gì?

PostgreSQL, còn gọi là postgres, là một hệ quản trị database phổ biến được sử dụng để xử lý dữ liệu của nhiều trang web và ứng dụng.

Trong hướng dẫn này, ta sẽ thảo luận một số cách mà bạn có thể bảo mật database PostgreSQL của bạn . Điều này sẽ giúp ngăn chặn việc sử dụng trái phép hoặc độc hại dữ liệu .

Ta sẽ hoàn thành các bước trong hướng dẫn này trên VPS Ubuntu 12.04, nhưng hầu hết mọi bản phân phối hiện đại đều hoạt động theo cách tương tự.

Cài đặt

Nếu bạn hiện chưa cài đặt PostgreSQL, bạn có thể cài đặt nó bằng các lệnh sau:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Phần mềm database bây giờ sẽ được cài đặt trên hệ thống.

Xác thực ngang hàng

Theo mặc định, PostgreSQL xử lý xác thực bằng cách liên kết account user Linux với account PostgreSQL. Đây được gọi là xác thực "ngang hàng".

Sau khi cài đặt, Postgres tạo một user Linux được gọi là "postgres" được dùng để truy cập hệ thống. Ta có thể thay đổi thành user này bằng lệnh :

sudo su - postgres

Từ đây, ta có thể kết nối với hệ thống bằng lệnh :

psql

Lưu ý cách ta có thể kết nối mà không cần password . Điều này là do Postgres đã xác thực bằng tên user , mà nó giả định là được bảo mật.

Không sử dụng user "postgres" Linux cho bất kỳ việc gì khác ngoài việc truy cập phần mềm database . Đây là một xem xét bảo mật quan trọng.

Thoát khỏi PostgreSQL và user postgres bằng lệnh như sau:

\q
exit

Không cho phép kết nối từ xa

Một cách đơn giản để loại bỏ vectơ tấn công tiềm ẩn là không cho phép các kết nối từ xa đến database . Đây là mặc định hiện tại khi cài đặt PostgreSQL từ repository Ubuntu.

Ta có thể kiểm tra kỹ xem không có kết nối từ xa nào được phép bằng cách xem file xác thực dựa trên server :

sudo nano /etc/postgresql/9.1/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

Tôi đã xóa các comment khỏi kết quả ở trên.

Như bạn thấy , hai dòng bảo mật đầu tiên chỉ định "local" làm phạm vi áp dụng cho chúng. Điều này nghĩa là họ đang sử dụng socket domain Unix / Linux.

Hai khai báo thứ hai là từ xa, nhưng nếu ta xem xét các server mà chúng áp dụng cho (127.0.0.1/32 và :: 1/128), ta thấy rằng đây là các giao diện chỉ định máy local .

Điều gì xảy ra nếu bạn cần truy cập database từ xa?

Để truy cập PostgreSQL từ xa , hãy xem xét sử dụng SSH để kết nối với máy database và sau đó sử dụng kết nối local đến database từ đó.

Cũng có thể truy cập đường hầm vào PostgreSQL thông qua SSH để client có thể kết nối với database từ xa như thể nó là local . Bạn có thể tìm hiểu cách truyền PostgreSQL qua SSH tại đây.

Một tùy chọn khác là cấu hình quyền truy cập bằng chứng chỉ SSL . Điều này sẽ cho phép truyền thông tin được mã hóa. Bạn có thể học cách cài đặt SSL với PostgreSQL bằng liên kết này.

Bảo mật trong PostgreSQL

Mặc dù đảm bảo quyền truy cập vào dấu nhắc là quan trọng, nhưng bạn cũng cần bảo mật dữ liệu của bạn trong môi trường PostgreSQL. PostgreSQL hoàn thành điều này thông qua việc sử dụng các " role ".

Đăng nhập vào PostgreSQL để theo dõi phần này:

sudo su - postgres
psql

Tạo các role riêng biệt cho từng ứng dụng

Một cách đảm bảo rằng user và dữ liệu có thể được tách biệt nếu cần là chỉ định một role riêng biệt cho từng ứng dụng.

Để tạo một role mới, hãy nhập như sau:

CREATE ROLE role_name WITH optional_permissions;

Để xem các quyền bạn có thể chỉ định, hãy nhập:

\h CREATE ROLE

Bạn có thể thay đổi quyền của bất kỳ role nào bằng lệnh :

ALTER ROLE role_name WITH optional_permissions;

Liệt kê các role hiện tại và thuộc tính của chúng bằng lệnh :

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 hello     | Create DB                                      | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 testuser  |                                                | {}

Tạo user mới và chỉ định quyền thích hợp cho mọi ứng dụng mới sẽ sử dụng PostgreSQL.

Tách user khỏi các chức năng

Role là một cách xử lý quyền linh hoạt. Họ chia sẻ một số khía cạnh của user và group và có thể được thực hiện để hoạt động giống như vậy. Role có thể có tư cách thành viên trong các role khác.

Điều này cung cấp cho ta một số cách duy nhất để giải quyết quyền.

Ta có thể chỉ định role đăng nhập của user (chẳng hạn như role ứng dụng mà ta đã nói ở trên), và sau đó ta có thể chỉ định các role đó thành viên trong role truy cập để thực hiện các chức năng thực tế trên dữ liệu.

Sự tách biệt các quyền này cho phép ta quản lý những gì mỗi user có thể làm ở mức độ chi tiết hơn.

Để kiểm tra điều này, hãy tạo hai role :

CREATE ROLE login_role WITH login;
CREATE ROLE access_role;
\du
                             List of roles
  Role name  |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 access_role | Cannot login                                   | {}
 login_role  |                                                | {}
 postgres    | Superuser, Create role, Create DB, Replication | {}

Như bạn thấy , ta có hai role mới, một trong số đó không thể đăng nhập.

Bây giờ ta có thể tạo database do "access_role" sở hữu:

CREATE DATABASE demo_application WITH OWNER access_role;

Bây giờ ta có thể kết nối với database và khóa quyền chỉ cho phép "access_role" tạo bảng:

\c demo_application
REVOKE ALL ON SCHEMA public FROM public;
GRANT ALL ON SCHEMA public TO access_role;

Ta có thể kiểm tra bằng cách thay đổi user thành "login_role" và cố gắng tạo một bảng:

SET ROLE login_role;
CREATE TABLE test_table(
	name varchar(25));
ERROR: permission denied for schema public

Cuối cùng, ta có thể thêm "login_role" làm thành viên vào "access_role". Điều này sẽ cho phép nó truy cập vào cùng một chức năng mà "access_role" có.

Ta sẽ đặt lại role thành "postgres", cấp quyền thành viên "login_role" trong "access_role" và sau đó thử lại quy trình:

RESET ROLE;
GRANT access_role TO login_role;
SET ROLE login_role;
CREATE TABLE test_table(
	name varchar(25));
CREATE TABLE

Những công việc này.

Bây giờ ta có thể đăng nhập bằng cách sử dụng "login_role" và quản trị database . Điều này giúp bạn dễ dàng thêm hoặc thu hồi khả năng làm việc trên database này.

Kết luận

Các phương pháp được thảo luận trong bài viết này chỉ là một điểm khởi đầu để phát triển các chiến lược bảo mật của bạn . Nhu cầu bảo mật của bạn sẽ là duy nhất tùy thuộc vào những user database khác nhau và số lượng và loại lưu lượng bạn cần để phục vụ.

Bạn nên nghiên cứu những lợi ích và thiếu sót của bất kỳ biện pháp bảo mật nào trước khi triển khai chúng trên hệ thống production . Điều cần thiết là phải tiến hành kiểm tra kỹ đảm bảo rằng bạn đã triển khai kiểm soát mà bạn đang tìm kiếm và bạn không vô tình hạn chế việc sử dụng hợp lệ phần mềm của bạn .

Bởi Justin Ellingwood

Tags:

Các tin liên quan

cách sử dụng role và quản lý quyền cấp trong PostgreSQL trên VPS
2013-08-05
cách sử dụng role và quản lý quyền cấp trong PostgreSQL trên VPS
2013-08-05
Cách tạo truy vấn dữ liệu trong PostgreSQL bằng cách sử dụng lệnh chọn
2013-08-02
Cách tạo, xóa & quản lý bảng trong PostgreSQL trên server cloud
2013-08-01