管理中繼資料中的 SSH 金鑰

本指南說明如何手動建立 SSH 金鑰以及編輯公開 SSH 金鑰中繼資料,藉此控管 Linux 執行個體的存取權限。

您也可以透過 Google Cloud Platform 主控台連線至執行個體,Compute Engine 會自動管理金鑰的完整生命週期,或是使用 SDK 中的 gcloud 指令列,讓 Compute Engine 為您設定永久的 SSH 金鑰中繼資料。

如果您是需要手動管理 SSH 金鑰的進階使用者,請參閱使用 OS 登入管理執行個體存取權一文。如果您在執行個體上使用 OS 登入功能管理 SSH 金鑰,則這些執行個體上依中繼資料提供的 SSH 金鑰設定會遭到停用。

事前準備

此工作需要的權限

如要執行這項工作,您必須具備以下權限

  • 執行個體的 compute.instances.setMetadata 權限 (如要設定有關該執行個體的中繼資料)
  • 專案的 compute.projects.setCommonInstanceMetadata 權限 (如要設定全專案的中繼資料)
  • 專案的 iam.serviceAccounts.actAs 權限 (如要設定全專案的中繼資料)

手動管理金鑰的風險

如果您透過 GCP 主控台、gcloud 指令列工具或 API 自行建立及管理公開 SSH 金鑰,則必須追蹤已使用的金鑰,並針對不應具備存取權的使用者刪除公開 SSH 金鑰。比方說,如果團隊成員離開您的專案,請將他們的公開 SSH 金鑰從中繼資料中移除,以免他們繼續存取您的執行個體。

此外,gcloud 工具或 API 呼叫指定不正確也可能會清除您專案或執行個體中的所有公開 SSH 金鑰,造成專案成員的連線中斷。

如果您不確定是否要管理自己的金鑰,請改為使用 Compute Engine 工具連線至您的執行個體

總覽

藉由建立和管理 SSH 金鑰,您可以讓使用者透過第三方工具存取 Linux 執行個體。

SSH 金鑰由下列檔案組成:

  • 套用至執行個體層級中繼資料或全專案中繼資料的公開 SSH 金鑰檔案。
  • 使用者儲存在其本機裝置上的私密 SSH 金鑰檔案。

如果使用者提供自己的私密 SSH 金鑰,就可以透過第三方工具連線至任何使用相配的公開 SSH 金鑰檔案進行設定的執行個體,即使他們並非您的 Google Cloud Platform 專案成員。因此,您可以透過變更一或多個執行個體的公開 SSH 金鑰中繼資料,控管使用者可以存取的執行個體。

如要編輯 SSH 金鑰中繼資料:

  1. 決定您要用哪種工具來編輯中繼資料:

  2. 如果您需要為 Linux 執行個體新增使用者,請按照以下程序準備好他們的公開 SSH 金鑰:

  3. 編輯公開 SSH 金鑰中繼資料,為 Linux 執行個體新增或移除使用者。

  4. 透過第三方工具連線至您的 Linux 執行個體,確定每個公開 SSH 金鑰都已正確地新增或移除。唯有當使用者的公開 SSH 金鑰可透過中繼資料伺服器提供給執行個體,並且擁有相配的私密 SSH 金鑰時,使用者才能連線至執行個體。

建立新的 SSH 金鑰

如果您目前沒有可用的私密 SSH 金鑰檔案和相配的公開 SSH 金鑰檔案,請產生新的 SSH 金鑰。如果您想要使用現有的 SSH 金鑰,請指定公開 SSH 金鑰檔案的位置

Linux 和 macOS

在 Linux 或 macOS 工作站,您可以使用 ssh-keygen 工具來產生金鑰。

  1. 在您的工作站開啟終端機,然後使用 ssh-keygen 指令產生新的金鑰。指定 -C 標記,新增一個含有您的使用者名稱的註解。

    ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]
    

    其中:

    • [KEY_FILENAME] 是您的 SSH 金鑰檔案所要使用的名稱。例如,一個名為 my-ssh-key 的檔案會產生一個名為 my-ssh-key 的私密金鑰檔案和一個名為 my-ssh-key.pub 的公開金鑰檔案。
    • [USERNAME] 是連線至執行個體的使用者名稱。

    此指令會產生一個私密 SSH 金鑰檔案和一個相配的公開 SSH 金鑰,結構如下:

    ssh-rsa [KEY_VALUE] [USERNAME]
    

    其中:

    • [KEY_VALUE] 是您產生的金鑰值。
    • [USERNAME] 是要對其套用此金鑰的使用者。
  2. 限制對您私密金鑰的存取,使您成為唯一能讀取私密金鑰的人,並防止私密金鑰遭到他人覆寫。

    chmod 400 ~/.ssh/[KEY_FILENAME]
    

    其中 [KEY_FILENAME] 是您的 SSH 金鑰檔案所要使用的名稱。

為每個需要新金鑰的使用者重複此程序。 然後,指定您產生的公開 SSH 金鑰以及任何您要新增至專案或執行個體的現有公開 SSH 金鑰的位置。

Windows

Windows 未內建用於產生 SSH 金鑰的工具,因此如果您使用的是 Windows 工作站,必須使用第三方工具產生 SSH 金鑰。以下說明如何使用 PuTTYgen 工具產生 SSH 金鑰。

  1. 下載 puttygen.exe

  2. 執行 PuTTYgen。在本範例中,請直接執行您所下載的 puttygen.exe 檔案。系統隨即會開啟視窗,讓您在其中配置金鑰產生設定。

  3. 按一下 [Generate] 並按照畫面上的指示操作,產生新的金鑰。在大多數情況下,只須接受預設的參數即可,但您產生的金鑰長度至少須為 2048 位元。產生金鑰後,該工具會顯示您的公開金鑰值。

  4. 在「Key comment」區段中,將現有文字取代為您要對其套用金鑰的使用者名稱。

  5. 或者,您可以輸入 [Key passphrase] 來保障金鑰的安全。

  6. 按一下 [Save private key],將您的私密金鑰寫入副檔名為 .ppk 的檔案中。

  7. 按一下 [Save public key],將您的公開金鑰寫入檔案,以備之後使用。請暫時不要關閉 PuTTYgen 視窗。

    正確格式化的公開金鑰會顯示於 PuTTYgen 畫面上方:

    PuTTYgen 公開金鑰螢幕擷取畫面

    此公開金鑰的結構如下:

    ssh-rsa [KEY_VALUE] [USERNAME]
    

    其中:

    • [KEY_VALUE] 是您產生的金鑰值。
    • [USERNAME] 是要對其套用此金鑰的使用者。

為每個需要為其建立金鑰的使用者重複此程序。 然後,如果您有其他要新增至專案或執行個體的公開 SSH 金鑰,請現在就指定這些公開 SSH 金鑰的位置。否則,請格式化您建立的公開 SSH 金鑰

指定 SSH 金鑰的位置

您可能需要指定 SSH 金鑰的原因有很多。例如,如果要將使用者的公開 SSH 金鑰新增至專案或執行個體,您將需要存取其公開金鑰檔案以取得金鑰。或者,您可能為了連線至 Linux 執行個體而需要指定私密 SSH 金鑰檔案的位置。

建立完成的 SSH 金鑰會儲存於預設的位置。公開和私密 SSH 金鑰檔案的預設儲存位置及名稱會依據建立金鑰時使用的工具而有不同。

Linux 和 macOS

如果您使用 ssh-keygen 工具在 Linux 或 macOS 工作站建立金鑰,金鑰會儲存於以下位置:

  • 公開金鑰檔案:~/.ssh/[KEY_FILENAME].pub
  • 私密金鑰檔案:~/.ssh/[KEY_FILENAME]

其中 [KEY_FILENAME] 是 SSH 金鑰檔案的名稱,亦即您在建立金鑰時設定的名稱。

如果需要為專案或執行個體中繼資料新增或移除公開 SSH 金鑰,請格式化公開 SSH 金鑰檔案

Windows

如果您使用 PuTTYgen 工具在 Windows 工作站建立金鑰,公開金鑰檔案和私密金鑰檔案會儲存於您用以下格式所指定的位置:

  • 公開金鑰:[PUBLIC_KEY_FILENAME]
  • 私密金鑰:[PRIVATE_KEY_FILENAME].ppk

其中 [PUBLIC_KEY_FILENAME][PRIVATE_KEY_FILENAME] 分別是公開和私密 SSH 金鑰的檔案名稱,亦即您初次儲存金鑰時設定的名稱。

使用 PuTTYgen 建立的預設公開 SSH 金鑰應具有以下格式:

ssh-rsa [KEY_VALUE] [USERNAME]

其中:

  • [KEY_VALUE] 是公開 SSH 金鑰值。
  • [USERNAME] 是執行個體中要套用金鑰的使用者。

若要用正確的格式檢視 PuTTYgen 公開 SSH 金鑰:

  1. 執行 PuTTYgen。如果您沒有 PuTTYgen,請下載並執行 puttygen.exe

  2. 按一下 [Load],選取並開啟您的公開 SSH 金鑰檔案。

  3. 公開金鑰檔案載入完成後,正確格式化的公開 SSH 金鑰值會顯示於 PuTTYgen 畫面上方:

    PuTTYgen 公開金鑰螢幕擷取畫面

如果需要為專案或執行個體中繼資料新增或移除公開 SSH 金鑰,請格式化公開 SSH 金鑰檔案

gcloud

如果您已透過 gcloud 工具連線至執行個體,即表示金鑰已產生並已套用至您的專案或執行個體。金鑰檔案會位於下列位置:

  • Linux 和 macOS
    • 公開金鑰:$HOME/.ssh/google_compute_engine.pub
    • 私密金鑰:$HOME/.ssh/google_compute_engine
  • Windows:
    • 公開金鑰:C:\Users\[USERNAME]\.ssh\google_compute_engine.pub
    • 私密金鑰:C:\Users\[USERNAME]\.ssh\google_compute_engine

其中 [USERNAME] 是您在本機工作站的使用者名稱。

如要查看公開 SSH 金鑰的套用對象,請在您的專案中繼資料執行個體中繼資料中搜尋該公開金鑰。如果需要為專案或執行個體中繼資料新增或移除公開 SSH 金鑰,請先格式化公開 SSH 金鑰檔案

格式化公開 SSH 金鑰檔案

將公開 SSH 金鑰上傳至專案或執行個體中繼資料之前,您必須先檢查您打算新增的每個公開 SSH 金鑰檔案的格式。

根據您用來編輯中繼資料的工具而定,格式化您的金鑰,使其能與 GCP 主控台gcloud 指令列工具API 方法搭配運作。您也可以選擇變更公開 SSH 金鑰,以新增、編輯或移除到期時間。

主控台

若要檢查公開 SSH 金鑰的格式:

  1. 找到並開啟公開 SSH 金鑰檔案。

  2. 檢查公開 SSH 金鑰檔案的格式。

    • 如果是設有到期時間的公開 SSH 金鑰,則必須採用以下格式:

      ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

      其中:

      • [KEY_VALUE] 是公開 SSH 金鑰值。
      • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
      • [EXPIRE_TIME] 是以 ISO 8601 格式表示的值。例如:2018-12-04T20:12:00+0000
    • 否則,公開 SSH 金鑰必須具有以下格式:

      ssh-rsa [KEY_VALUE] [USERNAME]

      其中:

      • [KEY_VALUE] 是公開 SSH 金鑰值。
      • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
  3. 如果您的金鑰未符合上述其中一種格式,或是您要新增、編輯或移除到期時間,請按照下方的操作說明,將您的公開 SSH 金鑰進行格式化。或者,請保持檔案開啟並將公開 SSH 金鑰新增至專案或執行個體中繼資料

若要為主控台格式化公開 SSH 金鑰:

  1. 製作公開金鑰檔案的副本。將副本交給 Compute Engine 使用,而原始檔案則保留給其他 SSH 設定使用。

  2. 開啟公開金鑰檔案副本。

  3. 修改公開金鑰檔案,使其具有以下格式:

    ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [KEY_VALUE] 是公開 SSH 金鑰值。
    • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。

    或者,如果您想要為公開 SSH 金鑰設定到期時間,請修改檔案使其符合以下格式:

    ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

    其中:

    • [KEY_VALUE] 是公開 SSH 金鑰值。
    • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
    • [EXPIRE_TIME] 是以 ISO 8601 格式表示的值。例如:2018-12-04T20:12:00+0000
  4. 儲存您所做的變更並保持檔案開啟。

您現在可以開始將公開 SSH 金鑰新增至專案或執行個體中繼資料

gcloud 或 API

若要檢查公開 SSH 金鑰的格式:

  1. 找到並開啟公開 SSH 金鑰檔案。

  2. 檢查公開 SSH 金鑰檔案的格式。

    • 如果是設有到期時間的公開 SSH 金鑰,則必須採用以下格式:

      [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

      其中:

      • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
      • [KEY_VALUE] 是公開 SSH 金鑰值。
      • [EXPIRE_TIME] 是以 ISO 8601 格式表示的值。例如:2018-12-04T20:12:00+0000
    • 否則,公開 SSH 金鑰必須具有以下格式:

      [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]

      其中:

      • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
      • [KEY_VALUE] 是公開 SSH 金鑰值。
  3. 如果您的金鑰未符合上述其中一種格式,或是您要新增、編輯或移除到期時間,請按照下方的操作說明,將您的公開 SSH 金鑰進行格式化。或者,請保持檔案開啟並將公開 SSH 金鑰新增至專案或執行個體中繼資料

若要為 gcloud 工具或 API 格式化公開 SSH 金鑰:

  1. 製作公開金鑰檔案的副本。將副本交給 Compute Engine 使用,而原始檔案則保留給其他 SSH 設定使用。

  2. 開啟公開金鑰檔案副本。根據預設,此檔案應具有以下格式:

    ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [KEY_VALUE] 是公開 SSH 金鑰值。
    • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
  3. 複製位於檔案末尾的使用者名稱,並將其貼到檔案的開頭,並在後面加上冒號。公開 SSH 金鑰現在應該具有以下格式:

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
    • [KEY_VALUE] 是公開 SSH 金鑰值。
  4. 或者,您也可以為金鑰設定到期時間,方法是刪除 JSON 中的第二個 [USERNAME],並在金鑰檔案末尾加上 google-ssh,再在後面加上 userNameexpireOn 欄位。

    [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

    其中:

    • [USERNAME] 是在建立這個 SSH 金鑰時為其指定的使用者。
    • [KEY_VALUE] 是公開 SSH 金鑰值。
    • [EXPIRE_TIME] 是以 ISO 8601 格式表示的值。例如:2018-12-04T20:12:00+0000
  5. 儲存您所做的變更並保持檔案開啟。

您現在可以開始將公開 SSH 金鑰新增至專案或執行個體中繼資料

編輯公開 SSH 金鑰中繼資料

使用者透過第三方工具存取 Linux 執行個體的能力,取決於提供給執行個體的公開 SSH 金鑰。您可以透過編輯中繼資料 (公開 SSH 金鑰和相關資訊皆儲存於此) 來控管要提供給 Linux 執行個體的公開 SSH 金鑰。公開 SSH 金鑰中繼資料有三種:

  • 全專案公開 SSH 金鑰:您可利用此種中繼資料來為使用者提供一般存取權限:連線至專案中大部分執行個體的能力。
  • 允許或封鎖全專案公開 SSH 金鑰:您可利用此種中繼資料值來允許或封鎖特定執行個體上的全專案公開 SSH 金鑰。根據預設,執行個體會接受所有全專案公開 SSH 金鑰。如果您想要將執行個體的使用對象限制為具有執行個體層級公開 SSH 金鑰的使用者,您可以封鎖全專案公開 SSH 金鑰。
  • 執行個體層級公開 SSH 金鑰:您可以利用此種中繼資料來為使用者提供特殊存取權限:連線至專案中特定執行個體的能力,即使該執行個體已封鎖全專案公開 SSH 金鑰。

新增或移除全專案公開 SSH 金鑰

利用全專案公開 SSH 金鑰為使用者提供存取 Linux 執行個體的權限。全專案公開 SSH 金鑰可讓使用者存取允許全專案公開 SSH 金鑰的專案中所有 Linux 執行個體。如果某個執行個體封鎖全專案公開 SSH 金鑰,使用者即無法使用全專案公開 SSH 金鑰連線至該執行個體,除非另外將同樣的公開 SSH 金鑰新增至執行個體中繼資料中。

主控台

GCP 主控台新增或移除全專案公開 SSH 金鑰:

  1. 在 Google Cloud Platform 主控台中,前往專案的中繼資料頁面。

    前往「中繼資料」頁面

  2. 在「SSH Keys」(SSH 金鑰) 下方,按一下 [Edit] (編輯)

  3. 修改全專案公開 SSH 金鑰:

    • 如要新增公開 SSH 金鑰,請按一下 [Add item] (新增項目),隨即會開啟文字方塊。
    • 複製公開 SSH 金鑰檔案的內容,並將其貼到文字方塊中。

      對每個您要新增的公開 SSH 金鑰重複同樣的步驟。

    • 如要移除公開 SSH 金鑰,請按一下金鑰旁邊的移除按鈕:

      PuTTYgen 公開金鑰螢幕擷取畫面

      對每個您要移除的公開 SSH 金鑰重複同樣的步驟。

  4. SSH 金鑰編輯完成後,請按一下 [Save] (儲存)

gcloud

如要使用 gcloud 工具新增或移除全專案公開 SSH 金鑰:

  1. 如果專案已具有全專案公開 SSH 金鑰,請您從中繼資料取得這些公開 SSH 金鑰:

    1. 取得專案的現有中繼資料:

      gcloud compute project-info describe
      
    2. 從輸出中找出 ssh-keys 中繼資料值:

      ...
      metadata:
        fingerprint: QCofVTHlggs=
        items:
        - key: ssh-keys
          value: |-
            [USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]
            [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
      ...
      

      其中:

      • [USERNAME_1][USERNAME_2] 是現有金鑰的使用者名稱。
      • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已套用至專案的公開金鑰值。
    3. 複製公開 SSH 金鑰。

  2. 在本機工作站上建立並開啟一個新的文字檔案。

  3. 在檔案中,建立一份包含所有您要新增或存放在專案中繼資料中的公開 SSH 金鑰清單。如果您已有全專案金鑰,則未列入清單的任何金鑰都將遭到移除。

    例如,下方的樣本清單未列出 [USERNAME_1] 的 SSH 金鑰,因此其金鑰遭到移除。此份清單將保留 [USERNAME_2] 的 SSH 金鑰,並新增 [USERNAME_3] 的 SSH 金鑰,因為這些 SSH 金鑰都已列入了清單中。

    [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是公開 SSH 金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
  4. 儲存並關閉檔案。

  5. 在命令提示字元中,使用 compute project-info add-metadata 指令設定全專案 ssh-keys 值。加入 --metadata-from-file 標記並指定清單檔案的路徑。

    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=[LIST_PATH]
    

    其中 [LIST_PATH] 是公開 SSH 金鑰清單的路徑。

API

使用 instances.setMetadata 方法新增或移除全專案公開金鑰。

  1. 使用 projects.get 方法取得中繼資料 fingerprint 值。如果您想要沿用現有的全專案金鑰,請取得現有的 ssh-keys 值。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]
    
    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "ssh-keys",
      "value": "[USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
     }
    ]
    ...

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [FINGERPRINT] 是此特定中繼資料設定的專屬 ID,可防止您意外覆寫並行的變更。
    • [USERNAME_1][USERNAME_2] 是現有金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已套用至專案的公開金鑰值。
  2. 建立一份包含所有您要新增或存放在全專案中繼資料中的公開 SSH 金鑰清單。如果全專案中繼資料中已含有公開 SSH 金鑰,則未列入清單的任何金鑰都將遭到移除。

    在本範例中,檔案包含了一個新的 [KEY_VALUE],後面接著您在前個步驟取得的其中一個現有金鑰值。當中漏列了 [EXISTING_KEY_VALUE_1],因此其金鑰將在下個步驟中從執行個體移除。使用 \n 字元來分隔不同的金鑰值。

    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
  3. 使用 projects.setcommoninstancemetadata 方法設定全專案 ssh-keys 值。請納入 fingerprint 值,以確保您不會覆寫此中繼資料值的任何並行變更。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/setCommonInstanceMetadata
    
    {
     "items": [
      {
       "key": "ssh-keys",
       "value": "[USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [USERNAME_1][USERNAME_2][USERNAME_3] 是金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
    • [FINGERPRINT] 是您之前使用 projects.get 方法取得的指紋。

SSH 金鑰編輯完成後,請試著透過第三方工具連線至 Linux 執行個體,測試您的變更。

如果遇到問題,請檢查您嘗試連線的執行個體中繼資料。如果執行個體層級中繼資料設為封鎖全專案 SSH 金鑰,或含有已淘汰的執行個體限定 sshKeys 值,該執行個體將會忽略所有全專案 SSH 金鑰。如要將全專案金鑰套用至執行個體,請確認該執行個體允許全專案公開 SSH 金鑰,並從執行個體中繼資料中移除已淘汰的執行個體限定 sshKeys 值 (如有)。

從 Linux 執行個體允許或封鎖全專案公開 SSH 金鑰

如果要讓執行個體忽略全專案公開 SSH 金鑰,並且只使用執行個體層級金鑰,您可以從執行個體封鎖全專案公開 SSH 金鑰。這麼做能將可存取該執行個體的對象限制為其公開 SSH 金鑰已儲存在執行個體層級中繼資料中的使用者。如果您想要讓執行個體同時使用全專案和執行個體層級公開 SSH 金鑰,請將執行個體中繼資料設為允許全專案 SSH 金鑰。這麼做能讓公開 SSH 金鑰已儲存在全專案或執行個體層級中繼資料中的使用者存取執行個體。

主控台

若要從 GCP 主控台允許或封鎖全專案公開 SSH 金鑰:

  1. 在 Google Cloud Platform 主控台中,前往 VM 執行個體頁面。

    前往「執行個體」頁面

  2. 按一下您要修改的執行個體名稱。

  3. 按一下工具列上的 [Edit] (編輯)

  4. 移至「SSH Keys」(SSH 金鑰) 下方的 [Block project-wide SSH keys] (封鎖全專案 SSH 金鑰) 核取方塊。

    • 如要封鎖具有全專案 SSH 金鑰的使用者,使其無法連線至此執行個體,請勾選 [Block project-wide SSH keys] (封鎖全專案 SSH 金鑰)
    • 如要允許具有全專案 SSH 金鑰的使用者連線至這個執行個體,請取消勾選 [Block project-wide SSH keys] (封鎖全專案 SSH 金鑰)
  5. SSH 金鑰的連線設定編輯完成後,請按一下 [Save] (儲存)

gcloud

若要從 Linux 執行個體允許或封鎖全專案公開 SSH 金鑰,請將 block-project-ssh-keys 中繼資料值新增至執行個體:

  • 若要封鎖全專案公開 SSH 金鑰,請將中繼資料值設為 TRUE

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata block-project-ssh-keys=TRUE
    

    其中 [INSTANCE_NAME] 是要封鎖全專案公開 SSH 金鑰的執行個體名稱。

  • 若要允許全專案公開 SSH 金鑰,請將中繼資料值設為 FALSE

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata block-project-ssh-keys=FALSE
    

    其中 [INSTANCE_NAME] 是要允許全專案公開 SSH 金鑰的執行個體名稱。

API

若要從 Linux 執行個體封鎖或允許全專案公開 SSH 金鑰:

  • 若要封鎖全專案公開 SSH 金鑰,請將 block-project-ssh-keys 中繼資料值新增至執行個體並將其設為 TRUE。此中繼資料值會封鎖所有全專案金鑰,使其無法在此執行個體上發生作用,僅讓執行個體層級金鑰發揮作用。

     POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
     {
      "items": [
       {
        "key": "block-project-ssh-keys",
        "value": TRUE
       }
      ]
      "fingerprint": "[FINGERPRINT]"
     }
    

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [ZONE] 是執行個體的所在區域。
    • [INSTANCE_NAME] 是要封鎖全專案金鑰的執行個體。
    • [FINGERPRINT] 是此特定中繼資料設定的專屬 ID,可防止您意外覆寫並行的變更。
  • 若要允許全專案公開 SSH 金鑰,請將 block-project-ssh-keys 中繼資料值新增至執行個體並將其設為 FALSE。此中繼資料值會允許所有全專案金鑰 (以及執行個體層級金鑰),使其在此執行個體上發揮作用。

     POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
     {
     "items": [
      {
       "key": "block-project-ssh-keys",
       "value": FALSE
      }
     ]
     "fingerprint": "[FINGERPRINT]"
     }
    

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [ZONE] 是執行個體的所在區域。
    • [INSTANCE_NAME] 是要允許全專案金鑰的執行個體。
    • [FINGERPRINT] 是此特定中繼資料設定的專屬 ID,可防止您意外覆寫並行的變更。

完成後,請試著透過第三方工具連線至 Linux 執行個體,測試您的變更。

新增或移除執行個體層級公開 SSH 金鑰

執行個體層級公開 SSH 金鑰可讓使用者存取特定的 Linux 執行個體。具有執行個體層級公開 SSH 金鑰的使用者都可以存取 Linux 執行個體,即使該執行個體封鎖了全專案公開 SSH 金鑰

主控台

若要從 GCP 主控台新增或移除執行個體層級公開 SSH 金鑰:

  1. 在 Google Cloud Platform 主控台中,前往 VM 執行個體頁面。

    前往「執行個體」頁面

  2. 按一下您要修改的執行個體名稱。

  3. 按一下工具列上的 [Edit] (編輯)

  4. 在「SSH Keys」(SSH 金鑰) 下方,點選 [Show and edit] (顯示與編輯)。該區段會展開並顯示所有執行個體層級公開 SSH 金鑰。

  5. 修改執行個體層級公開 SSH 金鑰:

    • 如要新增公開 SSH 金鑰,請按一下 [Add item] (新增項目),隨即會開啟文字方塊。
    • 複製公開 SSH 金鑰檔案的內容,並將其貼到文字方塊中。

      對每個您要新增的公開 SSH 金鑰重複同樣的步驟。

    • 如要移除公開 SSH 金鑰,請按一下金鑰旁邊的移除按鈕:

      PuTTYgen 公開金鑰螢幕擷取畫面

      對每個您要移除的公開 SSH 金鑰重複同樣的步驟。

  6. SSH 金鑰編輯完成後,請按一下 [Save] (儲存)

gcloud

如要使用 gcloud 工具新增或移除執行個體層級公開 SSH 金鑰:

  1. 如果執行個體已具有執行個體層級公開 SSH 金鑰,請從中繼資料中取得這些公開 SSH 金鑰:

    1. 取得執行個體的現有中繼資料:

       gcloud compute instances describe [INSTANCE_NAME]
       

      其中 [INSTANCE_NAME] 是要新增或移除公開 SSH 金鑰的執行個體名稱。

    2. 從輸出中找出 ssh-keys 中繼資料值:

       ...
       metadata:
         fingerprint: QCofVTHlggs=
         items:
         ...
         - key: ssh-keys
           value: |-
             [USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]
             [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
       ...
      

      其中:

      • [USERNAME_1][USERNAME_2] 是現有金鑰的使用者名稱。
      • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已套用至執行個體的公開金鑰值。

    3. 複製 ssh-keys 中繼資料值下方的公開 SSH 金鑰。

  2. 在本機工作站上建立並開啟一個新的文字檔案。

  3. 在檔案中,建立一份包含所有您要新增或存放在執行個體層級中繼資料中的公開 SSH 金鑰清單。如果執行個體層級中繼資料中已含有公開 SSH 金鑰,則未列入清單的任何金鑰都將遭到移除。

    例如,下方的樣本清單未列出 [USERNAME_1] 的 SSH 金鑰,因此其金鑰遭到移除。此份清單將保留 [USERNAME_2] 的 SSH 金鑰,並新增 [USERNAME_3] 的 SSH 金鑰,因為這些 SSH 金鑰都已列入了清單中。

    [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是公開 SSH 金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
  4. 儲存並關閉檔案。

  5. 在命令提示字元中,使用 compute instances add-metadata 指令設定執行個體限定 ssh-key 值。加入 --metadata-from-file 標記並指定公開金鑰清單檔案的路徑。

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata-from-file ssh-keys=[LIST_PATH]
    

    其中:

    • [INSTANCE_NAME] 是要套用公開 SSH 金鑰的執行個體名稱。
    • [LIST_PATH] 是公開 SSH 金鑰清單的路徑。

API

使用 instances.setMetadata 方法在中繼資料中新增執行個體限定 ssh-keys 值。

  1. 使用 instances.get 方法取得要求所用的中繼資料 fingerprint 值。如果您想沿用現有的執行個體層級金鑰,請取得現有的 ssh-keys 值。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]
    

    伺服器會傳回類似下方的回應:

    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "ssh-keys",
      "value": "[USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
     }
    ]
    ...
    

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [ZONE] 是執行個體的所在區域。
    • [INSTANCE_NAME] 是要編輯執行個體層級公開 SSH 金鑰的執行個體。
    • [FINGERPRINT] 是此特定中繼資料設定的專屬 ID,可防止您意外覆寫並行的變更。
    • [USERNAME_1][USERNAME_2] 是現有金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已套用至執行個體的公開金鑰值。
  2. 建立一份包含所有您要新增或存放在執行個體層級中繼資料中的公開 SSH 金鑰清單。如果執行個體層級中繼資料中已含有公開 SSH 金鑰,則未列入清單的任何金鑰都將遭到移除。

    在本範例中,檔案包含了一個新的 [KEY_VALUE],後面接著您在前個步驟取得的其中一個現有金鑰值。當中漏列了 [EXISTING_KEY_VALUE_1],因此其金鑰將在下個步驟中從執行個體移除。使用 \n 字元來分隔不同的金鑰值。

    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
  3. 使用 instances.setMetadata 方法設定執行個體限定 ssh-keys 值。請納入 fingerprint 值,以確保您不會覆寫此中繼資料值的任何並行變更。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
    {
     "items": [
      {
       "key": "ssh-keys",
       "value": "[USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    其中:

    • [PROJECT_ID] 是專案的專屬 ID。
    • [ZONE] 是執行個體的所在區域。
    • [INSTANCE_NAME] 是要編輯執行個體層級公開 SSH 金鑰的執行個體。
    • [USERNAME_1][USERNAME_2][USERNAME_3] 是金鑰的使用者名稱。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 金鑰的公開金鑰值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 金鑰的公開金鑰值。
    • [NEW_KEY_VALUE] 是您要新增的 SSH 金鑰的公開金鑰值。
    • [FINGERPRINT] 是此特定中繼資料設定的專屬 ID,可防止您意外覆寫並行的變更。

SSH 金鑰編輯完成後,請試著透過第三方工具連線至 Linux 執行個體,測試您的變更。

後續步驟

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

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

這個網頁
Compute Engine 說明文件