Trang chủ / Chuyên đề / Bảo mật postgresql trên Ubuntu vps
Thứ năm, 22/08/2013 | 00:00 GMT+7

Bảo mật postgresql trên Ubuntu vps

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 bảo mật database PostgreSQL.

Ta sẽ hoàn thành các bước trong hướng dẫn này trên VPS Ubuntu, 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 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 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 "peer (ngang-hàng)".

Sau khi cài đặt, Postgres tạo một user Linux có tên là "postgres" được dùng để truy cập hệ thống. Ta có thể thay chuyển đến 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ỏ 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 (kho-lưu-trữ) 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

(đã 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. Đ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 nhìn vào các server ip (127.0.0.1/32 và :: 1/128), ta thấy rằng đây là các interface mạng  (giao-diện mạng) 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 cân nhắc sử dụng SSH để kết nối với server database và sau đó sử dụng kết nối local đến database từ đó.

Cũng có thể truy cập tunnel 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 tunnel 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 certificate SSL . Điều này sẽ cho phép thông tin truyền được mã hóa. Bạn có thể tìm hiểu cách cài đặt SSL với PostgreSQL.

Bảo mật trong PostgreSQL

Mặc dù đảm bảo quyền truy cập vào dòng lệnh là quan trọng bước đầu, nhưng bên trong, ta cũng cần bảo mật dữ liệu 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 "roles".

Đă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 user và dữ liệu có thể được tách biệt nếu cần thiết 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

Roles là một cách xử lý quyền linh hoạt. Roles chia có 2 vài trò là user và group. Một 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 để giải quyết các quyền.

Ta có thể chỉ định role login 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 đó là thành viên trong role access (truy cập) để thực hiện các chức năng trên dữ liệu.

Sự tách biệt các quyền này cho phép ta quản lý 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 các 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ố  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

Nó đã làm việc.

Bây giờ ta có thể đăng nhập bằng "login_role" và quản trị database. Điều này giúp ta 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 bắt đầu để xây dựng các kế hoạch bảo mật. Bạn nên nghiên cứu những lợi ích và hạn chế của các cách bảo mật trước khi triển khai chúng trên hệ thống production (sản-xuất), để linh hoạt áp dụng, vì không có giải pháp toàn diện duy nhất nào cho mọi tình huống.


Tags: Ubuntu

Các tin trước

Sử dụng sftp-to-securely-transfer-files với remote-server 2013-08-13

Quản trị packages trong Ubuntu và Debian với apt-get-apt-cache 2013-08-06

Sử dụng roles và quản lý cấp quyền trong postgresql trên vps 2013-08-05

Lệnh truy vấn SQL trong postgresql sử dụng select 2013-08-02

Các lệnh truy cấn quản lý bảng dữ liệu trong postgresql trên cloud-server 2013-08-01

Bảo mật MySQL và MariaDB Databases trên Linux VPS 2013-07-23

Cài đặt Firewall với UFW trên Ubuntu và Debian Cloud Server 2013-06-25

Cơ bản nhất về MYSQL trên Ubuntu CentOS 2012-06-12