本教學課程將帶您瞭解如何在 Google Cloud 的私人網路上執行 MySQL 資料庫,以便透過 Compute Engine 安全地遠端存取資料庫。
如果您要在 Compute Engine 上安裝自己的 MySQL 資料庫,但想將存取權限制在 Compute Engine 上執行的已授權 MySQL 用戶端,請使用本教學課程。由於跨地區執行個體、參數的進階用途,以及特定效能需求,您可能會想要管理自訂的 MySQL 執行個體,而非使用代管服務。
本教學課程說明如何設定您的 MySQL 伺服器應用程式,藉此接受來自 MySQL 用戶端的遠端流量 (該用戶端應安裝在相同私人網路上的 Compute Engine 執行個體中)。
如要瞭解如何選擇適合的 MySQL 部署選項,請參閱如何在 Compute Engine 上安裝 MySQL。
本教學課程假設您熟悉下列項目:
- 基本的 Linux 指令
- Ubuntu 伺服器 18.04
- MySQL 5.7
- Compute Engine
架構
在本教學課程中,您將部署兩個 Compute Engine 執行個體,分別是伺服器和用戶端執行個體,如下圖所示:
建立 Compute Engine 執行個體
為 MySQL 建立兩個執行個體:用戶端和伺服器執行個體
建立 Compute Engine 用戶端執行個體
-
Name the instance
my-client
. -
將
--zone
標記設定為您要在其中建立執行個體的區域。 -
將
--image-project
標記設為ubuntu-os-cloud
。 -
將
--image-family
標記設為ubuntu-1804-lts
。 -
將
--scopes
標記設定為https://www.googleapis.com/auth/cloud-platform
。 -
Create a Compute Engine instance. Configure the instance as follows:
-
Name the instance
my-server
. -
將
--zone
標記設定為您要在其中建立執行個體的區域。 -
將
--image-project
標記設為ubuntu-os-cloud
。 -
將
--image-family
標記設為ubuntu-1804-lts
。 -
將
--scopes
標記設定為https://www.googleapis.com/auth/cloud-platform
。 - 如要連線至
my-client
執行個體,請使用ssh
指令。 - 更新
apt-get
套件管理員。sudo apt-get update
- 安裝 MySQL 用戶端套件。
sudo apt-get -y install mysql-client-5.7
- 如要連線至
my-server
執行個體,請使用ssh
指令。 - 更新
apt-get
套件管理員。sudo apt-get update
- 安裝 MySQL 伺服器套件。
sudo apt-get -y install mysql-server-5.7
在
my-server
執行個體的 SSH 工作階段中,使用下列指令提升 MySQL 安裝程序的安全性。sudo mysql_secure_installation
按下
enter
即可略過設定VALIDATE PASSWORD
外掛程式的步驟。輸入新的根密碼兩次。
如要移除匿名使用者,請輸入
Y
,然後按下enter
鍵。如要禁止遠端 root 登入,請輸入
Y
,然後按下enter
鍵。如要移除測試資料庫,請輸入
Y
,然後按下enter
鍵。如要重新載入權限資料表,請輸入
Y
,然後按下enter
。在 Cloud Shell 中,使用 SSH 連線至
my-server
執行個體。使用下列資訊更新
/etc/mysql/mysql.conf.d/mysqld.cnf
設定檔:LOCAL_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \ -H "Metadata-Flavor: Google") sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnf
重新啟動 MySQL 服務以將變更套用到執行中的伺服器。
sudo service mysql restart
確認伺服器是在本機環境中執行。使用您在上一個步驟建立的 MySQL 伺服器根密碼取代
[ROOT_PASSWORD]
。sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
輸出內容會與以下所示內容類似:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
在 Cloud Shell 中,建立
my-client
內部 IP 位址的環境變數。CLIENT_IP=$(gcloud compute instances describe my-client \ --zone=ZONE \ --format='value(networkInterfaces[0].networkIP)')
使用密碼建立新的 MySQL 使用者。用您的密碼取代
[MY_PASSWORD]
,並用您的 MySQL 超級使用者密碼取代[ROOT_PASSWORD]
。sudo mysql -uroot -p[ROOT_PASSWORD] \ -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
授予新的 MySQL 使用者授權,以透過
my-client
的內部 IP 位址登入伺服器。sudo mysql -uroot -p[ROOT_PASSWORD] -e \ "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \ IDENTIFIED BY '[MY_PASSWORD]';"
如要移除外部 IP 位址,請更新 Cloud Shell 中的設定。將
[ZONE]
替換為您的 Google Cloud 區域。gcloud compute instances delete-access-config my-server \ --access-config-name "external-nat" \ --zone="ZONE"
- 在 Cloud Shell 中,使用 SSH 連線至
my-client
執行個體。 藉由列出資料庫來測試連線狀況。
sudo mysql --host=my-server --user=TESTUSER \ --password=[MY_PASSWORD] -e "SHOW DATABASES;"
輸出內容會與以下所示內容類似:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
在 Cloud Shell 中建立防火牆規則,允許
mysql-client
至mysql-server
的通訊。gcloud compute firewall-rules create "mysql-remote-access" \ --allow tcp:3306 --source-tags "mysql-client" \ --target-tags "mysql-server"
- 將外部 IP 位址新增到
my-server
以允許外部連線。 - 將外部客戶端的來源 IP 位址新增到防火牆規則。
- 修改
TESTUSER
帳戶或建立使用者帳戶,帳戶會與您外部用戶端的來源 IP 位址繫結。
gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform
安裝 MySQL 用戶端
下列步驟說明如何在 Compute Engine 執行個體上安裝 MySQL。
安裝 MySQL 伺服器
下列步驟說明如何在 Compute Engine 執行個體上安裝 MySQL。
提升 MySQL 安裝程序的安全性
您必須為 MySQL 建立根密碼,然後在您的 MySQL 伺服器設定上執行基本的安全性維護。詳情請參閱 MySQL 的
mysql_secure_installation
說明文件。設定 MySQL 伺服器
您必須先設定 MySQL 伺服器以監聽其內部 IP 位址,才能遠端連線至 MySQL 伺服器。接著為 MySQL 用戶端建立一個非超級使用者的帳戶來連線至伺服器。
所有 MySQL 用戶端指令都必須包含具體的指令列標記 (例如驗證指令)。在這個部分中的 MySQL 指令會包含以下標記:
--user
用於使用者名稱、-p
用於密碼、-e
則用來執行指定的陳述式並立即結束操作。詳情請參閱 MySQL 5.7 命令選項參考資料。建立 MySQL 使用者
以超級使用者進行遠端連線會遭到使用上述的
mysql_secure_installation
指令停用。您必須建立新的使用者並授予必要權限,才能允許遠端連線。移除
my-server
的外部 IP 位址my-server
執行個體不需要外部 IP 位址,因為用戶端可透過內部 IP 位址來存取my-server
。驗證用戶端對伺服器執行個體的遠端存取權。
下列步驟說明如何從
my-client
執行個體連線至my-server
上的 MySQL 伺服器。這些步驟會確認您的 MySQL 用戶端可以成功透過內部 IP 位址連線至 MySQL 伺服器。
在實際工作環境中的防火牆注意事項
預設網路設定已包括防火牆規則
default-allow-internal
,這個規則允許在廣泛的通訊埠上進行 Compute Engine 執行個體之間的內部流量,其中也包括通訊埠3306
。 Google Cloud 在已建立安全防護程序的非預設環境中,您可能需要建立防火牆規則,讓my-client
執行個體透過網路與my-server
執行個體通訊。否則這兩個執行個體無法互相通訊。您可以依據 IP 位址範圍或標記設定防火牆規則。如果您要授予廣泛的內部 IP 位址的存取權,則適合使用 IP 位址範圍。如果您要授予網路上特定執行個體的存取權,則標記會是比較有彈性的方式。標記可讓您輕鬆新增用戶端,而不需要授予廣泛 IP 位址的存取權。只需要將適當的標記指派給新的 MySQL 用戶端執行個體即可。舉例來說,您可以建立新防火牆規則,讓所有用戶端執行個體傳出的流量都加上
mysql-client
標記。如要使用標記支援防火牆規則,您可以將適當的標記指派給 Cloud Shell 中的
my-client
和my-server
VM。gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONE
新增防火牆規則
下列步驟說明如何建立新的防火牆規則,以使用通訊埠
3306
讓具有my-client
標記的執行個體與具有my-server
標記的執行個體通訊。現在您可以從
my-client
連線到 MySQL 了。外部客戶端的存取權注意事項
本教學課程說明如何透過 MySQL 用戶端存取同樣在 Compute Engine 上執行的 MySQL 伺服器。如何允許不在 Compute Engine 上執行的用戶端進行存取不在本課程的說明範圍。如要允許非 Compute Engine 的存取權,請修改以下內容:
-
Name the instance
gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform