在 Compute Engine 上設定透過私人 IP 位址存取 MySQL 的用戶端存取權。

本教學課程將帶您瞭解如何在 Google Cloud Platform (GCP) 的私人網路上執行 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 執行個體並安裝 MySQL 用戶端。
  • 設定 MySQL 伺服器以進行遠端存取。
  • 移除 MySQL 伺服器的公開存取權。
  • 遠端連線到 MySQL。
  • 建立 VPC Service Controls 防火牆規則。

費用

本教學課程使用下列 Google Cloud Platform 計費元件:

  • Compute Engine
  • Cloud Storage

您可以使用 Pricing Calculator,根據您的預測使用量來產生預估費用。 初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. 啟用Compute Engine API。

    啟用 API

完成此教學課程後,您可刪除已建立的資源以免繼續計費。詳情請參閱清除所用資源一節。

建立 Compute Engine 執行個體

為 MySQL 建立兩個執行個體:用戶端和伺服器執行個體

建立 Compute Engine 用戶端執行個體

  • 建立新的 Compute Engine 執行個體。執行個體的設定方式如下:
    • 將執行個體命名為my-client
    • --zone 標記設定為您要建立執行個體的區域
    • --image-project 標記設定為 ubuntu-os-cloud
    • --image-family 標記設定為 ubuntu-1804-lts
    • --scopes 標記設定為https://www.googleapis.com/auth/cloud-platform
    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
  • 建立 Compute Engine 伺服器執行個體

  • 建立新的 Compute Engine 執行個體。執行個體的設定方式如下:
    • 將執行個體命名為my-server
    • --zone 標記設定為您要建立執行個體的區域
    • --image-project 標記設定為 ubuntu-os-cloud
    • --image-family 標記設定為 ubuntu-1804-lts
    • --scopes 標記設定為https://www.googleapis.com/auth/cloud-platform
    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。

    1. 更新 apt-get 套件管理員。
      sudo apt-get update
      
    2. 安裝 MySQL 用戶端套件。
      sudo apt-get -y install mysql-client-5.7

    安裝 MySQL 伺服器

    下列步驟說明如何在 Compute Engine 執行個體上安裝 MySQL。

    1. 更新 apt-get 套件管理員。
      sudo apt-get update
      
    2. 安裝 MySQL 伺服器套件。
      sudo apt-get -y install mysql-server-5.7

    提升 MySQL 安裝程序的安全性

    您必須為 MySQL 建立根密碼,然後在您的 MySQL 伺服器設定上執行基本的安全性維護。詳情請參閱 MySQL 的 mysql_secure_installation 說明文件。

    1. 在 Cloud Shell 中,提升 MySQL 安裝程序的安全性。

      sudo mysql_secure_installation
      
    2. 按下 enter 鍵即可略過設定 VALIDATE PASSWORD 外掛程式的步驟。

    3. 輸入新的根密碼兩次。

    4. 如要移除匿名使用者,請輸入 Y,然後按下 enter 鍵。

    5. 如要禁止遠端 root 登入,請輸入 Y,然後按下 enter 鍵。

    6. 如要移除測試資料庫,請輸入 Y,然後按下 enter 鍵。

    7. 如要重新載入權限資料表,請輸入 Y,然後按下 enter 鍵。

    設定 MySQL 伺服器

    您必須先設定 MySQL 伺服器以監聽其內部 IP 位址,才能遠端連線至 MySQL 伺服器。接著為 MySQL 用戶端建立一個非超級使用者的帳戶來連線至伺服器。

    所有 MySQL 用戶端指令都必須包含具體的指令列標記 (例如驗證指令)。在這個部分中的 MySQL 指令會包含以下標記:--user 用於使用者名稱、-p 用於密碼、-e 則用來執行指定的陳述式並立即結束操作。詳情請參閱 MySQL 5.7 命令選項參考資料

    1. 在 Cloud Shell 中,使用 SSH 連線至 my-server 執行個體。

    2. 使用下列資訊更新 /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
      
    3. 重新啟動 MySQL 服務以將變更套用到執行中的伺服器。

      sudo service mysql restart
      
    4. 確認伺服器是在本機環境中執行。使用您在上一個步驟建立的 MySQL 伺服器根密碼取代 [ROOT_PASSWORD]

      sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
      

      輸出內容會與以下所示內容類似:

      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | sys                |
      +--------------------+
      

    建立 MySQL 使用者

    以超級使用者進行遠端連線會遭到使用上述的 mysql_secure_installation 指令停用。您必須建立新的使用者並授予必要權限,才能允許遠端連線。

    1. 在 Cloud Shell 中,建立 my-client 內部 IP 位址的環境變數。

      CLIENT_IP=$(gcloud compute instances describe my-client \
          --zone=[ZONE] \
          --format='value(networkInterfaces[0].networkIP)')
      
    2. 使用密碼建立新的 MySQL 使用者。用您的密碼取代 [MY_PASSWORD],並用您的 MySQL 超級使用者密碼取代 [ROOT_PASSWORD]

      sudo mysql -uroot -p[ROOT_PASSWORD] \
          -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
      
    3. 授予新的 MySQL 使用者授權,以透過 my-client 的內部 IP 位址登入伺服器。

      sudo mysql -uroot -p[ROOT_PASSWORD] -e \
          "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \
          IDENTIFIED BY '[MY_PASSWORD]';"
      

    移除 my-server 的外部 IP 位址

    my-server 執行個體不需要外部 IP 位址,因為用戶端可透過內部 IP 位址來存取 my-server

    • 如要移除外部 IP 位址,請更新 Cloud Shell 中的設定。使用您的 GCP 區域取代 [ZONE]

      gcloud compute instances delete-access-config my-server \
          --access-config-name "external-nat" \
          --zone="[ZONE]"
      

    驗證用戶端對伺服器執行個體的遠端存取權。

    下列步驟會說明如何從您的 my-client 執行個體連線至 my-server 上的 MySQL 伺服器。

    1. 在 Cloud Shell 中使用 SSH to 連線至 my-client 執行個體。
    2. 藉由列出資料庫來測試連線狀況。

      sudo mysql --host=my-server --user=TESTUSER \
          --password=[MY_PASSWORD] -e "SHOW DATABASES;"
      

      輸出內容會與以下所示內容類似:

      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | sys                |
      +--------------------+
      

    這些步驟會確認您的 MySQL 用戶端可以成功透過內部 IP 位址連線至 MySQL 伺服器。

    在實際工作環境中的防火牆注意事項

    預設網路設定已包括防火牆規則 default-allow-internal,這個規則允許在廣泛的通訊埠上進行 Compute Engine 執行個體之間的內部流量,其中也包括通訊埠 3306。在已建立安全防護程序的非預設環境中,您可能會需要建立防火牆規則,讓您的 my-client 執行個體透過網路與您的 my-server 執行個體通訊。

    您可以依據 IP 位址範圍或標記設定防火牆規則。如果您要授予廣泛的內部 IP 位址的存取權,則適合使用 IP 位址範圍。如果您要授予網路上特定執行個體的存取權,則標記會是比較有彈性的方式。標記可讓您輕鬆新增用戶端,而不需要授予廣泛 IP 位址的存取權。只需要將適當的標記指派給新的 MySQL 用戶端執行個體即可。舉例來說,您可以建立新防火牆規則,讓所有用戶端執行個體傳出的流量都加上 mysql-client 標記。

    要使用標記支援防火牆規則,您可以將適當的標記指派給 Cloud Shell 中的 my-clientmy-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 標記的執行個體通訊。

    • 在 Cloud Shell 中建立防火牆規則,允許 mysql-clientmysql-server 的通訊。

      gcloud compute firewall-rules create "mysql-remote-access" \
          --allow tcp:3306 --source-tags "mysql-client" \
          --target-tags "mysql-server"
      

    現在您可以從 my-client 連線到 MySQL 了。

    外部客戶端的存取權注意事項

    本教學課程說明如何透過 MySQL 用戶端存取同樣在 Compute Engine 上執行的 MySQL 伺服器。如何允許不在 Compute Engine 上執行的用戶端進行存取不在本課程的說明範圍。如要允許非 Compute Engine 的存取權,請修改以下內容:

    • 將外部 IP 位址新增到 my-server 以允許外部連線。
    • 將外部客戶端的來源 IP 位址新增到防火牆規則
    • 修改 TESTUSER 帳戶或建立使用者帳戶,帳戶會與您外部用戶端的來源 IP 位址繫結。

    清除

    如要避免系統向您的 GCP 帳戶收取您在本教學課程中所用資源的相關費用, 您可以 刪除專案刪除執行個體

    刪除專案

    如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

    如要刪除專案,請執行以下操作:

    1. 前往 GCP 主控台的「Projects」(專案) 頁面。

      前往「Projects」(專案) 頁面

    2. 在專案清單中,找到您要刪除的專案並按一下「刪除」圖示 delete
    3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

    刪除執行個體

    如何刪除 Compute Engine 執行個體:

    1. 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體頁面

    2. 找到您的my-server執行個體,然後按一下旁邊的核取方塊。
    3. 按一下頁面頂端的「刪除」圖示 delete,即可刪除執行個體。

    後續步驟

    本頁內容對您是否有任何幫助?請提供意見:

    傳送您對下列選項的寶貴意見...

    這個網頁
    解決方案