連線至 VM

Google Distributed Cloud (GDC) air-gapped 會使用金鑰型 SSH 驗證機制,建立與 Linux 虛擬機器 (VM) 執行個體的連線。根據預設,系統不會為 Linux VM 上的本機使用者設定密碼。

事前準備

連線至 VM 前,請務必符合下列先決條件:

  • 啟用存取權管理。 如果未在訪客環境中啟用存取權管理,就無法繼續操作。根據預設,新 VM 會啟用存取權管理功能。
  • 啟用 VM 外部存取權,允許傳輸控制通訊協定 (TCP) 通訊埠 22 上的任何對等互連項目存取 VM。
    • 如果是 Windows VM,請在通訊埠 3389 上啟用 VM 外部存取權。
  • 在 VM 所在的專案中,設定 ProjectNetworkPolicy (PNP) 自訂資源。
    • 在專案中設定 PNP 後,您就能存取專案或機構外部的 VM。
    • 如要診斷是否沒有 PNP,請洽詢基礎架構作業員 (IO)。
  • 叢集的登入存取權。按照「登入」中的 CLI 步驟登入叢集。
如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。 Distributed Cloud 的所有指令都使用 gdcloudkubectl CLI,且需要 Linux 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  2. 使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER

要求權限和存取權

如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。按照步驟驗證您在 VM 所在專案的命名空間中,是否具備專案 VirtualMachine 管理員 (project-vm-admin) 角色。

如要使用 GDC 控制台或 gdcloud CLI 執行 VM 作業,請要求專案 IAM 管理員同時指派專案 VirtualMachine 管理員角色和專案檢視者 (project-viewer) 角色。

建立 VM 連線

本節說明如何連線至 Linux 和 Windows VM。

連線至 Linux VM

如要連線至 Linux VM,請使用 GDC 控制台、gdcloud CLI 或 Virtual Machine Manager API

控制台

  1. 在導覽選單中,依序點選「Virtual Machines」>「Instances」

  2. 在 VM 清單中,找出要連線的執行中 VM 所在列。在「連線」欄中,按一下「SSH」

  3. 系統會開啟 SSH 瀏覽器終端機。在 Shell 中輸入任何指令,或按一下「FTP」FTP瀏覽檔案結構並上傳檔案。

gdcloud

執行 gdcloud compute ssh 指令,透過 SSH 連線至 VM

gdcloud compute ssh VM_NAME --project=PROJECT_ID

請替換下列變數:

  • VM_NAME:VM 名稱。
  • PROJECT_ID:包含 VM 的專案 ID。

如果已為 CLI 設定預設屬性,則可省略此指令中的 --project 旗標。例如:

gdcloud compute ssh VM_NAME

API

連線至 VM:

  • 開啟終端機。
  • 建立 SSH 金鑰組。
  • 上傳公開金鑰和使用者名稱,並設定存留時間 (TTL) 值。

GDC 會擷取 SSH 金鑰和使用者名稱,並以該使用者名稱建立使用者帳戶。在 Linux VM 上,GDC 會將公開金鑰儲存在 VM 上的使用者 ~/.ssh/authorized_keys 檔案中。

如要透過指令列連線至 VM,請完成下列步驟:

  1. 建立 SSH 金鑰組和使用者名稱。

    在 Linux 和 macOS 工作站上,使用 ssh-keygen 公用程式建立新的 SSH 金鑰組。下列程式碼範例會建立 RSA (Rivest-Shamir-Adleman) 金鑰組:

    ssh-keygen -t rsa -f ~/.ssh/KEY_FILENAME -C USERNAME -b 2048
    

    使用下列定義替換變數。

    變數定義
    KEY_FILENAME 安全殼層金鑰檔案的名稱。舉例來說,my-ssh-key 檔案名稱會產生名為 my-ssh-key 的私密金鑰檔案,以及名為 my-ssh-key.pub 的公開金鑰檔案。
    USERNAME VM 上的使用者名稱,例如 testusertestuser_gmail_com

    ssh-keygen 公用程式會將私密金鑰檔案儲存在 ~/.ssh/KEY_FILENAME 路徑,並將公開金鑰檔案儲存在 ~/.ssh/KEY_FILENAME.pub 路徑。

    使用者 testuser 的公開金鑰類似於下列範例:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
    
  2. 將金鑰上傳至 VM,並使用金鑰的公開金鑰、使用者名稱和存留時間 (TTL) 值建立 Kubernetes 資源。

    以下範例使用 access_request.yaml 檔案,透過 KEY_FILENAME 私密金鑰授與 VM 執行個體存取權,TTL 值為十分鐘:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineAccessRequest
    metadata:
      namespace: VM_NAMESPACE
      name: AR_NAME
    spec:
      ssh:
        key: |
          ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... cloudysanfrancisco
        ttl: 10m
      user: USERNAME
      vm: VM_NAME
    

    使用下列定義替換變數:

    變數定義
    VM_NAMESPACE VM 的命名空間。
    AR_NAME 存取要求名稱。
    USERNAME VM 上的使用者名稱,例如 testusertestuser_gmail_com
    VM_NAME VM 執行個體的名稱。
  3. 建立金鑰:

    kubectl create -f access_request.yaml --kubeconfig MANAGEMENT_API_SERVER
    
  4. 查看存取權要求狀態:

    kubectl get virtualmachineaccessrequests.virtualmachine.gdc.goog -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
    

    VM_NAMESPACE 替換為 VM 的命名空間。

    configured 狀態表示您可以連線至 VM。

  5. 連線至 VM:

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
    

    替換下列值:

    • PATH_TO_PRIVATE_KEY,並提供與您新增至 VM 的公開金鑰對應的私密安全殼層金鑰檔案路徑。
    • USERNAME,其中 USERNAME 是您在建立 SSH 金鑰時指定的使用者名稱。例如 cloudysanfrancisco_example_comcloudysanfrancisco
    • EXTERNAL_IP,並將 VM 的連入外部 IP 位址填入其中。

疑難排解

本節說明如何排解建立存取要求後,連線至 VM 執行個體時可能發生的問題。

請按照下列步驟找出可能的問題:

  1. 確認 VM 正在執行中。在下列指令中,將可編輯的變數替換為您的值:

    kubectl get virtualmachines.virtualmachine.gdc.goog VM_NAME -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
    

    如果 VM 未執行,您就無法連線或設定新要求。

  2. 確認 VM 已執行幾分鐘。如果 VM 剛啟動,SSH 存取所需的服務可能尚未執行。通常會在開機後五分鐘內執行。

  3. 確認存取要求未超過 TTL 值。時間達到存留時間值後,系統就會移除金鑰。

  4. 如果 VirtualMachineAccessRequest 顯示 configured 狀態,請確認下列規定:

    1. 在通訊埠 22 上啟用資料移轉功能
    2. 您的機器會將路徑導向 VM。舉例來說,您可以使用
      curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 指令檢查路徑。
  5. 如果 VirtualMachineAccessRequest 顯示 failed 狀態,請查看完整狀態並檢查錯誤訊息,瞭解導致請求失敗的原因:

    kubectl describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
    

    將上述指令中可編輯的變數替換為您自己的值。

  6. 如果 VirtualMachineAccessRequest 狀態空白,可能表示訪客環境未執行。

連線至 Windows VM

如要連線至 Windows VM,必須透過遠端桌面應用程式使用遠端桌面通訊協定 (RDP)。如要透過 RDP 存取 VM,您需要從 GDC 控制台或 Virtual Machine Manager API 的 VirtualMachinePasswordResetRequest 自訂資源擷取的密碼。

繼續操作前,請先安裝遠端桌面用戶端。請使用下列連結,根據您的作業系統完成相關步驟。如要存取連結,必須連上網際網路。

https://remmina.org/how-to-install-remmina/

如要建立 Windows VM 連線,請完成下列步驟:

主控台

  1. 在導覽選單中,依序點選「Virtual machines」>「Instances」(虛擬機器 > 執行個體)
  2. 在 VM 清單中,搜尋要連線的執行中 Windows VM。
  3. 在「動作」欄中,按一下「重設密碼」。系統會顯示「設定新的 Windows 密碼」對話方塊。
  4. 在「使用者名稱」欄位中輸入使用者名稱。
  5. 按一下 [Set] (設定)。系統會顯示「New Windows password」(新的 Windows 密碼) 對話方塊,並隨機產生密碼。這個密碼包含英數字元和非英數字元。
  6. 按一下 「複製」
  7. 前往遠端桌面用戶端,然後選取使用者名稱。
  8. 在「密碼」輸入欄位中輸入密碼。
  9. 按下 ENTERRETURN 鍵。

API

  1. 產生 RSA 金鑰。您需要這個金鑰,才能從 VirtualMachinePasswordResetRequest 資源擷取密碼。

    openssl genrsa -out private-key.pem 2048
    # Get the RSA public key
    openssl rsa -in private-key.pem -outform PEM -pubout
    
  2. 建立 YAML 檔案。

  3. 上傳您產生的 RSA 金鑰、VM 名稱和您提供的使用者名稱,以存取遠端桌面用戶端:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: VM_NAMESPACE
      name: PRR_NAME
    spec:
      vmName: VM_NAME
      user: USERNAME
      publicKey: PUBLIC_KEY
    

    使用下列定義替換變數:

    變數 定義
    VM_NAMESPACE VM 所在的命名空間名稱。
    PRR_NAME 您為密碼重設要求指定的名稱。例如 vmprr2
    VM_NAME VM 的名稱。例如 vm-test
    USERNAME 您提供的使用者名稱,可透過遠端桌面用戶端登入 VM。例如 test-user
    PUBLIC_KEY 您在步驟 2 中產生的 RSA 金鑰。PUBLIC_KEY 必須採用多行格式。

    以下 YAML 檔案範例顯示執行密碼重設要求所需的值和格式:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: test-namespace
      name: vmprr2
    spec:
      vmName: vm2
      user: test-user
      publicKey: |-
       -----BEGIN PUBLIC KEY-----
    
       # Input the RSA key data in multi-line format.
    
       -----END PUBLIC KEY-----
    
  4. 套用檔案內容:

    kubectl --kubeconfig=MANAGEMENT_API_SERVER apply -f FILENAME
    

    FILENAME 替換為密碼重設要求檔案的名稱。

  5. 查看 VirtualMachinePasswordResetRequest 資源的狀態。 如果 VM 處於 Running 狀態,資源會在 1 分鐘內產生密碼。

    kubectl --kubeconfig=MANAGEMENT_API_SERVER describe \
      -n VM_NAMESPACE PRR_NAME
    

    找出包含產生密碼的 status.encryptedPassword 欄位。

  6. 複製 status.encryptedPassword 中的值,然後解密產生的密碼:

    echo ENCRYPTED_PASSWORD | base64 -d > PASSWORD_FILENAME
    openssl pkeyutl -decrypt -in PASSWORD_FILENAME -inkey private-key.pem \
      -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1
    

    更改下列內容:

    • ENCRYPTED_PASSWORD:從 status.encryptedPassword 欄位產生的密碼。
    • PASSWORD_FILENAME:用於儲存 Base64 解碼密碼的暫時檔案。

    之後,您會看到解密後的密碼,可透過遠端桌面協定連線至 VM。

  7. 開啟遠端桌面用戶端,然後按一下「遠端連線設定檔」。 系統會顯示連線對話方塊。

  8. 在「Basic」分頁中,在下列欄位輸入值:

    • 伺服器:VM 外部存取狀態的連入 IP 位址,並附加 VM 外部存取通訊埠號碼。如要擷取 Ingress IP 位址,請參閱「Ingress」。
    • 使用者名稱:您在密碼重設要求中指定的使用者名稱。 例如:test-user
    • 密碼:從密碼重設要求的狀態解密的產生密碼。
  9. 按一下「儲存並連線」