谷歌云實操手冊 | 安全地連接到虛擬機(jī)實例
時間:2023-06-27 23:36:01 | 來源:網(wǎng)站運(yùn)營
時間:2023-06-27 23:36:01 來源:網(wǎng)站運(yùn)營
谷歌云實操手冊 | 安全地連接到虛擬機(jī)實例:本文檔介紹了安全連接到 Compute Engine 虛擬機(jī)實例的最佳做法,包括通過啟用客機(jī)特性存儲主機(jī)密鑰,以及阻止虛擬機(jī)通過公共互聯(lián)網(wǎng)訪問。
準(zhǔn)備工作
如果你要使用本指南中的命令行示例,請執(zhí)行以下操作:
- 安裝或更新到 Google Cloud CLI 的最新版本。
- 設(shè)置默認(rèn)區(qū)域和可用區(qū)。
通過啟用客機(jī)特性來存儲主機(jī)密鑰
主機(jī)密鑰是標(biāo)識特定主機(jī)或機(jī)器的密鑰對。連接到遠(yuǎn)程主機(jī)時,主機(jī)密鑰用于驗證你是否正在連接到目標(biāo)機(jī)器。
如果你使用 gcloud compute ssh 連接到 Linux 虛擬機(jī),則可以通過將主機(jī)密鑰存儲為客機(jī)特性來增加一層安全性。
將 SSH 主機(jī)密鑰存儲為客機(jī)特性有助于防范中間人 (MITM) 攻擊等漏洞,從而提高連接的安全性。虛擬機(jī)初次啟動時,如果客機(jī)特性已啟用,則 Compute Engine 會將生成的主機(jī)密鑰存儲為客機(jī)特性。然后,Compute Engine 會使用這些存儲的主機(jī)密鑰來驗證與該虛擬機(jī)的所有后續(xù)連接。
主機(jī)密鑰可以存儲為以下公共操作系統(tǒng)映像上的客機(jī)特性:
- Debian
- Ubuntu
- Red Hat Enterprise Linux (RHEL)
- CentOS
- SUSE Linux Enterprise Server (SLES)
如需將主機(jī)密鑰寫入到客機(jī)特性,你必須在第一次啟動虛擬機(jī)之前啟用客機(jī)屬性。你可以在虛擬機(jī)創(chuàng)建期間選定的虛擬機(jī)或在整個項目上啟用客機(jī)特性。
為項目或虛擬機(jī)啟用客機(jī)特性后,客機(jī)操作系統(tǒng)代理會自動將主機(jī)密鑰發(fā)布為客機(jī)特性。如果你使用的是 gcloud compute ssh 而不是普通 SSH 客戶端,則 gcloud CLI 會自動讀取這些特性,并在你下次連接時更新 known_hosts 文件。
如需將主機(jī)密鑰存儲為客機(jī)特性,請完成以下步驟:
1.第一次啟動虛擬機(jī)之前,請執(zhí)行以下操作:在虛擬機(jī)創(chuàng)建期間選定的虛擬機(jī)或在整個項目上啟用客機(jī)特性。
2.使用 gcloud compute ssh 連接到你的虛擬機(jī)。
a.確保你擁有最新版本的 Google Cloud CLI:
gcloud components update
b.連接到虛擬機(jī):
gcloud compute ssh --project=PROJECT_ID / -- zone=ZONE / VM_NAME
請?zhí)鎿Q以下內(nèi)容:
- PROJECT_ID:包含虛擬機(jī)的項目 ID。
- ZONE:虛擬機(jī)所在區(qū)域的名稱
- VM_NAME:虛擬機(jī)的名稱
如果你已為 Google Cloud CLI 設(shè)置默認(rèn)屬性,則可以在此命令中省略 --project 和 --zone 標(biāo)志。例如:
gcloud compute ssh VM_NAME
c.查看啟動消息。例如,Debian 操作系統(tǒng)可能會顯示以下消息:
Writing 3 keys to YOUR_HOME_DIRECTORY/.ssh/google_compute_known_hostsLinux host-key-2 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64
如需確認(rèn)主機(jī)密鑰已存儲為此虛擬機(jī)的客機(jī)特性,請查看主機(jī)密鑰值以驗證 SSH 密鑰已寫入虛擬機(jī)的客機(jī)特性(方式 1),或查看串行端口中是否存在主機(jī)密鑰(方式 2):
方式 1:查看主機(jī)密鑰值你可以使用 Google Cloud CLI 驗證 SSH 密鑰已寫入客機(jī)特性:
gcloud compute instances get-guest-attributes VM_NAME / --query-path="hostkeys/" / --zone=ZONE
請?zhí)鎿Q以下內(nèi)容:
- VM_NAME:虛擬機(jī)的名稱
- ZONE:虛擬機(jī)所在區(qū)域的名稱
輸出內(nèi)容類似如下:
方式 2:查看串行端口1.查看串行端口輸出。
2.選擇串行端口 1。
3.搜索以下消息:
INFO Wrote ssh-rsa host key to guest attributes
如果你的映像使用受支持的操作系統(tǒng),但你在虛擬機(jī)第一次啟動之前未啟用客機(jī)特性設(shè)置,則你可能會看到以下消息:
Unable to write ssh-rsa host key to guest attributes
這意味著主機(jī)密鑰未存儲為此虛擬機(jī)的客機(jī)特性。如果要為計劃創(chuàng)建的其他虛擬機(jī)存儲主機(jī)密鑰,請在虛擬機(jī)首次啟動之前啟用客機(jī)特性。
阻止用戶通過公共互聯(lián)網(wǎng)訪問虛擬機(jī)
在 Compute Engine 上開發(fā)項目時,你希望在各種場景中阻止通過公共互聯(lián)網(wǎng)訪問虛擬機(jī):
- 網(wǎng)絡(luò)服務(wù)尚在開發(fā)階段,尚未準(zhǔn)備好向外部用戶公開,理由是它們的功能不完整或尚未配置 HTTPS。
- 虛擬機(jī)提供的服務(wù)可能僅供項目中的其他虛擬機(jī)使用。
- 虛擬機(jī)只能通過公司辦公室或數(shù)據(jù)中心的專用互連選項訪問。
即使服務(wù)的設(shè)計意圖是面向互聯(lián)網(wǎng)的,也有必要將與服務(wù)的通信限制為面向用戶組且通過安全渠道(如 SSH 或 HTTPS)發(fā)生,以保護(hù)敏感信息。
本文演示了幾種可確保與具有外部 IP 地址的虛擬機(jī)和沒有外部 IP 地址的虛擬機(jī)之間的通信安全無虞的方法。無論你是否保護(hù)使用這些方法的通信,Google Cloud 始終允許虛擬機(jī)實例與其對應(yīng)的元數(shù)據(jù)服務(wù)器之間的通信。
在使用外部 IP 地址的機(jī)器上保護(hù)服務(wù)
在虛擬機(jī)具有公共 IP 地址時,務(wù)必保證僅有你希望公開的服務(wù)和流量可供訪問,同時也要保證在已公開的服務(wù)和流量中,敏感信息均在傳輸過程中得到保護(hù)。你可以采用幾種方法來保護(hù)具有本文檔中所述外部 IP 地址的虛擬機(jī)上的服務(wù),包括防火墻、HTTPS 和 SSL、通過 SSH 進(jìn)行端口轉(zhuǎn)發(fā)和基于 SSH 的 SOCKS 代理。
防火墻第一道防線是使用防火墻限制哪些用戶可以訪問虛擬機(jī)。通過創(chuàng)建防火墻規(guī)則,你可對給定的一組端口上傳送到特定網(wǎng)絡(luò)或目標(biāo)機(jī)器的所有流量進(jìn)行限制,僅允許來自指定源 IP 地址的流量。
防火墻并非獨(dú)立解決方案,僅允許來自特定源 IP 的流量這一做法本身并不能保護(hù)敏感信息(例如登錄憑據(jù),創(chuàng)建或銷毀資源或文件的命令,或者日志)。在可公開訪問的機(jī)器上運(yùn)行網(wǎng)絡(luò)服務(wù)(例如具有外部 IP 的 Compute Engine 虛擬機(jī))時,你必須加密你的主機(jī)與已部署虛擬機(jī)之間的所有通信,確保具有適當(dāng)安全性。
此外,防火墻并非總是合適的解決方案。例如,防火墻不適用于沒有靜態(tài) IP 地址的開發(fā)環(huán)境,例如漫游的筆記本電腦。
HTTPS 和 SSL對于生產(chǎn)網(wǎng)絡(luò)系統(tǒng),建議配置 HTTPS/SSL。你可以通過將某個虛擬機(jī)設(shè)置為 HTTPS 終結(jié)點(diǎn)或配置 HTTPS 負(fù)載平衡來設(shè)置 HTTPS/SSL。HTTPS/SSL 的初始階段確實較為復(fù)雜,你需要執(zhí)行以下任務(wù):
- 注冊域名。
- 從證書授權(quán)機(jī)構(gòu)獲取 SSL 證書。
- 向 HTTPS 負(fù)載平衡器及其連接的虛擬機(jī)注冊該證書,或在一個或多個 Compute Engine 虛擬機(jī)上配置作為 SSL 終結(jié)點(diǎn)的網(wǎng)絡(luò)服務(wù)器或代理。
通過 SSH 進(jìn)行端口轉(zhuǎn)發(fā)你可以使用 Google Cloud CLI 在給定本地端口上啟動服務(wù)器,以通過 SSH 連接將所有流量轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)。
首先,請記下提供安全連接服務(wù)的虛擬機(jī)和端口。然后運(yùn)行以下命令:
gcloud compute ssh VM_NAME / --project PROJECT_ID / --zone ZONE / -- -NL LOCAL_PORT:localhost:REMOTE_PORT
請?zhí)鎿Q以下內(nèi)容:
- VM_NAME 是要連接到的虛擬機(jī)的名稱。
- PROJECT_ID 是你的 Google Cloud 項目 ID。
- ZONE:運(yùn)行你的虛擬機(jī)的地區(qū),例如 us-central1-a。
- LOCAL_PORT:你正在偵聽的本地端口,例如 2222。
- REMOTE_PORT:你要連接的遠(yuǎn)程端口,例如 8888。
例如,如果你指定本地端口為“2222”和遠(yuǎn)程端口“8888”,并在瀏覽器中打開 http://localhost:2222/,HTTP 連接使用你創(chuàng)建到遠(yuǎn)程主機(jī)的 SSH 隧道,以便通過 SSH 連接到指定的虛擬機(jī)。然后,HTTP 連接通過 SSH 隧道連接到同一臺機(jī)器上的端口 8888,但采用的是已加密的安全 SSH 連接。
在 SSH 會話處于活動狀態(tài)時,gcloud 命令創(chuàng)建并維護(hù) SSH 連接。只要你退出 SSH 會話,使用
http://VM_NAME:LOCAL_PORT 端口轉(zhuǎn)發(fā)就會停止工作。
若要創(chuàng)建多個端口轉(zhuǎn)發(fā)規(guī)則,你可以通過重復(fù)使用標(biāo)志在單個命令行中指定多條規(guī)則:
gcloud compute ssh VM_NAME / --project PROJECT_ID / --zone ZONE / -- -NL LOCAL_PORT:localhost:REMOTE_PORT / -- -NL LOCAL_PORT:localhost:REMOTE_PORT
你還可以每次運(yùn)行一個新的 gcloud 命令來創(chuàng)建單獨(dú)的隧道。請注意,如果不退出并從頭開始重新建立連接,則無法在現(xiàn)有連接中添加或移除端口轉(zhuǎn)發(fā)。
基于 SSH 的 SOCKS 代理如果要在你的云部署中連接到大量不同主機(jī),最簡單的方法是對瀏覽器進(jìn)行更改,直接通過你的網(wǎng)絡(luò)執(zhí)行查找。這樣,你就可以使用主機(jī)的簡稱,而不必按每個主機(jī)的 IP 地址進(jìn)行查找、為每項服務(wù)打開端口,也不必為每個主機(jī)/端口對創(chuàng)建一個 SSH 隧道。
在這里,你可以使用如下方法:
1.設(shè)置到網(wǎng)絡(luò)中一臺主機(jī)的單一 SSH 隧道,并在該主機(jī)上創(chuàng)建 SOCKS 代理。
2.更改瀏覽器配置,以使用該 SOCKS 代理主機(jī)執(zhí)行所有查找。
請注意,你使用該主機(jī)通過隧道傳輸所有流量,因此請勿使用該瀏覽器或特定配置文件來瀏覽網(wǎng)頁,理由是該帶寬需要專門用于你的云服務(wù)。通常,我們建議你使用單獨(dú)的瀏覽器配置文件,并在必要情況下切換到該配置文件。
啟動 SOCKS 代理要啟動 SOCKS 代理,請運(yùn)行以下命令:
gcloud compute ssh VM_NAME / --project PROJECT_ID / --zone ZONE --ssh-flag="-D" / --ssh-flag="LOCAL_PORT" / --ssh-flag="-N"
請?zhí)鎿Q以下內(nèi)容:
- VM_NAME:你要連接的虛擬機(jī)的名稱。
- PROJECT_ID:你的 Google Cloud 項目 ID
- ZONE:運(yùn)行你的虛擬機(jī)的地區(qū),例如 us-central1-a。
- LOCAL_PORT:你正在偵聽的本地端口,例如 1080。
請注意,在本例中,你不需要指定遠(yuǎn)程端口。由于 SOCKS 代理不綁定到任何特定的遠(yuǎn)程端口,因此你使用 SOCKS 代理建立的任何連接都將相對于你連接到的主機(jī)進(jìn)行解析。
通過 SOCKS 代理,你可以使用代理的簡稱連接到與代理虛擬機(jī)共用 Compute Engine 網(wǎng)絡(luò)的任何虛擬機(jī)。此外,你還可以連接到給定虛擬機(jī)上的任何端口。
這種方法比簡單的端口轉(zhuǎn)發(fā)方法要靈活得多,但要使用代理,也需要你更改網(wǎng)絡(luò)瀏覽器中的設(shè)置。
接下來,你需要將 Chrome 或 Firefox 配置為使用該代理。
Chrome 默認(rèn)使用系統(tǒng)級代理設(shè)置,因此你需要使用命令行標(biāo)志指定不同的代理。默認(rèn)情況下,啟動 Chrome 會為已運(yùn)行的配置文件創(chuàng)建虛擬機(jī),因此,為了讓你能夠同時運(yùn)行多個 Chrome 副本,一個副本使用代理,而其他副本不使用代理,你需要一個新的配置文件。
使用新配置文件啟動 Chrome。如果該配置文件不存在,則系統(tǒng)會自動創(chuàng)建一個。
Linux:/usr/bin/google-chrome / --user-data-dir="$HOME/chrome-proxy-profile" / --proxy-server="socks5://localhost:1080"
macOS:"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" / --user-data-dir="$HOME/chrome-proxy-profile" / --proxy-server="socks5://localhost:1080"
Windows:"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" ^ --user-data-dir="%USERPROFILE%/chrome-proxy-profile" ^ --proxy-server="socks5://localhost:1080"
請務(wù)必將 localhost 端口設(shè)置為你之前在 gcloud 命令中使用的值(在我們的示例中為 1080)。
連接至沒有外部 IP 地址的虛擬機(jī)
如果虛擬機(jī)沒有外部 IP 地址(包括作為 HTTPS 和 SSL 代理負(fù)載均衡器的后端的虛擬機(jī)),則只有網(wǎng)絡(luò)上的其他虛擬機(jī)可以訪問它們:
- 網(wǎng)絡(luò)上的其他虛擬機(jī)
- Identity-Aware Proxy 的 TCP 轉(zhuǎn)發(fā)功能
- 元數(shù)據(jù)服務(wù)器
- Google Cloud SDK
- 代管 VPN 網(wǎng)關(guān)
你可以在網(wǎng)絡(luò)中預(yù)配虛擬機(jī),以充當(dāng)入站連接(也稱為堡壘主機(jī))的可信中繼。此外,你還可以為網(wǎng)絡(luò)出站流量配置 Cloud NAT,或設(shè)置交互式串行控制臺,以維護(hù)沒有外部 IP 地址的虛擬機(jī)或為其排查問題地址。
堡壘主機(jī)堡壘主機(jī)提供接入包含專用網(wǎng)絡(luò)實例的網(wǎng)絡(luò)的外部入口點(diǎn),如下圖所示。
這種主機(jī)可以提供單一防御或?qū)徍它c(diǎn),而且可啟動或停止來啟用或停用入站 SSH。通過使用堡壘主機(jī),你可以連接到?jīng)]有外部 IP 地址的虛擬機(jī)。通過這種方法,你可以連接到開發(fā)環(huán)境或者為外部應(yīng)用管理數(shù)據(jù)庫實例,例如在不配置額外防火墻規(guī)則的情況下。
堡壘主機(jī)的完整安全強(qiáng)化介紹超出了本文討論范圍,但你可以采取一些初始步驟,包括:
- 限制可與堡壘主機(jī)通信的源 IP 的 CIDR 范圍。
- 配置防火墻規(guī)則,僅允許來自堡壘主機(jī)的 SSH 流量傳輸?shù)綄S锰摂M機(jī)。
默認(rèn)情況下,虛擬機(jī)上的 SSH 會配置為使用私鑰執(zhí)行身份驗證。使用堡壘主機(jī)時,你應(yīng)該先登錄堡壘主機(jī),然后再登錄目標(biāo)專用虛擬機(jī)。由于登錄分兩步進(jìn)行,人們有時也將堡壘主機(jī)稱為“跳轉(zhuǎn)服務(wù)器”,你應(yīng)使用 ssh 轉(zhuǎn)發(fā),而不是通過將目標(biāo)機(jī)器的私鑰存儲在堡壘主機(jī)上的方式訪問目標(biāo)機(jī)器。即使堡壘主機(jī)和目標(biāo)虛擬機(jī)使用相同的密鑰對,你也需要這樣做,因為堡壘主機(jī)只能直接訪問密鑰對的公鑰部分。
使用 IAP 進(jìn)行 TCP 轉(zhuǎn)發(fā)搭配 SSH 使用 IAP 的 TCP 轉(zhuǎn)發(fā)功能可將 SSH 連接封裝在 HTTPS 內(nèi)部。這樣一來,IAP 的 TCP 轉(zhuǎn)發(fā)功能就能將該連接發(fā)送至遠(yuǎn)程虛擬機(jī)。
VPN借助 Cloud VPN,你可以通過與 VPN 網(wǎng)關(guān)設(shè)備的 IPsec 連接將現(xiàn)有網(wǎng)絡(luò)連接到 Google Cloud 網(wǎng)絡(luò)。這樣,就能將來自你本地環(huán)境的流量直接路由到 Compute Engine 虛擬機(jī)的專用 IP 接口。流量在通過公開鏈接傳輸?shù)?Google 時會被加密。
使用 Cloud NAT 的出站流量如果沒有為虛擬機(jī)分配外部 IP 地址,則虛擬機(jī)無法與外部服務(wù)(包括其他 Google Cloud 服務(wù))建立直接連接。要允許這些虛擬機(jī)訪問公共互聯(lián)網(wǎng)上的服務(wù),你可以設(shè)置和配置 Cloud NAT,讓其代表網(wǎng)絡(luò)中的任何虛擬機(jī)路由流量。不要將單個虛擬機(jī)視為高可用性配置,也無法支持多個虛擬機(jī)的高流量吞吐量。
交互式串行控制臺訪問如果虛擬機(jī)沒有外部 IP 地址,你仍可能需要與虛擬機(jī)交互才能進(jìn)行問題排查或維護(hù)。如前所述,你可以選擇設(shè)置堡壘主機(jī),但所需設(shè)置工作量可能超過你的需求。如果要對沒有外部 IP 地址的虛擬機(jī)進(jìn)行問題排查,請考慮在串行控制臺上啟用交互式訪問,這讓你可以使用 SSH 與虛擬機(jī)的串行控制臺進(jìn)行交互然后針對串行控制臺運(yùn)行命令。
HTTPS 和 SSL 代理負(fù)載平衡器作為 HTTPS 和 SSL 代理負(fù)載平衡器后端的虛擬機(jī)無需通過負(fù)載平衡器訪問外部 IP 地址。如需直接訪問這些資源,你需要使用連接到?jīng)]有外部 IP 地址的虛擬機(jī)部分中所列的方法。
WebEye 致力于用創(chuàng)新的技術(shù)向中國企業(yè)提供數(shù)字化效率創(chuàng)新服務(wù),實現(xiàn)數(shù)字化賦能。我們不斷幫助客戶打造新的運(yùn)營與協(xié)作方式,打造新的競爭優(yōu)勢,構(gòu)建資源高效鏈接,共創(chuàng)價值生長空間。