Thứ ba, 24/01/2017 | 00:00 GMT+7

Cách bảo mật PostgreSQL chống lại các cuộc tấn công tự động

Có thể bạn khó nghĩ vì một server mới được đưa lên gần đây, ít lưu lượng truy cập hoặc không cung cấp gì có vẻ có giá trị đối với tin tặc mà nó sẽ không được chú ý. Tuy nhiên, nhiều khai thác được tự động hóa và được thiết kế đặc biệt để tìm kiếm các lỗi phổ biến trong cấu hình. Các chương trình này quét mạng để khám phá các server , không phụ thuộc vào bản chất của nội dung.

Cho phép kết nối từ xa là một trong những tình huống phổ biến và dễ dàng khắc phục hơn có thể dẫn đến việc khai thác database PostgreSQL. Điều này xảy ra vì một số cấu hình nhất định giúp các chương trình như thế này dễ dàng khám phá ra server .

Trong hướng dẫn này, ta sẽ chỉ ra cách giảm thiểu rủi ro cụ thể gây ra bằng cách cho phép kết nối từ xa. Mặc dù đây là bước đầu tiên quan trọng, vì server có thể bị xâm nhập theo những cách khác, ta cũng khuyên bạn nên thực hiện các biện pháp bổ sung để bảo vệ dữ liệu của bạn , được nêu trong Cân nhắc bảo mật bổ sung .

Lý lịch

Để hiểu rủi ro cụ thể mà ta đang giảm thiểu, hãy tưởng tượng server như một cửa hàng. Nếu server đang nghe trên bất kỳ cổng nào, nó giống như bật một dấu hiệu "Mở" bằng đèn neon. Nó làm cho server hiển thị trên mạng, nơi các tập lệnh tự động có thể tìm thấy nó.

Ta có thể coi mỗi cổng như một cách để vào cửa hàng, giống như cửa ra vào hoặc cửa sổ. Các lối vào này có thể mở, đóng, khóa hoặc bị hỏng tùy thuộc vào trạng thái của phần mềm đang lắng nghe, nhưng lắng nghe trên giao diện công cộng nghĩa là một tập lệnh tìm cách xâm nhập vào bên trong có thể bắt đầu thử. Ví dụ: tập lệnh có thể được cấu hình để cố gắng đăng nhập bằng password mặc định nếu nó không bị thay đổi. Nó có thể cố gắng khai thác đã biết của daemon lắng nghe trong trường hợp nó chưa được vá. Dù kịch bản có cố gắng gì đi chăng nữa, nếu nó có thể tìm ra điểm yếu và khai thác nó, thì kẻ xâm nhập đang ở bên trong và có thể tấn công nghiêm trọng việc xâm nhập server .

Khi ta hạn chế một daemon như postgresql nghe local , thì giống như cánh cửa cụ thể ra bên ngoài đó không tồn tại. Không có bước tiếp theo để thử, ít nhất là đối với Postgres. Tường lửa và VPN bảo vệ theo cách tương tự. Trong hướng dẫn này, ta sẽ tập trung vào việc loại bỏ PostgreSQL như một cánh cửa có thể truy cập . Để bảo mật chính daemon hoặc dữ liệu khi nó được truyền hoặc lưu trữ, hãy xem Cân nhắc Bảo mật Bổ sung .

Yêu cầu

Trong hướng dẫn này, ta sẽ sử dụng hai bản cài đặt Ubuntu , một cho server database và một cho client sẽ kết nối với server từ xa. Mỗi cái phải có một user sudo và firewall được kích hoạt. Hướng dẫn Cài đặt Server Ban đầu với Ubuntu 16.04 có thể giúp bạn điều này.

Một server database PostgreSQL Ubuntu 16.04 :

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

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

Một client Ubuntu 16.04 :
Để chứng minh và kiểm tra việc cho phép kết nối từ xa, ta sẽ sử dụng client PostgreSQL, psql . Để cài đặt nó, hãy sử dụng các lệnh sau:

  • sudo apt-get update
  • sudo apt-get install postgresql-client

Khi có những yêu cầu này, bạn đã sẵn sàng làm theo.

Hiểu cấu hình mặc định

Khi PostgreSQL được cài đặt từ các gói Ubuntu, theo mặc định, nó bị hạn chế nghe trên localhost. Có thể thay đổi mặc định này bằng cách overrides các địa chỉ listen_addresses trong file postgresql.conf , nhưng mặc định ngăn server tự động lắng nghe trên giao diện công cộng.

Ngoài ra, file pg_hba.conf chỉ cho phép kết nối từ socket domain Unix / Linux và địa chỉ loopback local cho server , vì vậy nó sẽ không chấp nhận kết nối từ các server bên ngoài:

thay thế
# Put your actual configuration here # ---------------------------------- # # If you want to allow non-local connections, you need to add more # "host" records.  In that case you will also need to make PostgreSQL # listen on a non-local interface via the listen_addresses # configuration parameter, or via the -i or -h command line switches.  # DO NOT DISABLE! # If you change this first entry you will need to make sure that the # database superuser can access the database using some other method. # Noninteractive access to all databases is required during automatic # maintenance (custom daily cronjobs, replication, and similar tasks). # # Database administrative login by Unix domain socket local   all             postgres                                peer  # TYPE  DATABASE        USER            ADDRESS                 METHOD  # "local" is for Unix domain socket connections only local   all             all                                     peer # IPv4 local connections: host    all             all             127.0.0.1/32            md5 # IPv6 local connections: host    all             all             ::1/128                 md5 

Các giá trị mặc định này đáp ứng mục tiêu không lắng nghe trên giao diện công cộng. Nếu ta để chúng nguyên vẹn và giữ nguyên firewall , ta đã hoàn tất! Ta có thể tiến hành trực tiếp đến phần Cân nhắc bảo mật bổ sung để tìm hiểu cách bảo mật dữ liệu khi chuyển tiếp.

Nếu bạn cần kết nối từ server từ xa, ta sẽ trình bày cách overrides các giá trị mặc định cũng như các bước ngay lập tức bạn có thể thực hiện để bảo vệ server trong phần tiếp theo.

Cấu hình kết nối từ xa

Đối với cài đặt production và trước khi ta bắt đầu làm việc với dữ liệu nhạy cảm, lý tưởng nhất là ta sẽ có lưu lượng PostgreSQL được mã hóa bằng SSL khi chuyển tiếp, được bảo mật sau firewall bên ngoài hoặc được bảo vệ bởi mạng riêng ảo (VPN). Khi ta hướng tới điều đó, ta có thể thực hiện bước ít phức tạp hơn là bật firewall trên server database của bạn và hạn chế quyền truy cập vào các server cần nó.

Bước 1 - Thêm user và database

Ta sẽ bắt đầu bằng cách thêm một user và database cho phép ta kiểm tra công việc của bạn . Để làm như vậy, ta sẽ sử dụng client PostgreSQL, psql , để kết nối với quyền là admin-user postgres . Bằng cách chuyển tùy chọn -i cho sudo ta sẽ chạy shell đăng nhập của user postgres, đảm bảo ta tải các tùy chọn từ .profile hoặc các tài nguyên dành riêng cho đăng nhập khác. -u loài user postgres:

  • sudo -i -u postgres psql

Tiếp theo, ta sẽ tạo một user có password . Đảm bảo sử dụng password an toàn thay cho ví dụ được đánh dấu bên dưới:

  • CREATE USER sammy WITH PASSWORD 'password';

Khi user được tạo thành công, ta sẽ nhận được kết quả sau:

Output
CREATE ROLE

Lưu ý: Vì PostgreSQL 8.1, ROLES và USERS đồng nghĩa với nhau. Theo quy ước, role có password vẫn được gọi là NGƯỜI DÙNG, trong khi role không được gọi là VAI TRÒ, vì vậy đôi khi ta sẽ thấy VAI TRÒ ở kết quả mà ta có thể mong đợi thấy NGƯỜI DÙNG.

Tiếp theo, ta sẽ tạo database và cấp quyền truy cập đầy đủ cho user mới của ta . Các phương pháp hay nhất khuyên ta chỉ nên cấp cho user quyền truy cập mà họ cần và chỉ trên các tài nguyên mà họ nên có, vì vậy tùy thuộc vào trường hợp sử dụng, có thể hạn chế quyền truy cập của user nhiều hơn nữa. Bạn có thể tìm hiểu thêm về quyền trong hướng dẫn Cách sử dụng Role và Quản lý Quyền Grant trong PostgreSQL trên VPS .

  • CREATE DATABASE sammydb OWNER sammy;

Khi database được tạo thành công, ta sẽ nhận được xác nhận:

Output
CREATE DATABASE

Bây giờ, ta đã tạo user và database , ta sẽ thoát khỏi màn hình

  • \q

Sau khi nhấn ENTER, ta sẽ ở dấu nhắc lệnh và sẵn sàng tiếp tục.

Bước 2 - Cấu hình UFW

Trong Điều kiện tiên quyết trong Cài đặt server ban đầu với Ubuntu 16.04 , ta đã bật UFW và chỉ cho phép kết nối SSH. Trước khi bắt đầu cấu hình, hãy xác minh trạng thái của UFW:

  • sudo ufw status

Lưu ý: Nếu kết quả cho biết firewall inactive ta có thể kích hoạt nó bằng:

  • sudo ufw enable

Sau khi nó được kích hoạt, hãy chạy lại trạng thái lệnh , trạng thái sudo ufw status sẽ hiển thị các luật hiện tại. Nếu cần, hãy đảm bảo cho phép SSH.

  • sudo ufw allow OpenSSH

Trừ khi ta áp dụng các thay đổi đối với các yêu cầu , kết quả sẽ cho thấy chỉ OpenSSH mới được phép:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

Bây giờ ta đã kiểm tra trạng thái firewall , ta sẽ cho phép truy cập vào cổng PostgreSQL và giới hạn nó ở server hoặc server mà ta muốn cho phép.

Lệnh bên dưới sẽ thêm luật cho cổng mặc định của PostgreSQL, là 5432. Nếu bạn đã thay đổi cổng đó, hãy nhớ cập nhật nó trong lệnh bên dưới. Đảm bảo rằng bạn đã sử dụng địa chỉ IP của server cần truy cập. Nếu cần, hãy chạy lại lệnh này để thêm từng địa chỉ IP client cần quyền truy cập:

  • sudo ufw allow from client_ip_address to any port 5432

Để kiểm tra kỹ luật , ta có thể chạy lại ufw status :

  • sudo ufw status
Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere 5432 ALLOW client_ip_address OpenSSH (v6) ALLOW Anywhere (v6)

Lưu ý: Nếu bạn chưa quen với UFW, bạn có thể tìm hiểu thêm trong hướng dẫn UFW Essentials: Common Firewall Rules and Commands .

Với luật firewall này, bây giờ ta sẽ cấu hình PostgreSQL để lắng nghe địa chỉ IP công khai của nó. Điều này yêu cầu sự kết hợp của hai cài đặt, một mục nhập cho server lưu trữ kết nối trong pg_hba.conf và cấu hình cho các địa chỉ nghe trong postgresql.conf .

Bước 3 - Cấu hình server được phép

Ta sẽ bắt đầu bằng cách thêm mục nhập server trong pg_hba.conf . Nếu bạn đã cài đặt version PostgreSQL khác, hãy đảm bảo thay thế version đó trong đường dẫn bên dưới:

  • sudo nano /etc/postgresql/9.5/main/pg_hba.conf

Ta sẽ đặt các dòng host bên dưới khối comment mô tả cách cho phép các kết nối không phải local . Ta cũng sẽ bao gồm một dòng có địa chỉ công khai của server database để ta có thể nhanh chóng kiểm tra xem firewall của ta có được cấu hình chính xác hay không. Đảm bảo thay thế tên server hoặc địa chỉ IP của máy tính của bạn trong ví dụ bên dưới.

Trích từ pg_hba.conf
# If you want to allow non-local connections, you need to add more # "host" records.  In that case you will also need to make PostgreSQL # listen on a non-local interface via the listen_addresses # configuration parameter, or via the -i or -h command line switches. host  sammydb  sammy   client_ip_address/32   md5 

Trước khi lưu các thay đổi của bạn , hãy tập trung vào từng giá trị trong dòng này trong trường hợp bạn muốn thay đổi một số tùy chọn:

  • host Tham số đầu tiên, host , cài đặt kết nối TCP / IP sẽ được sử dụng.
  • cơ sở dữ liệu sammydb Cột thứ hai cho biết / database nào mà server có thể kết nối. Có thể thêm nhiều database bằng cách phân tách tên bằng dấu phẩy.
  • sammy user cho biết user được phép tạo kết nối. Như với cột database , nhiều user có thể được chỉ định, phân tách bằng dấu phẩy.
  • địa chỉ Địa chỉ chỉ định địa chỉ client hoặc các địa chỉ và có thể chứa tên server , dải địa chỉ IP hoặc các từ khóa đặc biệt khác . Trong ví dụ trên, ta chỉ cho phép một địa chỉ IP duy nhất của khách hàng của ta .
  • auth-method Cuối cùng, auth-method, md5 cho biết mật khẩu được băm kép MD5 sẽ được cung cấp để xác thực. Bạn sẽ không cần làm gì khác ngoài việc cung cấp password đã được tạo cho user kết nối.

Để có một cuộc thảo luận đầy đủ hơn về những cài đặt này và các cài đặt bổ sung, hãy xem Tài pg_hba.conf Tệp PostgreSQL.

Sau khi hoàn tất, hãy lưu và thoát khỏi file .

Bước 4 - Cấu hình địa chỉ nghe

Tiếp theo, ta sẽ đặt địa chỉ lắng nghe trong file postgresql.conf :

  • sudo nano /etc/postgresql/9.5/main/postgresql.conf

Tìm dòng listen_addresses và bên dưới nó, xác định địa chỉ lắng nghe của bạn, đảm bảo thay thế tên server hoặc địa chỉ IP của server database của bạn. Bạn có thể cần kiểm tra lại xem bạn đang sử dụng IP công cộng của server database , không phải client đang kết nối:

postgresql.conf
#listen_addresses = 'localhost'         # what IP address(es) to listen on; listen_addresses = 'localhost,server_ip_address' 

Khi bạn hoàn tất, hãy lưu và thoát khỏi file .

Bước 5 - Khởi động lại PostgreSQL

Các thay đổi cấu hình của ta sẽ không có hiệu lực cho đến khi ta khởi động lại daemon PostgreSQL, vì vậy ta sẽ thực hiện điều đó trước khi kiểm tra:

  • sudo systemctl restart postgresql

systemctl không cung cấp phản hồi, ta sẽ kiểm tra trạng thái đảm bảo daemon đã khởi động lại thành công:

  • sudo systemctl status postgresql

Nếu kết quả chứa “Active: active” và kết thúc bằng thông tin như sau, thì daemon PostgreSQL đang chạy.

Output
... Jan 10 23:02:20 PostgreSQL systemd[1]: Started PostgreSQL RDBMS.

Bây giờ ta đã khởi động lại daemon, ta đã sẵn sàng để kiểm tra.

Bước 6 - Kiểm tra

Cuối cùng, hãy kiểm tra xem ta có thể kết nối từ client của bạn hay không. Để làm điều này, ta sẽ sử dụng psql với -U để chỉ định user , -h để chỉ định địa chỉ IP của khách hàng và -d để chỉ định database , vì ta đã thắt chặt bảo mật của bạn để sammy chỉ có thể kết nối với database duy nhất.

  • psql -U sammy -h postgres_host_ip -d sammydb

Nếu mọi thứ được cấu hình chính xác, bạn sẽ nhận được dấu nhắc sau:

Output
Password for user sammy:

Nhập password bạn đã đặt trước đó khi thêm sammy user vào màn hình PostgreSQL.

Nếu bạn đến dấu nhắc sau, bạn đã kết nối thành công:

[secondary_label] sammydb=> 

Điều này xác nhận ta có thể vượt qua firewall và kết nối với database . Ta sẽ thoát ngay bây giờ:

  • \q

Vì ta đã xác nhận cấu hình của bạn , ta sẽ hoàn thành bằng cách dọn dẹp.

Bước 7 - Xóa Database Kiểm tra và User

Quay lại server khi ta đã hoàn tất kiểm tra kết nối, ta có thể sử dụng các lệnh sau để xóa database và cả user .

  • sudo -i -u postgres psql

Để xóa database :

  • DROP DATABASE sammydb;

Hành động được xác nhận bởi kết quả sau:

Output
DROP DATABASE

Để xóa user :

  • DROP USER sammy;

Sự thành công được xác nhận bởi:

Output
DROP ROLE

Ta sẽ kết thúc dọn dẹp của ta bằng cách loại bỏ các mục nhập server cho sammydb database từ pg_hba.conf file vì ta không còn cần đến nó:

  • sudo nano /etc/postgresql/9.5/main/pg_hba.conf
Dòng cần xóa khỏi `pg_hba.conf`
host  sammydb  sammy   client_ip_address/32   md5 

Để thay đổi có hiệu lực, ta sẽ lưu và thoát, sau đó khởi động lại server database :

  • sudo systemctl restart postgresl

Để đảm bảo nó đã khởi động lại thành công, ta sẽ kiểm tra trạng thái:

  • sudo systemctl status postgres

Nếu ta thấy “Active: active”, ta sẽ biết rằng quá trình khởi động lại đã thành công.

Đến đây, ta có thể tiếp tục với việc cấu hình ứng dụng hoặc dịch vụ trên client cần kết nối từ xa.

Cân nhắc Bảo mật Bổ sung

Hướng dẫn này nhằm giảm thiểu rủi ro gây ra bằng cách cho phép các kết nối từ xa không an toàn tới PostgreSQL, đây là một tình huống phổ biến vô tình làm cho PostgreSQL bị khai thác. Việc giới hạn quyền truy cập vào cổng lắng nghe đối với / s server cụ thể không giải quyết các cân nhắc bảo mật quan trọng khác, chẳng hạn như cách mã hóa dữ liệu khi truyền.

Trước khi làm việc với dữ liệu thực, ta khuyên bạn nên xem xét các tài nguyên sau và thực hiện các bước thích hợp cho trường hợp sử dụng của bạn.

  • Bảo mật trong PostgreSQL : Các câu lệnh GRANT xác định user nào được phép truy cập bất kỳ database cụ thể nào, trong khi Role cài đặt các quyền của những user đó. Kết hợp, chúng cung cấp sự tách biệt giữa nhiều database trong một cài đặt duy nhất.

  • Cài đặt SSL với PostgreSQL : Cấu hình SSL sẽ mã hóa dữ liệu khi truyền. Điều này bảo vệ dữ liệu khi nó được gửi đi.

  • Bảo mật kết nối TCP / IP PostgreSQL với tunnel SSH : Đường hầm SSH hữu ích khi kết nối với các client không có khả năng SSL. Trong hầu hết mọi tình huống khác, bạn nên cài đặt SSL với Postgres.

Kết luận

Trong hướng dẫn này, ta đã thực hiện các bước cần thiết để ngăn quảng cáo cài đặt PostgreSQL của ta bằng cách cấu hình firewall của server để chỉ cho phép kết nối từ các server yêu cầu quyền truy cập và bằng cách cấu hình PostgreSQL chỉ chấp nhận kết nối từ các server đó. Điều này làm giảm nguy cơ bị một số loại tấn công. Đây chỉ là bước đầu tiên để bảo mật dữ liệu và ta khuyên bạn nên xem xét và triển khai các biện pháp bảo mật bổ sung được nêu ở trên.


Tags:

Các tin liên quan

Cách sử dụng Postgresql với Ứng dụng Django của bạn trên Debian 8
2016-12-22
Cách di chuyển thư mục dữ liệu PostgreSQL đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên Ubuntu 16.04
2016-05-18
Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 16.04
2016-05-04
Cách backup, khôi phục và di chuyển database PostgreSQL với Barman trên CentOS 7
2016-01-20
Cài đặt postgresql 9.4 trên Debian 8
2015-06-11
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên Ubuntu 14.04
2015-03-25
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên CentOS 7
2015-03-25
Cách sử dụng PostgreSQL với ứng dụng Ruby on Rails của bạn trên Ubuntu 14.04
2015-03-18
Cách sử dụng PostgreSQL với ứng dụng Ruby on Rails của bạn trên CentOS 7
2015-03-18