設定 OS 登入

除了透過新增及移除中繼資料內的安全殼層 (SSH) 金鑰來手動管理執行個體存取權之外,您也可以選擇透過 OS 登入使用 Compute Engine 身分與存取權管理角色來管理 Linux 執行個體的 SSH 存取權。

這個主題說明設定 OS 登入的基本步驟。設定 OS 登入時,您可以使用雙重驗證功能來提供額外的安全防護機制。詳情請參閱設定 OS 登入的雙重驗證功能

如要設定 OS 登入並連結至您的執行個體,請按照下列程序操作:

  1. 在您的專案或個別執行個體中啟用 OS 登入功能
  2. 為您自己、專案成員或機構成員授予必要的 IAM 角色
  3. 或者,您也可以選擇完成下列任一步驟:
  4. 連結至執行個體
  5. 參閱預期的登入行為一節。

事前準備

限制

  • Google Kubernetes Engine (GKE) 目前仍不支援 OS 登入。OS 登入啟用時,GKE 叢集節點會繼續使用中繼資料安全殼層金鑰。

  • Windows Server 和 SQL Server 映像檔系列仍不支援 OS 登入。

啟用或停用 OS 登入

您必須透過在專案或執行個體中繼資料內設定中繼資料鍵/值組合來啟用 OS 登入功能,才能使用 IAM 角色管理執行個體存取權:enable-oslogin=TRUE。如要停用 OS 登入,請將中繼資料值設為 FALSE。舉例來說,您可以在專案層級使用 enable-oslogin=TRUE,於整個專案啟用 OS 登入,但針對還無法使用這項功能的執行個體,則設定 enable-oslogin=FALSE

您可以採用下列其中一個選項,將 enable-oslogin 中繼資料值套用至專案或執行個體:

主控台

在整項專案適用的中繼資料內設定 enable-oslogin,並將其套用至專案中的所有執行個體:

  1. 前往「Metadata」(中繼資料) 頁面。

    前往「Metadata」(中繼資料) 頁面

  2. 按一下 [Edit] (編輯)
  3. 新增鍵為 enable-oslogin、值為 TRUE 的中繼資料項目,或是將值設為 FALSE 來停用這項功能。
  4. 按一下 [Save] (儲存) 來套用變更內容。

以並非執行 CoreOS 的 VM 來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以執行 CoreOS 發行版本的 VM 來說,您必須重新啟動執行個體,變更才會生效。如要重新啟動執行個體,請先停止執行個體,然後再執行啟動作業。

在現有執行個體的中繼資料內設定 enable-oslogin

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往「VM instances」(VM 執行個體) 頁面

  2. 按一下您要設定中繼資料值的執行個體名稱。
  3. 按一下執行個體詳細資料頁面頂端的 [Edit] (編輯),藉此編輯執行個體設定。
  4. 在「Custom metadata」(自訂中繼資料) 下新增鍵為 enable-oslogin、值為 TRUE 的中繼資料項目,或是將值設為 FALSE 來停用這項執行個體功能。
  5. 按一下執行個體詳細資料頁面底端的 [Save] (儲存),將變更套用至執行個體。

以 CoreOS 之外的所有作業系統來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以 CoreOS 的發行版本來說,您必須重新啟動執行個體,變更才會生效。如要重新啟動執行個體,請先停止執行個體,然後再執行啟動作業。

建立執行個體時,請在執行個體中繼資料內設定 enable-oslogin

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

    前往 VM 執行個體頁面

  2. 按一下 [建立執行個體]
  3. 在「Create a new instance」(建立新執行個體) 頁面,填寫執行個體的屬性。
  4. 在「Metadata」(中繼資料) 專區中新增鍵為 enable-oslogin、值為 TRUE 的中繼資料項目,或是將值設為 FALSE 來停用這項執行個體功能。
  5. 按一下 [Create] (建立) 來建立執行個體。

gcloud

在整項專案適用的中繼資料內設定 enable-oslogin,並將其套用至專案中的所有執行個體:

使用 gcloud 指令列工具的 project-info add-metadata 指令來設定 oslogin=TRUE,藉此啟用 OS 登入:

gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE

或者,您也可以將 enable-oslogin 設為 FALSE 來停用 OS 登入。

以並非執行 CoreOS 的 VM 來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以執行 CoreOS 發行版本的 VM 來說,您必須重新啟動執行個體,變更才會生效。

在現有執行個體的中繼資料內設定 enable-oslogin

使用 gcloud 指令列工具的 instances add-metadata 指令來設定 oslogin=TRUE,藉此啟用 OS 登入:

gcloud compute instances add-metadata [INSTANCE_NAME] --metadata enable-oslogin=TRUE

或者,您也可以將 enable-oslogin 設為 FALSE,藉此停用執行個體的 OS 登入。

以 CoreOS 之外的所有作業系統來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以 CoreOS 的發行版本來說,您必須重新啟動執行個體,變更才會生效。

建立執行個體時,請在執行個體中繼資料內設定 enable-oslogin

使用 gcloud 指令列工具的 instances create 指令來設定 oslogin=TRUE,藉此啟用 OS 登入:

gcloud compute instances create [INSTANCE_NAME] --metadata enable-oslogin=TRUE

或者,您也可以將 enable-oslogin 設為 FALSE,藉此停用執行個體的 OS 登入。

除了必要的中繼資料值之外,您的執行個體也必須安裝最新版的訪客環境。如果您的執行個體是執行您匯入的自訂映像檔,請在這些執行個體中安裝訪客環境,藉此啟用 OS 登入。

在專案執行個體中啟用 OS 登入之後,請授予使用者連結至這些執行個體的權限

在使用者帳戶上設定 OS 登入角色

授予 OS 登入 IAM 角色

您在一或多個專案執行個體中啟用 OS 登入之後,除非使用者帳戶在您的專案或機構中具備必要的 IAM 角色,否則這些執行個體一律不會接受由該使用者帳戶發出的連線要求:

舉例來說,您可以按照下列程序將執行個體存取權授予使用者:

  1. 為使用者授予必要的執行個體存取權角色。使用者必須具備以下角色:

  2. 如果您是機構管理員,並想讓機構外的使用者存取您的執行個體,請在機構層級roles/compute.osLoginExternalUser 授予該名使用者。

除非您直接將執行個體的詳細資料或外部 IP 地址提供給使用者,否則他們都無法查看這些資訊。如要允許使用者查看執行個體的詳細資料,您必須為這些使用者授予其他 IAM 角色。舉例來說,roles/compute.viewer 角色可讓使用者查看專案中的所有資源,包括執行個體詳細資料。

授予服務帳戶 SSH 存取權

您可以使用 OS 登入角色,讓服務帳戶透過 SSH 連結至您的執行個體。以下列工作來說,這項功能會相當實用:

您可以按照下列程序為服務帳戶授予 SSH 存取權:

  1. 建立服務帳戶
  2. 為服務帳戶授予必要的 OS 登入角色。服務帳戶必須取得與使用者帳戶相同的角色。如要瞭解如何設定服務帳戶的角色與權限,請參閱將角色授予服務帳戶一文。
  3. 應用程式預設憑證提供給服務帳戶,方便服務帳戶為向必要 API 發出的要求提供授權。請採用下列其中一個選項來提供應用程式預設憑證:

將 SSH 存取權授予服務帳戶之後,您可以調整應用程式設定來建立安全殼層金鑰,並透過 SSH 連結至虛擬私人雲端網路中的其他執行個體。如要查看服務帳戶透過 SSH 連結應用程式的範例,請參閱使用 SSH 將應用程式連線至執行個體的教學課程。

撤銷 OS 登入 IAM 角色

如要撤銷使用者的存取權限,使其無法存取可使用 OS 登入的執行個體,請從該使用者帳戶中移除相關的使用者角色。如要瞭解如何移除使用者的 IAM 角色,請參閱授予、變更及撤銷資源的存取權一文。

即便您撤銷了使用者的存取權限,該名使用者還是握有與自有帳戶相關聯的公開安全殼層金鑰,不過這些金鑰已無法用於 VM 執行個體。

連結至執行個體

在您設定必要的角色之後,請使用 Compute Engine 工具連結至執行個體。Compute Engine 會自動產生安全殼層金鑰,並將其連結至您的使用者帳戶。

或者,如果您是自行建立安全殼層金鑰,再將公開金鑰新增至自己的使用者帳戶,可以使用第三方工具連結至執行個體。執行個體會從使用者帳戶取得公開金鑰。只要您提供正確的使用者名稱與相符的私密安全殼層金鑰,就能連結至該執行個體。

連結執行個體之後,請參閱預期的登入行為一節。

預期的登入行為

  • 在採用 OS 登入的某些執行個體中,您可能會在建立連線後看見以下錯誤訊息:

    /usr/bin/id: cannot find name for group ID 123456789

    忽略這則錯誤訊息。這個錯誤並不會影響您的執行個體。

  • 如果 G Suite 管理員未設定使用者名稱,OS 登入會合併使用者 Google 個人資料關聯電子郵件中的使用者名稱與網域,來產生預設 Linux 使用者名稱。這個命名慣例可以確保名稱均不重複。舉例來說,如果與 Google 個人資料相關聯的使用者電子郵件地址是 user@example.com,則其產生的使用者名稱為 user_example_com

    這個使用者名稱是系統依據與 G Suite 帳戶相關聯的網域而產生。如果使用者隸屬於不同的 G Suite 機構,所產生的使用者名稱前方會加上「ext_」前置字串。舉例來說,如果 user@example.com 正在存取其他機構中的 VM,則其產生的使用者名稱為 ext_user_example_com

  • 在您使用 gcloud compute ssh 指令登入執行個體時,系統會顯示下列訊息:

    Using OS Login user [user_example_com] instead of default user [user]

    看見這則訊息即可確認您是以 OS 登入個人資料登入帳戶。

將安全殼層金鑰新增至使用者帳戶

您可以將公開安全殼層金鑰與下列使用者帳戶類型建立關聯:

您可以使用 gcloud 指令列工具OS Login API,將安全殼層金鑰新增至自己的帳戶。或者,如果您是某個機構的網域管理員,可以透過 Directory API 將安全殼層金鑰新增至所屬機構中的使用者帳戶。

gcloud

gcloud compute os-login 指令僅適用於 Cloud SDK 184 以上版本。

使用 gcloud 指令列工具,將公開安全殼層金鑰連結至特定帳戶。

gcloud compute os-login ssh-keys add \
    --key-file [KEY_FILE_PATH] \
    --ttl [EXPIRE_TIME]

在上方的指令中:

  • [KEY_FILE_PATH] 是公開安全殼層金鑰在本機工作站中的路徑,請確認公開安全殼層金鑰的格式正確無誤。如果您是在 Linux 系統中使用 PuTTYgen 來產生公開金鑰,則須採用 public-openssh 格式。
  • [EXPIRE_TIME] 是用來設定公開安全殼層金鑰到期時間的選用旗標。舉例來說,您可以指定 30m,讓安全殼層金鑰在 30 分鐘後失效。這個旗標的有效單位如下:s 代表秒,m 代表分鐘,h 代表小時,d 則代表天。您可以將這個值設為 0 來代表永不失效。

OS Login API

使用 OS Login API,將公開安全殼層金鑰連結至特定帳戶。

POST https://oslogin.googleapis.com/v1/users/[ACCOUNT_EMAIL]:importSshPublicKey

{
 "key": "[SSH_KEY]",
 "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
}

在上方的指令中:

  • [ACCOUNT_EMAIL] 是電子郵件地址,代表您的受管理使用者帳戶。
  • [SSH_KEY] 是您要套用至帳戶的公開金鑰,請確認公開安全殼層金鑰的格式正確無誤。如果您是在 Linux 系統中使用 PuTTYgen 來產生公開金鑰,則須採用 public-openssh 格式。
  • [EXPIRATION_TIMESTAMP] 是金鑰的到期時間,以 Epoch 紀元時間後微秒為單位。

Directory API

如果您是某個機構的網域管理員,可以按照 Directory API 參考資料中的操作說明,將安全殼層金鑰新增至所屬機構中的其他使用者帳戶。舉例來說,您可以使用一或多個 SSH sshPublicKeys 項目,對 directory.users.update 方法建立 PUT 要求。

PUT https://www.googleapis.com/admin/directory/v1/users/[USER_ID_KEY]

{
 "sshPublicKeys": [
  {
   "key": "[SSH_KEY]",
   "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
  },
  {
   "key": "[SSH_KEY]",
   "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
  }
 ]
}

在上方的指令中:

  • [USER_ID_KEY] 是使用者的固定 ID。
  • [SSH_KEY] 是您要套用至帳戶的公開金鑰,請確認公開安全殼層金鑰的格式正確無誤。如果您是在 Linux 系統中使用 PuTTYgen 來產生公開金鑰,則須採用 public-openssh 格式。
  • [EXPIRATION_TIMESTAMP] 是金鑰的到期時間,以 Epoch 紀元時間後微秒為單位。

如要移除帳戶中的所有金鑰,請將內文指定為 "sshPublicKeys": null

PUT https://www.googleapis.com/admin/directory/v1/users/[USER_ID_KEY]

{
  "sshPublicKeys": null
}

在上方的指令中,[USER_ID_KEY] 是使用者的固定 ID。

將金鑰新增至自己的帳戶之後,您可以使用第三方工具和帳戶的關聯使用者名稱連結至執行個體。您的機構管理員可以變更這個使用者名稱。您可以執行 gcloud compute os-login describe-profile 指令來找出帳戶的使用者名稱:

gcloud compute os-login describe-profile

name: [ACCOUNT_EMAIL]
posixAccounts:
⋮
  username: [USER_NAME]
⋮

在上方的指令中:

  • [ACCOUNT_EMAIL] 是電子郵件地址,代表您的受管理使用者帳戶。
  • [USER_NAME] 是建立 SSH 連線的使用者名稱。根據預設,這個名稱是依據 [ACCOUNT_EMAIL] 產生。

後續步驟

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

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

這個網頁
Compute Engine 說明文件