4

我已經使用Google Compute Engine設置了我的新服務器。我在Google雲端控制檯的元數據中添加了用戶和他們的公鑰(sshKeys)。Google Cloud SSH密鑰

我試圖替換元數據中的公鑰,但現在舊的似乎是唯一一個能夠SSH入我的服務器(使用PuTTY)。新的似乎沒有更新。

現在,即使我刪除整個元數據或在sshKeys字段中輸入亂碼文本,它仍然可以工作!

是否需要某個時間將元數據推送到服務器(我以前的嘗試是即時的)?

回答

1

從sshKeys元數據中刪除密鑰不會導致將密鑰從實例中刪除。

聽起來好像在新密鑰的格式化中可能存在一個錯誤,這就是爲什麼新密鑰未被添加。 sshKeys元數據的每行應該看起來像「username:ssh-rsa AAAAB3Nza ..... sjr comment」。應該沒有額外的空間,空行。

一個常見的錯誤是,如果您從開發人員控制檯中的sshKeys元數據中進行復制,添加一個鍵並將其粘貼回來,則必須非常小心使用新行,因爲開發人員控制檯會丟失html輸出中的新行。

+0

好像鍵添加,但只是個別用戶的authorized_keys文件,而不是創建一個新用戶並將其添加作爲其關鍵。 –

2

要理解Google Compute Engine如何管理ssh密鑰,您必須瞭解GCE如何管理metadata(因爲正如您所寫,它們位於元數據存儲中)。

更具體地說,project and instance metadata之間的差異是至關重要的。引用文檔(請參閱前面的鏈接):

可以在項目和實例級別分配元數據。項目級元數據傳播到項目中的所有虛擬機實例,而實例級元數據僅影響該實例。您可以設置項目和實例級別的元數據,但是如果您爲項目和實例元數據設置相同的密鑰,計算引擎將使用實例元數據。

雖然這看起來相當合乎邏輯的和直接的,人們必須注意,關係十分密切,所使用的術語:

項目級元數據傳播到項目[內的所有虛擬機實例。 ..]

您可以SE t [...]但如果你同時設置的密鑰,計算引擎將使用實例元數據

如果考慮這兩種說法,這意味着兩件事情:

  1. 如果在項目級的元數據集ONLY,它會在你的情況下傳播。
  2. 如果您設置的元數據級別爲實例級別,則它將優先於級別級別,並且不會傳播任何內容。

作爲其中的一個直接後果是,在GCE平臺採取配售的護理/在實例中移除你的SSH密鑰(並把它們時產生的相關用戶,刪除它們時,而剛剛從~user/.ssh/authorized_keys文件中刪除鍵 - 這樣你就不會爲~user丟失任何數據)ONLY,當你不指定自己的密鑰(在創建實例或更高版本)。如果這樣做,將GCE平臺將考慮SSH密鑰管理作爲手動,什麼都不會保持同步與元數據存儲。

幸運的是,GCE平臺做得很好,因此您無需重新創建實例即可讓您的密鑰由GCE平臺管理:您只需要移除相對於sshKeys的實例級元數據。

以同樣的方式,如果你用鑰匙sshKeys增加一些實例級別的元數據,將禁用SSH密鑰GCE平臺管理;除非您刪除該實例級別的元數據。

關於延遲問題:我沒有比網絡延遲(所以沒有平臺實施延時明顯)迄今爲止其他任何延遲。我認爲這個平臺不時有可能會延遲,但這似乎不太可能成爲您的問題的原因。


附加說明:

某些分佈(如的ubuntu)包括特定的用戶(在Ubuntu的情況下:~ubuntu),與每一個用戶在項目級別現有 ssh鍵可以登錄;但該用戶的authorized_keys在創建實例時生成,並且似乎永遠不會由GCE平臺又變了。恕我直言,自動ssh密鑰管理應該是首選。


來源:與GCE個人經驗,terraform,以及谷歌開發者控制檯