用GPG保護mysql連線資訊

使用mysql cli時,要避免每次連線時輸入密碼可以將連線參數寫到.my.cnf檔mysqlmysqldump皆可讀取該檔案內的連線資訊。但將連線資訊明文寫在檔案中可能不夠安全。

MySQL提供mysql_config_editor工具程式讓使用者能對這類含有機敏資訊的設定檔做混淆(obfuscate)避免以明文儲存。

mysql_config_editor對機敏資訊的保護是“混淆”而非“加密”。

雖然mysql_config_editor使用AES“加密”設定檔的內容,但AES的金鑰是隨機產生一同寫到混淆後的檔案的。也就是說任何人拿到混淆後的檔案,雖然不能一眼看出機敏資訊的明文。但可透過程式取出前置於檔案的金鑰進而解密整個檔案。因此雖然用上了AES,但AES金鑰本身沒特別保護因此只能算得上是混淆。

使用GPG加密機敏資訊

若要加密,我們可以使用gpg。我們可以用gpg加密.my.cnf這類設定檔。利用非對稱金鑰。以公鑰加密、私鑰解密。

加密設定檔

指令:

gpg -r <Your Key ID> [--output=secret.my.gpg] -e .my.cnf

說明:

-r Recipient,加密訊息的接收者:指定GPG用哪一把公鑰加密檔案

[--output=secret.my.gpg] 輸出加密檔的位置。可省略,gpg會將加密內容存至原檔名加入.gpg後綴的位置 (i.e. .my.cnf.gpg)

-e 告訴gpg我們要加密檔案

呼叫mysql前需要先解密設定檔

mysql_config_editor混淆後的設定檔不同,mysql cli/mysqldump等程式無法直接讀取gpg加密後的檔案。即使他們支援gpg格式,也會因為沒有可解密的私鑰而無法取得連線資訊。

因此我們呼叫mysql cli或mysqldump前需要先請gpg解密

Bash

mysql --defaults-extra-file=<(gpg -d --no-symkey-cache ~/.my.cnf.gpg 2>/dev/null)

但每次要連線資料庫就打一長串參數很麻煩,這部分可以透過設置alias簡化:

Bash

alias mysql="mysql --defaults-extra-file==<(gpg -d --no-symkey-cache ~/.my.cnf.gpg 2>/dev/null)"

Fish

alias mysql="mysql --defaults-extra-file=(gpg -d --no-symkey-cache ~/.my.cnf.gpg 2>/dev/null|psub)"

使用gpg加密機敏連線資訊而非混淆,提升了安全性。要讀取機敏資訊必須有對應的gpg私鑰才能解密。

同時,gpg使用非對稱加密。考慮團隊新成員加入時創建新帳號的場景。

若資料庫連線資訊來自DBA、管理員。DBA或管理員可以在創建帳號、帳號密碼前先跟使用者索取GPG公鑰。並使用腳本、程式等自動化方式自動加密帳號密碼。gpg加密後的密文可安全地透過不安全的管道(如:Line或Email)傳送給使用者。只有擁有匹配公鑰之私鑰的人能解密。

以智慧卡或硬體鎖(如:Yubikey)對GPG私鑰提供額外保護

(在量子電腦問世前)使用gpg加解密的安全強度取決於私鑰。因此對於gpg密鑰的保護至關重要。

最簡單的保護方式是使用pin碼加密gpg密鑰。使用者使用密鑰前gpg會詢問pin碼解鎖密鑰。

另一個方式是透過智慧卡或硬體密碼鎖。智慧卡、密碼鎖這類裝置保存私鑰。

使用這類裝置保存私鑰時,私鑰置於硬體內。當gpg需要解鎖時會將資料傳送至此類裝置解密後在透過讀卡機或USB傳回主機。整個解密過程中,私鑰都不曾外洩至裝置外。