使用mysql cli時,要避免每次連線時輸入密碼可以將連線參數寫到.my.cnf檔。mysql
與mysqldump
皆可讀取該檔案內的連線資訊。但將連線資訊明文寫在檔案中可能不夠安全。
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傳回主機。整個解密過程中,私鑰都不曾外洩至裝置外。