除了透過新增及移除中繼資料內的安全殼層 (SSH) 金鑰來手動管理執行個體存取權之外,您也可以選擇透過 OS 登入使用 Compute Engine 身分與存取權管理角色來管理 Linux 執行個體的 SSH 存取權。
這個主題說明設定 OS 登入的基本步驟。設定 OS 登入時,您可以使用雙重驗證功能來提供額外的安全防護機制。詳情請參閱設定 OS 登入的雙重驗證功能。
如要設定 OS 登入並連結至您的執行個體,請按照下列程序操作:
- 在您的專案或個別執行個體中啟用 OS 登入功能。
- 為您自己、專案成員或機構成員授予必要的 IAM 角色。
- 或者,您也可以選擇完成下列任一步驟:
- 為您自己、專案成員或機構成員,將自訂安全殼層金鑰新增至使用者帳戶。或者,在您連結至執行個體時,Compute Engine 可以自動為您產生這些金鑰。
- 如果您的專案隸屬於某個機構,請參閱管理機構中的 OS 登入一文。
- 連結至執行個體。
- 參閱預期的登入行為一節。
事前準備
- 如要使用這份指南中的指令列範例,請按照下列指示操作:
- 安裝或更新至最新版 gcloud 指令列工具。
- 設定預設地區和區域。
- 如要使用這份指南中的 API 範例,請設定 API 存取權。
限制
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
,並將其套用至專案中的所有執行個體:
- 前往「Metadata」(中繼資料) 頁面。
- 按一下 [Edit] (編輯)。
- 新增鍵為
enable-oslogin
、值為TRUE
的中繼資料項目,或是將值設為FALSE
來停用這項功能。 - 按一下 [Save] (儲存) 來套用變更內容。
以並非執行 CoreOS 的 VM 來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以執行 CoreOS 發行版本的 VM 來說,您必須重新啟動執行個體,變更才會生效。如要重新啟動執行個體,請先停止執行個體,然後再執行啟動作業。
在現有執行個體的中繼資料內設定 enable-oslogin
:
- 前往「VM instances」(VM 執行個體) 頁面。
- 按一下您要設定中繼資料值的執行個體名稱。
- 按一下執行個體詳細資料頁面頂端的 [Edit] (編輯),藉此編輯執行個體設定。
- 在「Custom metadata」(自訂中繼資料) 下新增鍵為
enable-oslogin
、值為TRUE
的中繼資料項目,或是將值設為FALSE
來停用這項執行個體功能。 - 按一下執行個體詳細資料頁面底端的 [Save] (儲存),將變更套用至執行個體。
以 CoreOS 之外的所有作業系統來說,系統會立即套用這項變更,因此您不需要重新啟動執行個體。以 CoreOS 的發行版本來說,您必須重新啟動執行個體,變更才會生效。如要重新啟動執行個體,請先停止執行個體,然後再執行啟動作業。
建立執行個體時,請在執行個體中繼資料內設定 enable-oslogin
:
- 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。
- 按一下 [建立執行個體]。
- 在「Create a new instance」(建立新執行個體) 頁面,填寫執行個體的屬性。
- 在「Metadata」(中繼資料) 專區中新增鍵為
enable-oslogin
、值為TRUE
的中繼資料項目,或是將值設為FALSE
來停用這項執行個體功能。 - 按一下 [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 角色,否則這些執行個體一律不會接受由該使用者帳戶發出的連線要求:
舉例來說,您可以按照下列程序將執行個體存取權授予使用者:
為使用者授予必要的執行個體存取權角色。使用者必須具備以下角色:
roles/iam.serviceAccountUser
。下列其中一個登入角色:
roles/compute.osLogin
,不會授予管理員權限roles/compute.osAdminLogin
,會授予管理員權限
您可以使用
gcloud beta compute instances add-iam-policy-binding
指令,在執行個體層級授予上述任一角色。
如果您是機構管理員,並想讓機構外的使用者存取您的執行個體,請在機構層級將
roles/compute.osLoginExternalUser
授予該名使用者。
除非您直接將執行個體的詳細資料或外部 IP 地址提供給使用者,否則他們都無法查看這些資訊。如要允許使用者查看執行個體的詳細資料,您必須為這些使用者授予其他 IAM 角色。舉例來說,roles/compute.viewer
角色可讓使用者查看專案中的所有資源,包括執行個體詳細資料。
授予服務帳戶 SSH 存取權
您可以使用 OS 登入角色,讓服務帳戶透過 SSH 連結至您的執行個體。以下列工作來說,這項功能會相當實用:
- 如果您的應用程式必須透過 SSH 存取 Compute Engine 執行個體,您可以使用服務帳戶提供這項存取權。詳情請參閱使用 SSH 將應用程式連線至執行個體一文。
- 如要瞭解如何取得服務帳戶的權限,並透過這些權限手動使用 SSH 串聯不同的執行個體,請參閱以服務帳戶身分進行執行個體之間的手動連線一節。
您可以按照下列程序為服務帳戶授予 SSH 存取權:
- 建立服務帳戶。
- 為服務帳戶授予必要的 OS 登入角色。服務帳戶必須取得與使用者帳戶相同的角色。如要瞭解如何設定服務帳戶的角色與權限,請參閱將角色授予服務帳戶一文。
- 將應用程式預設憑證提供給服務帳戶,方便服務帳戶為向必要 API 發出的要求提供授權。請採用下列其中一個選項來提供應用程式預設憑證:
- 建立與服務帳戶相關聯的執行個體,這個執行個體會為服務帳戶提供應用程式預設憑證。
- 如果您是在 Compute Engine 環境以外之處執行應用程式,請手動將服務帳戶憑證提供給您的應用程式。
將 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 登入個人資料登入帳戶。
將安全殼層金鑰新增至使用者帳戶
您可以將公開安全殼層金鑰與下列使用者帳戶類型建立關聯:
- 隸屬於某項機構資源的受管理使用者帳戶:
- Google 個人帳戶,例如
gmail.com
帳戶
您可以使用 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 存取權控管。
- 瞭解服務帳戶。
- 如要查看服務帳戶透過 SSH 連結應用程式的範例,請參閱使用 SSH 將應用程式連線至執行個體的教學課程。
- 瞭解 GCP 的專案存取權限。