如何在Ubuntu上的MariaDB Galera群集中加密複製流量

之前,我們討論了如何在Ubuntu上設置MariaDB Galera多主群集。 默認情況下,MariaDB Galera群集中的複製流量未加密。 本教程將向您展示如何啟用TLS加密,以便群集中的節點可以通過公共Internet安全地相互通信。 Galera群集中有兩種類型的複製流量:

  • 狀態轉移
  • 寫集複製

什麼是國家轉移?

狀態轉移是將數據庫從一個節點複製到另一個節點的過程。 發送數據的節點稱為施主。 接收數據的節點稱為連接器。 狀態轉移有兩種:

  • 快照狀態傳輸(SST):複製整個數據庫
  • 增量狀態傳輸(IST):僅複製數據修改

當新節點加入群集時,因為它不包含數據,所以使用SST(又名節點配置)。 當斷開連接的節點重新加入群集時,將使用IST。

了解SST

有5種SST方法:

  • wsrep_sst_rsync:默認方法
  • wsrep_sst_mysqldump:最慢的方法
  • wsrep_sst_mariabackup:非阻塞方法
  • wsrep_sst_xtrabackup
  • wsrep_sst_xtrabackup-v2

同步 是默認的SST方法,並且是最快的方法。 建議您不要使用 xtrabackup 要麼 xtrabackup-v2 方法,因為它們不適用於MariaDB 10.3或更高版本,並且不支持GTID和靜態數據加密。

我個人更喜歡 mariabackup 因為它在狀態轉移期間不會阻塞施主節點,這是從xtrabackup方法繼承的優勢。 Rsync和mysqldump要求供體在傳輸過程中通過 flush tables with read lock 命令。 mariabackup SST方法是xtrabackup-v2 SST方法的分支,它依賴於 mariabackupsocat 命令行實用程序。

要將mariabackup設置為SST方法,請先安裝 socatmariabackup 在群集中的每個節點和聯接器節點上。

sudo apt install socat

如果您是從默認的Ubuntu存儲庫中安裝MariaDB的,則可以從以下位置安裝mariabackup實用程序: mariadb-client-10.1 包。

sudo apt install mariadb-client-10.1

如果從mariadb.org存儲庫安裝了最新版本的MariaDB,則需要使用以下命令安裝mariabackup。

sudo apt install mariadb-backup

然後將以下兩行添加到 [mysqld] MariaDB配置文件的主單元,位於集群中的每個節點和聯接器節點上。

[mysqld]
...
wsrep_sst_method = mariabackup
wsrep_sst_auth = mariabackup:your_password

第一行指定將mariabackup用於SST方法,第二行定義用於身份驗證的用戶名和密碼。

接下來,在集群中已經存在的節點上登錄MariaDB監視器,並創建數據庫用戶並授予必要的權限。 (請注意,您不需要在每個節點上運行以下命令。數據將自動複製到其他節點。)

create user 'mariabackup'@'localhost' identified by 'your_password';
grant reload, process, lock tables, replication client on *.* to 'mariabackup'@'localhost';

刷新特權表並退出;

flush privileges;

exit;

在每個節點上一個接一個地重新啟動MariaDB服務器,然後在連接器節點上重新啟動MariaDB服務器。

sudo systemctl restart mariadb

加密Mariabackup SST

您可以使用openssl創建自簽名TLS證書,但是我將使用為Web服務器配置的現有“讓我們加密TLS”證書。 要在mariabackup SST上啟用TLS加密,請打開MariaDB主配置文件(/etc/mysql/mariadb.conf.d/50-server.cnf 要麼 /etc/mysql/my.cnf),並添加以下幾行 在文件末尾。 根據需要替換路徑名。

[sst]
encrypt=4
tkey=/etc/letsencrypt/live/linuxbabe.com/privkey.pem
tcert=/etc/letsencrypt/live/linuxbabe.com/cert.pem
tca=/etc/letsencrypt/live/linuxbabe.com/chain.pem

encrypt 變量有5個可能的值:0、1、2、3、4。 0 表示加密被禁用。 123 不再工作了。 保存並關閉文件。 的 mysql 用戶需要訪問上述SSL文件的權限,因此您需要使用以下命令授予讀取權限。

sudo setfacl -R -m "u:mysql:rx" /etc/letsencrypt/archive/

sudo setfacl -R -m "u:mysql:rx" /etc/letsencrypt/live/

請注意,您需要在集群中的所有節點上使用相同的TLS證書和私鑰,然後重新啟動整個Galera集群以使更改生效。

請注意,在SST期間, /var/lib/mysql/ 用戶添加的目錄將被刪除。

了解IST

當斷開連接的節點重新加入群集時,將使用IST。 群集中的所有節點都維護一個Galera緩存(GCache),又名寫集緩存,其中包含節點提交的寫集。 當斷開連接的節點重新加入群集時,它會請求來自捐助者的GCache的增量狀態傳輸。 IST不會鎖定捐助者。

顯然,IST比SST快,因為它僅傳輸修改。 但是,如果施主的GCache不足以存儲聯接程序所需的所有寫集,則將啟動SST。 為了避免SST,可以增加GCache的大小。 默認值為128MB,您可以在MariaDB監視器上使用以下命令進行檢查。

show variables like 'wsrep_provider_options'G

與GCache相關的值如下:

gcache.dir = /var/lib/mysql/; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /var/lib/mysql//galera.cache; gcache.page_size = 128M; gcache.recover = no; gcache.size = 128M;

GCache文件位於 /var/lib/mysql/galera.cache 並且它的大小已預先分配。 要增加GCache的大小,您需要在其中添加以下行 [mysqld] MariaDB配置文件的單位。

wsrep_provider_options="gcache.size = 1G"

將1G替換為您首選的緩存大小。 您可以使用此指令計算自定義寫集緩存大小。 還建議設置 gcache.recover 參數 yes,因此一個節點可以嘗試在啟動時恢復其Gcache並繼續向其他加入節點提供IST。

wsrep_provider_options="gcache.size = 1G; gcache.recover = yes"

在群集中的每個節點上應用相同的配置,然後一次重新啟動它們。

加密IST

我嘗試使用“讓我們加密TLS”證書加密IST通信,但是當節點加入群集時,我總是在錯誤日誌文件中收到以下錯誤。

[ERROR] WSREP: handshake with remote endpoint ssl://xx.xx.xx.xx:4567 failed: asio.ssl:337047686: 'certificate verify failed' ( 337047686: 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed')

因此,我創建了一個自簽名服務器證書和私鑰。 步驟如下。

創建一個目錄以保存SSL文件。

sudo mkdir /etc/ssl/mysql/

更改目錄。

cd /etc/ssl/mysql/

生成CA密鑰文件:

sudo openssl genrsa 2048 > ca-key.pem

生成CA證書文件:

sudo openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem

您將需要回答一些問題。 我剛剛輸入了國家代碼和組織名稱。

生成服務器密鑰文件。 您還需要回答一些問題並輸入密碼來保護密鑰。

sudo openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem

刪除密碼。

sudo openssl rsa -in server-key.pem -out server-key.pem

生成服務器證書文件:

openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

然後使用以下命令將所有文件複製到集群中的其他節點: scp 實用程序,建議將它們存儲在同一目錄中(/etc/ssl/mysql/)。 還要確保mysql用戶具有讀取所有SSL文件的權限。

sudo chown mysql:mysql /etc/ssl/mysql/ -R
sudo chmod 400 /etc/ssl/mysql/*
sudo chmod 700 /etc/ssl/mysql/

之後,打開MariaDB主配置文件(/etc/mysql/mariadb.conf.d/50-server.cnf 要麼 /etc/mysql/my.cnf),然後在 [mysqld] 單元。

wsrep_provider_options="socket.ssl_key=/etc/ssl/mysql/server-key.pem;socket.ssl_cert=/etc/ssl/mysql/server-cert.pem;socket.ssl_ca=/etc/ssl/mysql/ca.pem"

如果您還有其他wsrep提供程序選項,則需要將它們組合在一起,如下所示。

wsrep_provider_options="gcache.size = 1G; gcache.recover = yes;socket.ssl_key=/etc/ssl/mysql/server-key.pem;socket.ssl_cert=/etc/ssl/mysql/server-cert.pem;socket.ssl_ca=/etc/ssl/mysql/ca.pem"

配置集群中的每個節點,然後重新啟動整個集群以使更改生效。 如果一切順利,您的節點將能夠加入群集,並且您可以在MariaDB日誌中看到如下消息,表明IST已加密。 (IST使用TCP端口4568。)

2019-03-19 14:40:03 1 [Note] WSREP: IST sender using ssl
2019-03-19 14:40:03 0 [Note] WSREP: async IST sender starting to serve ssl://xx.xx.xx.xx:4568 sending 166613-167529

加密寫集複製流量

寫集複製是普通的同步複製,節點將數據修改發送到所有其他節點。 實際上,寫集複製使用與IST相同的加密機制。 如果您為IST啟用了TLS加密,則寫集複製也會被加密,並且在MariaDB日誌中會看到以下消息,表明寫集複製已通過TLS保護。 (寫集複製使用TCP端口4567。)

SSL handshake successful, remote endpoint ssl://xx.xx.xx.xx:4567 local endpoint ssl://xx.xx.xx.xx:37118 cipher: TLS_AES_256_GCM_SHA384 compression: none

結論

我希望本教程可以幫助您加密MariaDB Galera集群中的複製流量。 在下一個教程中,我們將看到如何將主從複製與MariaDB Galera集群結合在一起。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 保重🙂

Sidebar