Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách bảo mật cụm Galera - 8 mẹo

Là một hệ thống cơ sở dữ liệu phân tán, Galera Cluster yêu cầu các biện pháp bảo mật bổ sung so với một cơ sở dữ liệu tập trung. Dữ liệu được phân phối trên nhiều máy chủ hoặc thậm chí cả trung tâm dữ liệu. Với giao tiếp dữ liệu quan trọng diễn ra giữa các nút, có thể có khả năng bị lộ đáng kể nếu các biện pháp bảo mật thích hợp không được thực hiện.

Trong bài đăng trên blog này, chúng ta sẽ xem xét một số mẹo về cách bảo mật Cụm Galera của chúng tôi. Lưu ý rằng blog này được xây dựng dựa trên bài đăng trên blog trước đây của chúng tôi - Cách bảo mật cơ sở dữ liệu nguồn mở của bạn bằng ClusterControl.

Firewall &Security Group

Các cổng sau rất quan trọng đối với Cụm Galera:

  • 3306 - MySQL
  • 4567 - Giao tiếp và nhân rộng Galera
  • 4568 - Galera IST
  • 4444 - Galera SST

Từ mạng bên ngoài, chỉ nên mở quyền truy cập vào MySQL cổng 3306. Ba cổng còn lại có thể bị đóng lại từ mạng bên ngoài và chỉ cho phép chúng truy cập nội bộ giữa các nút Galera. Nếu bạn đang chạy một proxy ngược ở phía trước các nút Galera, chẳng hạn như HAProxy, bạn có thể khóa cổng MySQL khỏi quyền truy cập công khai. Đồng thời đảm bảo cổng giám sát cho tập lệnh giám sát HAProxy được mở. Cổng mặc định là 9200 trên nút Galera.

Sơ đồ sau minh họa thiết lập ví dụ của chúng tôi trên Cụm Galera ba nút, với HAProxy đối mặt với mạng công cộng với các cổng liên quan của nó:

Dựa trên sơ đồ trên, các lệnh iptables cho các nút cơ sở dữ liệu là:

$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 3306 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 4444 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dports 4567:4568 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 9200 -j ACCEPT

Khi ở trên bộ cân bằng tải:

$ iptables -A INPUT -p tcp --dport 3307 -j ACCEPT

Đảm bảo kết thúc các quy tắc tường lửa của bạn bằng từ chối tất cả, vì vậy chỉ cho phép lưu lượng truy cập như được xác định trong các quy tắc ngoại lệ. Bạn có thể chặt chẽ hơn và mở rộng các lệnh để tuân theo chính sách bảo mật của mình - ví dụ:bằng cách thêm giao diện mạng, địa chỉ đích, địa chỉ nguồn, trạng thái kết nối và những gì không.

Mã hóa máy khách-máy chủ MySQL

MySQL hỗ trợ mã hóa giữa máy khách và máy chủ. Đầu tiên chúng ta phải tạo chứng chỉ. Sau khi được định cấu hình, bạn có thể thực thi tài khoản người dùng để chỉ định các tùy chọn nhất định để kết nối bằng mã hóa với máy chủ MySQL.

Các bước yêu cầu bạn:

  1. Tạo khóa cho Tổ chức phát hành chứng chỉ (ca-key.pem)
  2. Tạo chứng chỉ CA tự ký (ca-cert.pem)
  3. Tạo khóa cho chứng chỉ máy chủ (server-key.pem)
  4. Tạo chứng chỉ cho máy chủ và ký chứng chỉ đó bằng ca-key.pem (server-cert.pem)
  5. Tạo khóa cho chứng chỉ ứng dụng khách (client-key.pem)
  6. Tạo chứng chỉ cho ứng dụng khách và ký chứng chỉ đó bằng ca-key.pem (client-cert.pem)

Luôn cẩn thận với khóa cá nhân CA (ca-key.pem) - bất kỳ ai có quyền truy cập vào nó đều có thể sử dụng nó để tạo thêm chứng chỉ máy khách hoặc máy chủ sẽ được chấp nhận là hợp pháp khi kích hoạt xác minh CA. Điểm mấu chốt là tất cả các chìa khóa phải được giữ kín đáo.

Sau đó, bạn có thể thêm các biến liên quan đến SSL trong chỉ thị [mysqld], ví dụ:

ssl-ca=/etc/ssl/mysql/ca-cert.pem
ssl-cert=/etc/ssl/mysql/server-cert.pem
ssl-key=/etc/ssl/mysql/server-key.pem

Khởi động lại máy chủ MySQL để tải các thay đổi. Sau đó, tạo người dùng với câu lệnh YÊU CẦU SSL, ví dụ:

mysql> GRANT ALL PRIVILEGES ON db1.* TO 'dbuser'@'192.168.1.100' IDENTIFIED BY 'mySecr3t' REQUIRE SSL;

Người dùng được tạo với YÊU CẦU SSL sẽ được thực thi để kết nối với các tệp SSL ứng dụng khách chính xác (client-cert.pem, client-key.pem và ca-cert.pem).

Với ClusterControl, mã hóa SSL máy khách-máy chủ có thể dễ dàng được bật từ giao diện người dùng, bằng cách sử dụng tính năng "Tạo mã hóa SSL".

Mã hóa Galera

Bật mã hóa cho Galera có nghĩa là IST cũng sẽ được mã hóa vì giao tiếp diễn ra qua cùng một ổ cắm. Mặt khác, SST phải được cấu hình riêng biệt như được trình bày trong phần tiếp theo. Tất cả các nút trong cụm phải được kích hoạt bằng mã hóa SSL và bạn không thể có kết hợp các nút trong đó một số đã bật mã hóa SSL và những nút khác thì không. Thời điểm tốt nhất để định cấu hình điều này là khi thiết lập một cụm mới. Tuy nhiên, nếu bạn cần thêm điều này vào một hệ thống sản xuất đang chạy, rất tiếc, bạn sẽ cần phải khởi động lại cụm và sẽ có thời gian chết.

Tất cả các nút Galera trong cụm phải sử dụng cùng một khóa, chứng chỉ và CA (tùy chọn). Bạn cũng có thể sử dụng cùng một khóa và chứng chỉ được tạo để mã hóa máy khách-máy chủ MySQL hoặc tạo một bộ mới chỉ cho mục đích này. Để kích hoạt mã hóa bên trong Galera, người ta phải thêm tùy chọn và giá trị dưới wsrep_provider_options bên trong tệp cấu hình MySQL trên mỗi nút Galera. Ví dụ:hãy xem xét dòng hiện có sau cho nút Galera của chúng tôi:

wsrep_provider_options = "gcache.size=512M; gmcast.segment=0;"

Nối các biến có liên quan vào bên trong dấu ngoặc kép, được phân tách bằng dấu chấm phẩy:

wsrep_provider_options = "gcache.size=512M; gmcast.segment=0; socket.ssl_cert=/etc/mysql/cert.pem; socket.ssl_key=/etc/mysql/key.pem;"

Để biết thêm thông tin về các thông số liên quan đến SSL của Galera, hãy xem tại đây. Thực hiện sửa đổi này trên tất cả các nút. Sau đó, dừng cụm (từng nút một) và khởi động từ nút cuối cùng đã tắt. Bạn có thể xác minh xem SSL được tải đúng cách hay không bằng cách xem nhật ký lỗi MySQL:

2018-01-19T01:15:30.155211Z 0 [Note] WSREP: gcomm: connecting to group 'my_wsrep_cluster', peer '192.168.10.61:,192.168.10.62:,192.168.10.63:'
2018-01-19T01:15:30.159654Z 0 [Note] WSREP: SSL handshake successful, remote endpoint ssl://192.168.10.62:53024 local endpoint ssl://192.168.10.62:4567 cipher: AES128-SHA compression:

Với ClusterControl, bạn có thể dễ dàng bật mã hóa sao chép Galera bằng cách sử dụng tính năng "Tạo mã hóa SSL Galera".

Mã hóa SST

Khi SST xảy ra mà không có mã hóa, thông tin liên lạc dữ liệu sẽ bị lộ trong khi quá trình SST đang diễn ra. SST là một quá trình đồng bộ hóa dữ liệu đầy đủ từ một nhà tài trợ đến một nút kết hợp. Nếu kẻ tấn công có thể "nhìn thấy" toàn bộ quá trình truyền dữ liệu, kẻ đó sẽ nhận được ảnh chụp nhanh đầy đủ về cơ sở dữ liệu của bạn.

SST có mã hóa chỉ được hỗ trợ cho các phương thức mysqldump và xtrabackup-v2. Đối với mysqldump, người dùng phải được cấp "YÊU CẦU SSL" trên tất cả các nút và cấu hình tương tự như mã hóa SSL máy chủ-máy khách MySQL tiêu chuẩn (như được mô tả trong phần trước). Sau khi mã hóa máy khách-máy chủ được kích hoạt, hãy tạo người dùng SST mới với SSL được thực thi:

mysql> GRANT ALL ON *.* TO 'sst_user'@'%' IDENTIFIED BY 'mypassword' REQUIRE SSL;

Đối với rsync, chúng tôi khuyên bạn nên sử dụng galera-secure-rsync, một tập lệnh rsync SST được bảo mật SSL thả vào cho Galera Cluster. Nó hoạt động gần giống như wsrep_sst_rsync ngoại trừ việc nó bảo mật thông tin liên lạc thực tế với SSL bằng cách sử dụng socat. Tạo khóa máy khách / máy chủ và các tệp chứng chỉ được yêu cầu, sao chép chúng vào tất cả các nút và chỉ định "secure_rsync" làm phương thức SST bên trong tệp cấu hình MySQL để kích hoạt nó:

wsrep_sst_method=secure_rsync

Đối với xtrabackup, các tùy chọn cấu hình sau phải được bật bên trong tệp cấu hình MySQL theo chỉ thị [sst]:

[sst]
encrypt=4
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem

Khởi động lại cơ sở dữ liệu là không cần thiết. Nếu nút này được Galera chọn làm nhà tài trợ, các tùy chọn cấu hình này sẽ được chọn tự động khi Galera bắt đầu SST.

SELinux

Linux được tăng cường bảo mật (SELinux) là một cơ chế kiểm soát truy cập được thực hiện trong hạt nhân. Nếu không có SELinux, chỉ các phương pháp kiểm soát truy cập truyền thống như quyền đối với tệp hoặc ACL mới được sử dụng để kiểm soát quyền truy cập tệp của người dùng.

Theo mặc định, với chế độ thực thi nghiêm ngặt được bật, mọi thứ đều bị từ chối và quản trị viên phải thực hiện một loạt chính sách ngoại lệ cho các phần tử của hệ thống yêu cầu để hoạt động. Việc vô hiệu hóa hoàn toàn SELinux đã trở thành một thói quen kém phổ biến đối với nhiều cài đặt dựa trên RedHat ngày nay.

Tùy thuộc vào khối lượng công việc, cách sử dụng và quy trình, cách tốt nhất là tạo mô-đun chính sách SELinux của riêng bạn được điều chỉnh cho phù hợp với môi trường của bạn. Những gì bạn thực sự cần làm là đặt SELinux ở chế độ cho phép (chỉ ghi nhật ký mà không thực thi) và kích hoạt các sự kiện có thể xảy ra trên một nút Galera để SELinux ghi nhật ký. Càng mở rộng càng tốt. Các sự kiện ví dụ như:

  • Bắt đầu nút với tư cách nhà tài trợ hoặc người tham gia
  • Khởi động lại nút để kích hoạt IST
  • Sử dụng các phương pháp SST khác nhau
  • Sao lưu và khôi phục cơ sở dữ liệu MySQL bằng mysqldump hoặc xtrabackup
  • Bật và tắt nhật ký nhị phân

Một ví dụ là nếu nút Galera được ClusterControl giám sát và tính năng giám sát truy vấn được bật, ClusterControl sẽ bật / tắt biến nhật ký truy vấn chậm để nắm bắt các truy vấn chạy chậm. Do đó, bạn sẽ thấy thông báo từ chối sau đây trong Audit.log:

$ grep -e denied audit/audit.log | grep -i mysql
type=AVC msg=audit(1516835039.802:37680): avc:  denied  { open } for  pid=71222 comm="mysqld" path="/var/log/mysql/mysql-slow.log" dev="dm-0" ino=35479360 scontext=system_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file

Ý tưởng là để tất cả các từ chối có thể được ghi vào nhật ký kiểm tra, nhật ký này sau này có thể được sử dụng để tạo mô-đun chính sách bằng cách sử dụng Audit2allow trước khi tải nó vào SELinux. Codership đã trình bày chi tiết vấn đề này trong trang tài liệu, Cấu hình SELinux.

Tài khoản SST và Đặc quyền

SST là một quá trình đồng bộ hóa ban đầu do Galera thực hiện. Nó mang đến một nút tham gia cập nhật với các thành viên còn lại trong cụm. Về cơ bản, quá trình xuất dữ liệu từ nút nhà tài trợ và khôi phục nó trên nút bộ kết hợp, trước khi bộ kết hợp được phép bắt kịp các giao dịch còn lại từ hàng đợi (tức là những giao dịch đã xảy ra trong quá trình đồng bộ hóa). Ba phương pháp SST được hỗ trợ:

  • mysqldump
  • rsync
  • xtrabackup (hoặc xtrabackup-v2)

Để sử dụng mysqldump SST, cần có các đặc quyền sau:

  • CHỌN, HIỂN THỊ CHẾ ĐỘ XEM, TRIGGER, BẢNG KHÓA, TẢI LẠI, TẬP TIN

Chúng tôi sẽ không đi xa hơn với mysqldump vì nó có thể không thường được sử dụng trong sản xuất như phương pháp SST. Bên cạnh đó, nó là một thủ tục ngăn chặn đối với nhà tài trợ. Rsync thường là lựa chọn ưu tiên thứ hai sau xtrabackup do thời gian đồng bộ hóa nhanh hơn và ít bị lỗi hơn so với mysqldump. Xác thực SST bị bỏ qua với rsync, do đó bạn có thể bỏ qua việc định cấu hình đặc quyền tài khoản SST nếu rsync là phương thức SST đã chọn.

Cùng với xtrabackup, các đặc quyền sau được khuyên dùng cho các quy trình sao lưu và khôi phục tiêu chuẩn dựa trên trang tài liệu Xtrabackup:

  • TẠO, TẠO BẢNG BIỂU, SỰ KIỆN, CHÈN, BẢNG KHÓA, QUÁ TRÌNH, TẢI LẠI, THAY THẾ KHÁCH HÀNG, CHỌN, HIỂN THỊ XEM, SUPER

Tuy nhiên, đối với việc sử dụng SST của xtrabackup, chỉ các đặc quyền sau mới quan trọng:

  • QUÁ TRÌNH, TẢI LẠI, THAY THẾ KHÁCH HÀNG

Do đó, câu lệnh GRANT cho SST có thể được thu nhỏ thành:

mysql> GRANT PROCESS,RELOAD,REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY '[email protected]@sTr0nG%%P4ssW0rD';

Sau đó, định cấu hình wsrep_sst_auth tương ứng bên trong tệp cấu hình MySQL:

wsrep_sst_auth = sstuser:[email protected]@sTr0nG%%P4ssW0rD

Chỉ cấp SST cho người dùng localhost và sử dụng mật khẩu mạnh. Tránh sử dụng người dùng root làm tài khoản SST, vì nó sẽ làm lộ mật khẩu gốc bên trong tệp cấu hình dưới biến này. Ngoài ra, việc thay đổi hoặc đặt lại mật khẩu gốc MySQL sẽ phá vỡ SST trong tương lai.

Tăng cường bảo mật MySQL

Galera Cluster là một plugin sao chép đa tổng thể cho công cụ lưu trữ InnoDB, chạy trên MySQL và MariaDB fork. Do đó, các khuyến nghị tăng cường bảo mật MySQL / MariaDB / InnoDB tiêu chuẩn cũng áp dụng cho Galera Cluster.

Chủ đề này đã được đề cập trong nhiều bài đăng trên blog. Chúng tôi cũng đã đề cập đến chủ đề này trong các bài đăng blog sau:

  • Mười mẹo về cách đạt được bảo mật MySQL và MariaDB
  • Mẹo &Thủ thuật ClusterControl:Bảo mật Cài đặt MySQL của bạn
  • Cách bảo mật Cơ sở dữ liệu nguồn mở của bạn bằng ClusterControl

Các bài đăng trên blog tóm tắt sự cần thiết của việc mã hóa dữ liệu ở trạng thái nghỉ và dữ liệu đang chuyển, có các plugin kiểm tra, nguyên tắc bảo mật chung, các phương pháp hay nhất về bảo mật mạng, v.v.

Sử dụng Cân bằng tải

Có một số công cụ cân bằng tải cơ sở dữ liệu (proxy ngược) có thể được sử dụng cùng với Galera - HAProxy, ProxySQL và MariaDB MaxScale để kể tên một số trong số chúng. Bạn có thể thiết lập bộ cân bằng tải để kiểm soát quyền truy cập vào các nút Galera của mình. Đó là một cách tuyệt vời để phân phối khối lượng công việc cơ sở dữ liệu giữa các phiên bản cơ sở dữ liệu, cũng như hạn chế quyền truy cập, ví dụ:nếu bạn muốn đưa một nút ngoại tuyến để bảo trì hoặc nếu bạn muốn giới hạn số lượng kết nối được mở trên các nút Galera. Bộ cân bằng tải sẽ có thể xếp hàng các kết nối và do đó cung cấp một số biện pháp bảo vệ quá tải cho các máy chủ cơ sở dữ liệu của bạn.

ProxySQL, một proxy ngược cơ sở dữ liệu mạnh mẽ hiểu MySQL và MariaDB, có thể được mở rộng với nhiều tính năng bảo mật hữu ích như tường lửa truy vấn, để chặn các truy vấn vi phạm từ máy chủ cơ sở dữ liệu. Công cụ quy tắc truy vấn cũng có thể được sử dụng để viết lại các truy vấn xấu thành một thứ gì đó tốt hơn / an toàn hơn hoặc chuyển hướng chúng đến một máy chủ khác có thể hấp thụ tải mà không ảnh hưởng đến bất kỳ nút nào của Galera. MariaDB MaxScale cũng có khả năng chặn các truy vấn dựa trên biểu thức chính quy với bộ lọc Tường lửa cơ sở dữ liệu của nó.

Một lợi thế khác có bộ cân bằng tải cho Cụm Galera của bạn là khả năng lưu trữ dịch vụ dữ liệu mà không để lộ tầng cơ sở dữ liệu lên mạng công cộng. Máy chủ proxy có thể được sử dụng làm máy chủ pháo đài để có quyền truy cập vào các nút cơ sở dữ liệu trong mạng riêng. Bằng cách cách ly cụm cơ sở dữ liệu với thế giới bên ngoài, bạn đã loại bỏ một trong những vectơ tấn công quan trọng.

Đó là nó. Luôn giữ an toàn và được bảo vệ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để xem tất cả các khóa ngoại cho một bảng hoặc cột?

  2. JSON_PRETTY () - Định dạng tài liệu JSON để dễ đọc hơn trong MySQL

  3. '0000-00-00 00:00:00' không thể được biểu thị dưới dạng java.sql. Lỗi dấu thời gian

  4. Mô phỏng ORDER BY FIELD () của MySQL trong Postgresql

  5. MySQL Trigger để ngăn INSERT trong các điều kiện nhất định