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

本教學課程將帶您瞭解如何在 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 用戶端執行個體

  • Create a Compute Engine instance. Configure the instance as follows:
    • Name the instance 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 伺服器執行個體

    • 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
      • 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. 如要連線至 my-client 執行個體,請使用 ssh 指令。
        2. 更新 apt-get 套件管理員。
          sudo apt-get update
          
        3. 安裝 MySQL 用戶端套件。
          sudo apt-get -y install mysql-client-5.7

        安裝 MySQL 伺服器

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

        1. 如要連線至 my-server 執行個體,請使用 ssh 指令。
        2. 更新 apt-get 套件管理員。
          sudo apt-get update
          
        3. 安裝 MySQL 伺服器套件。
          sudo apt-get -y install mysql-server-5.7

        提升 MySQL 安裝程序的安全性

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

        1. my-server 執行個體的 SSH 工作階段中,使用下列指令提升 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 中的設定。將 [ZONE] 替換為您的 Google Cloud 區域。

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

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

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

        1. 在 Cloud Shell 中,使用 SSH 連線至 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。 Google Cloud 在已建立安全防護程序的非預設環境中,您可能需要建立防火牆規則,讓 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 位址繫結。