OS 登入疑難排解


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

您可以從虛擬機器 (VM) 執行個體內查詢中繼資料伺服器。詳情請參閱「儲存和擷取執行個體中繼資料」。

事前準備

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    REST

    To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    For more information, see Authenticate for using REST in the Google Cloud authentication documentation.

常見錯誤訊息

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

找不到群組名稱

在使用 OS Login 的部分 VM 上,您可能會在建立連線後收到以下錯誤訊息:

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

忽略這則錯誤訊息。這個錯誤不會影響您的 VM。

無法取得群組

建立 VM 時,您可能會看到類似以下的記錄:

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 Login Linux 群組。請忽略這些訊息。

不符合先決條件

使用 SSH 連線至 VM 時,您可能會看到類似以下的錯誤訊息:

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

當 OS 登入服務嘗試產生組織內已存在的使用者名稱時,就會發生這個錯誤。在使用者帳戶遭到刪除後,不久後又建立了使用相同電子郵件地址的新使用者,這種情況很常見。使用者帳戶遭到刪除後,系統最多需要 48 小時才能移除使用者的 POSIX 資訊。

如要解決這個問題,請按照下列任一做法進行:

引數無效

使用 SSH 連線至 VM 或使用 SCP 傳輸檔案時,您可能會看到類似下列的錯誤訊息:

ERROR: (gcloud.compute.ssh) INVALID_ARGUMENT: 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. 執行 gcloud compute os-login describe-profile 指令,即可查看 OS Login 設定檔:

    gcloud compute os-login describe-profile
    

    輸出看起來類似以下內容:

    name: '00000000000000'
    posixAccounts:
    ...
    sshPublicKeys:
     ...:
       fingerprint: ...
       key: |
         ssh-rsa AAAAB3NzaC1yc2...
       name: ...
     ...
    
  2. 查看輸出內容,找出未使用的 SSH 金鑰。

  3. 使用 gcloud compute os-login ssh-keys remove 指令,從輸出內容中移除所有未使用的鍵:

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

    KEY 替換為金鑰的指紋或金鑰字串。

為避免日後發生這個問題,請為安全殼層金鑰新增到期時間。到期後 48 小時,或在您新增金鑰至設定檔時,系統會自動從登入設定檔中移除已到期的金鑰。

HTTP 回應代碼:429

嘗試使用 SSH 連線至 VM 時,可能會看到下列錯誤訊息:

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 檢查目前的 VM 是否已啟用 OS 登入功能。
oslogin/users/ 擷取 OS 登入使用者的個人資料資訊。您可以傳遞查詢參數,例如 usernameuidpagesizepagetoken
oslogin/authorize/

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

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

檢查是否已設定 OS 登入

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

查看 OS Login 使用者

如要查看多位使用者的設定檔資訊,您必須指定 pagesizepagetoken 參數。將 pagesizepagetoken 替換為必要的數值。

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

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

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

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

查看特定 OS 登入使用者

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

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..."
            }
        }
    }]
}

在大多數發行版上,您也可以執行 getent passwd usernamegetent passwd uid 等 Unix 指令,擷取設定檔資訊。

如要擷取使用者的安全殼層金鑰,您也可以執行 /usr/bin/google_authorized_keys USERNAME。如果沒有傳回金鑰,表示使用者可能沒有登入 VM 所需的權限。

檢查登入權限

如要查看登入和管理層級權限,您必須提供 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"

指令輸出結果會指出使用者已獲授權登入 VM:

{"success":true}

檢查 VM 是否有服務帳戶

您可以查詢中繼資料伺服器,找出與 VM 相關聯的服務帳戶。在 VM 上執行下列指令:

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

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

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

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

後續步驟