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:
# 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:
OutputCREATE 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:
OutputCREATE 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:
OutputStatus: 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
OutputTo 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.
# 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:
#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
Vì 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:
OutputPassword 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:
OutputDROP DATABASE
Để xóa user :
- DROP USER sammy;
Sự thành công được xác nhận bởi:
OutputDROP 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
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.
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 82016-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