OS 登入疑難排解

本文說明如何使用中繼資料伺服器排解 OS 登入問題。如需設定 OS 登入的資訊或逐步操作說明,請參閱設定 OS 登入

您可以從 Compute Engine 執行個體內查詢中繼資料伺服器。詳情請參閱儲存和擷取執行個體中繼資料

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上的分頁,瞭解如何使用範例:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  • 設定預設地區和區域
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

常見錯誤訊息

以下是使用 OS 登入時可能會遇到的常見錯誤範例。

找不到群組名稱

在部分使用 OS 登入 的運算執行個體上,您可能在建立連線後收到以下錯誤訊息:

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

忽略這則錯誤訊息。這個錯誤不會影響運算執行個體。

無法取得群組

建立運算執行個體時,您可能會看到類似下列內容的記錄:

Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Refreshing group entry cache
Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Failure getting groups, quitting

這些記錄表示貴機構未設定 OS 登入 Linux 群組。請忽略這些訊息。

不符合先決條件

使用 SSH 連線至運算執行個體時,可能會看到類似下列的錯誤:

ERROR: (gcloud.compute.ssh) FAILED_PRECONDITION: The specified username or UID is not unique within given system ID.

如果 OS 登入嘗試產生的使用者名稱已存在於機構中,就會發生這個錯誤。如果使用者帳戶遭到刪除,且隨後建立電子郵件地址相同的新使用者,就可能發生這種情況。使用者帳戶刪除後,系統最多需要 48 小時才能移除使用者的 POSIX 資訊。

如要解決這個問題,請採取下列任一做法:

超過 OS 登入設定檔大小上限

使用 SSH 連線至 Linux Compute 執行個體,或使用 SCP 傳輸檔案時,可能會看到下列其中一個錯誤:

ERROR: (gcloud.compute.ssh) FAILED_PRECONDITION: Login profile size exceeds 32 KiB. Delete profile values to make additional space.
ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.

如要解決這些錯誤,請按照下列步驟操作:

  1. 檢查 OS 登入設定檔的大小。如要檢查設定檔大小,請將設定檔匯出至臨時 JSON 檔案,然後執行下列指令來檢查檔案大小:

    gcloud compute os-login describe-profile --format="json" | wc
    

    如果大小接近或超過 32 KiB,請移除未使用的 SSH 金鑰。

  2. 檢查 OS 登入設定檔,找出未使用的 SSH 金鑰:

    gcloud compute os-login describe-profile
    

    輸出結果會與下列內容相似:

    name: '00000000000000'
    posixAccounts:
    ...
    sshPublicKeys:
     ...:
       fingerprint: ...
       key: |
         ssh-rsa AAAAB3NzaC1yc2...
       name: ...
     ...
    
  3. 使用 gcloud compute os-login ssh-keys remove 指令移除所有未使用的金鑰:

    gcloud compute os-login ssh-keys remove --key=KEY
    

    KEY 替換為金鑰的指紋或完整的 SSH 公開金鑰字串。

為避免日後發生這個問題,請為 SSH 金鑰新增到期時間。過期的金鑰會在到期後 48 小時內,或是在您將新金鑰新增至登入設定檔時,自動從登入設定檔中移除。

HTTP 回應代碼:429

嘗試使用 SSH 連線至運算執行個體時,可能會看到下列錯誤訊息:

Failed to validate organization user USERNAME has login permission, got HTTP response code: 429

這是因為每個運算執行個體每秒的查詢次數,達到中繼資料伺服器的速率限制 (100 次)。這項限制無法調整。如要解決這個問題,請稍候幾秒,然後重新連線。

為避免日後發生類似問題,請嘗試下列做法:

  • 在應用程式程式碼中導入重試機制。詳情請參閱:
  • 重複使用現有 SSH 連線。
  • 批次傳送指令,減少 SSH 連線和 OS 登入中繼資料查詢。

預設 OS 登入中繼資料項目

Compute Engine 定義了一組預設中繼資料項目,可提供 OS 登入資訊。預設中繼資料一律由伺服器定義及設定。預設中繼資料鍵會區分大小寫。

下表說明可查詢的項目。

相對於 http://metadata.google.internal/computeMetadata/v1/
中繼資料項目 說明
project/attributes/enable-oslogin 檢查目前 Google Cloud 專案是否已啟用 OS 登入功能。
instance/attributes/enable-oslogin 檢查目前 Compute 執行個體是否已啟用 OS 登入。
oslogin/users/ 擷取 OS 登入使用者的個人資料資訊。 您可以傳遞查詢參數,例如 usernameuidpagesizepagetoken
oslogin/authorize/

擷取 OS 登入使用者的登入或管理層級權限設定。

如要檢查權限,您必須指定 policy 查詢參數。 政策參數的值必須設為 login (檢查登入權限) 或 adminLogin (檢查 sudo 存取權)。

檢查是否已設定 OS 登入

使用 Google Cloud 控制台或 Google Cloud CLI 查詢中繼資料,判斷是否已啟用 OS 登入功能。在專案或執行個體中繼資料中,將 enable-oslogin 中繼資料鍵設為 TRUE,即可啟用 OS 登入功能。如果同時設定執行個體和專案中繼資料,系統會優先採用執行個體中繼資料中設定的值。

查看 OS 登入使用者

如要查看多位使用者的個人資料資訊,可以指定 pagesize 參數。將 pagesize 改為必要數值。

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=PAGE_SIZE" -H "Metadata-Flavor: Google"

輸出內容可能包含網頁權杖,可用於後續呼叫,列出更多使用者。

舉例來說,如要將 pagesize 設為 1,請執行下列指令:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1" -H "Metadata-Flavor: Google"

如要取得下一個使用者,請將 pagesize 設為 1,並將 pagetoken 設為上一個指令輸出內容中的頁面符記。

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1&pagetoken=PAGE_TOKEN" -H "Metadata-Flavor: Google"

在大多數發行版中,您也可以執行 Unix 指令 getent passwd,擷取機構使用者的密碼項目。

查看特定 OS 登入使用者

如要查看運算執行個體上特定使用者的設定檔資訊,請執行下列指令:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=USERNAME" -H "Metadata-Flavor: Google"

USERNAME 替換為要查詢的使用者名稱。

舉例來說,您可以執行要求來查詢使用者 user_example_com。下列指令和輸出內容顯示新增的格式,可提升可讀性。

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"

輸出結果會與下列內容相似:

{
    "loginProfiles": [{
        "name": "12345678912345",
        "posixAccounts": [{
            "primary": true,
            "username": "user_example_com",
            "uid": "123451",
            "gid": "123451",
            "homeDirectory": "/home/user_example_com",
            "operatingSystemType": "LINUX"
        }],
        "sshPublicKeys": {
            "204c4b4fb...": {
                "key": "ssh-rsa AAAAB3Nz...",
                "fingerprint": "204c4b4fb..."
            }
        }
    }]
}

在大多數發行版本中,您也可以執行 Unix 指令 (例如 getent passwd usernamegetent passwd uid) 來擷取設定檔資訊。

如要擷取使用者的 SSH 金鑰,您也可以執行 /usr/bin/google_authorized_keys USERNAME。如果沒有傳回任何金鑰,表示使用者可能沒有登入運算執行個體的必要權限。

正在檢查登入權限

如要查看登入和管理層級權限,您必須提供 policy=login&email=LOGIN_NAME 查詢參數。

  1. 查詢使用者設定檔,取得 name 欄位的值:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
  2. 記下輸出內容中的 name

  3. 使用 name 的值執行下列 login 指令:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=LOGIN_NAME" -H "Metadata-Flavor: Google"
    

舉例來說,您可以查詢上一節中檢視的使用者 user_example_com 的登入權限:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=12345678912345" -H "Metadata-Flavor: Google"

指令輸出內容會指出使用者已獲得授權,可登入運算執行個體:

{"success":true}

檢查運算執行個體是否具備服務帳戶

您可以查詢中繼資料伺服器,找出與運算執行個體相關聯的服務帳戶。登入運算執行個體,然後執行下列指令:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" -H "Metadata-Flavor: Google"

輸出結果會與下列內容相似:

12345-sa@developer.gserviceaccount.com/
default/

如果找不到服務帳戶,輸出內容會留空。

後續步驟