Live Share 的安全性功能
Visual Studio Live Share 中的共同作業會話功能強大,可讓任意數目的人員加入會話,並共同編輯、偵錯等等。 不過,鑒於此層級的存取權,您無疑會對 Live Share 提供的安全性功能感興趣。 在本文中,我們將提供一些建議和選項,以視需要保護您的環境。
如同任何共同作業工具,請記住,您應該只與您信任的人員共用您的程式代碼、內容和應用程式。
連線性
在對等之間起始會話時,Live Share 會嘗試建立對等連線,而且只有在不可能的情況下(例如防火牆/NAT),才會回復為使用雲端轉送。 不過,在這兩種連線類型(P2P 或轉送)中,在對等之間傳輸的所有數據都是使用 SSH 通訊協定進行端對端加密。 在轉接連線的情況下,SSH 加密會分層在 TLS 加密的 WebSocket 之上。 這表示 Live Share 不相依於雲端轉接服務的安全性。 即使轉譯遭到入侵,也無法解密任何 Live Share 通訊。
Live Share 服務的角色僅限於使用者驗證和會話探索。 服務本身不會儲存或曾經存取會話的任何內容。 Live Share 中的所有用戶內容都會透過 SSH 作業階段傳輸。 這包括程式代碼、終端機、共享伺服器,以及 Live Share 所提供的任何其他共同作業功能,或建置在它上的延伸模組。
若要深入瞭解如何改變這些行為和 Live Share 的連線需求,請參閱 Live Share 的連線需求。
Wire Encryption
SSH 通訊協定會使用 Diffie-Hellman 金鑰交換來建立工作階段的共享密碼,並衍生自 AES 對稱加密的金鑰。 加密金鑰會在會話期間定期輪替。 共用工作階段密碼和所有加密金鑰只會由兩端維護記憶體中,而且只有在會話期間才有效。 它們永遠不會寫入磁碟或傳送至任何服務(包括 Live Share)。
對等驗證
SSH 工作階段也經過雙向驗證。 主機 (SSH 伺服器角色) 會使用公用/私鑰驗證作為 SSH 通訊協定的標準。 當主機共用 Live Share 工作階段時,它會產生工作階段的唯一 RSA 公開/私鑰組。 主機私鑰只會保留在主機進程中的記憶體中;它永遠不會寫入磁碟或傳送至任何服務,包括 Live Share 服務。 主機公鑰會發佈至 Live Share 服務,以及來賓可透過邀請連結存取它的會話連線資訊(IP 位址和/或轉接端點)。 當來賓聯機到主機的 SSH 工作階段時,來賓會使用 SSH 主機驗證通訊協定來驗證主機是否持有對應至已發佈公鑰的私鑰(沒有來賓實際看到私鑰)。
來賓會使用 Live Share 令牌向主機驗證自己。 令牌是由 Live Share 服務所簽發的已簽署 JWT,其中包含有關使用者身分識別的宣告(透過 MSA、AAD 或 GitHub 登入取得)。 令牌也有宣告,指出來賓可以存取該特定的 Live Share 會話(因為它們具有邀請連結和/或由主機特別邀請)。 主機會在允許來賓加入會話之前,先驗證令牌並檢查宣告(且視選項而定,可能會提示主機使用者)。
邀請和聯結存取
每次開始新的共同作業會話時,Live Share 都會產生新的唯一 標識符 ,並放置在邀請連結中。 這些連結提供穩固且安全的基礎來邀請您信任的人,因為連結中的標識碼是「無法猜測的」,而且 只有在單一共同作業會話期間才有效。
拿掉非預期的來賓
身為主機,每當來賓加入共同作業會話時,您就會自動收到通知。
在 Visual Studio Code 中:
在 Visual Studio 中:
更棒的是,如果基於某些原因您不知道來賓,通知可讓您移除已加入的來賓。 (例如,如果您不小心將連結張貼在全公司聊天系統上,並加入隨機員工。只要按兩下出現的通知中的 [移除] 按鈕,它們就會從共同作業會話中退出。
在 VS Code 中,即使您已關閉加入通知,您也能夠在該之後移除參與者。 藉由在 [總管] 或 VS Code 活動列中的自定義索引標籤中開啟 [Live Share] 檢視,您可以將滑鼠停留在參與者的名稱上方或以滑鼠右鍵按兩下,然後選取 [移除參與者] 圖示或選項。
需要來賓核准
一般而言,加入共同作業會話的參與者會 使用 Microsoft 公司或學校帳戶(AAD)、個人 Microsoft 帳戶或 GitHub 帳戶登入 Live Share 。 雖然已登入使用者的「通知 + 移除」預設值為這些來賓提供了良好的速度和控制組合,但如果您正在做一些敏感的事情,您可能會想要 將事情鎖定 一點。
此外,在某些情況下,強制所有來賓登入加入共同作業會話可能會有問題。 範例包括要求新加入 Live Share 的人員作為來賓、教室/學習案例,或與沒有其中一個支援帳戶類型的人員共同作業時。 基於這些原因,Live Share 可以允許未以唯讀來賓身分登入共同作業會話的使用者。 雖然主機必須先 核准 這些來賓,才能依預設加入,但您可能想要不允許這些「匿名」來賓,或一律核准它們。
需要已登入使用者的來賓核准
如果您想要防止登入的來賓加入共同作業會話,直到您「核准」這些會話,請變更下列設定:
在 VS Code 中,將下列內容新增至 settings.json (檔案>喜好>設定 設定):
"liveshare.guestApprovalRequired": true
在 Visual Studio 中,將 [工具>選項>實時共用>] [需要來賓核准] 設定為 True。
從此開始,系統會要求您核准每個加入的來賓。
在 Visual Studio Code 中:
在 Visual Studio 中:
身為來賓,如果您加入主機已啟用此設定的會話,您會在狀態列或加入對話框中收到通知,指出 Live Share 正在等待主機核准。
自動拒絕或接受未登入的使用者(匿名)
如上所述,Live Share 可以設定為允許未登入的使用者以只讀來賓身分加入共同作業會話。 雖然這些 「匿名」來賓在加入時必須輸入名稱 ,但簡單名稱不會提供與實際登入相同的保證層級。 因此, 根據預設,無論上述的「需要來賓核准」設定為何,主機都會提示核准 任何匿名來賓。
您可以 一律拒絕 (停用匿名來賓),或 一律接受 匿名使用者,如下所示:
在 VS Code 中,將 settings.json (檔案>喜好>設定 設定) 設定
liveshare.anonymousGuestApproval
為accept
,reject
或prompt
(預設值) 視需要設定。在 Visual Studio 中,將 [工具 > 選項 > 即時共用 > ][匿名來賓核准] 設定為 [接受]、[拒絕] 或 [提示] (預設值)。
無論如何,請記住,您應該只傳送 Live Share 邀請連結給您信任的人員。
允許來賓命令控制件
若要允許來賓透過程式代碼動作執行任意命令(「快速修正」),而 CodeLens 會設定下列設定:
- 在 VS Code 中,將 settings.json (檔案>喜好>設定 設定) 設定
liveshare.languages.allowGuestCommandControl
為true
或false
(預設值)。
控制檔案存取和可見性
身為來賓,Live Share 的遠端模型可讓您快速讀取/寫入主機與您共用的檔案和資料夾,而不需要同步處理專案的整個內容。 因此,您可以獨立瀏覽和編輯整個共用檔案樹狀目錄中的檔案。 然而,這種自由確實給東道主帶來了一些風險。 在概念上,開發人員可以選擇進入並修改原始程式碼,而不需要您的知識,或看到位於共用檔案樹狀目錄中某處的敏感性原始程式碼或「秘密」。 因此,身為主機,您不一定希望來賓能夠存取您共用之整個專案。 值得慶幸的是,此遠端模型的新增優點是您可以選擇「排除」您不想與任何人共用的檔案,而不犧牲功能。 如果您的來賓仍可以參與偵錯會話之類的專案,如果他們想要自行執行,通常需要存取這些檔案。
您可以將 .vsls.json 檔案新增至您要共用的資料夾或專案,以達成此目的。 您新增至此 json 格式檔案的任何設定都會變更 Live Share 處理檔案的方式。 除了提供您直接控制之外,這些檔案也可以認可原始檔控制,因此任何複製專案的人都可以利用這些規則,而不需要額外努力。
以下是 .vsls.json 檔案範例:
{
"$schema": "http://json.schemastore.org/vsls",
"gitignore":"none",
"excludeFiles":[
"*.p12",
"*.cer",
"token",
".gitignore"
],
"hideFiles": [
"bin",
"obj"
]
}
注意
您也可以在開始共同作業會話時,將共用 的所有檔案/資料夾設為唯讀 。 請參閱下方以取得詳細資料。
讓我們逐步解說這些屬性如何變更來賓可以執行的動作。
屬性
excludeFiles 屬性可讓您指定 Glob 檔案模式清單(非常類似於找到的 .gitignore 檔案),以防止 Live Share 開啟來賓的特定檔案或資料夾。 請注意,這包含來賓 追蹤或跳至編輯位置、在共同偵錯期間逐步執行檔案、任何程式碼流覽功能等案例,例如移至定義等等。 它適用於您從未想要在任何情況下共用的檔案,例如包含秘密、憑證或密碼的檔案。 例如,由於它們控制安全性,所以一律會排除 .vsls.json 檔案。
hideFiles 屬性很類似,但不太嚴格。 這些檔案只會隱藏在檔案樹狀結構中。 例如,如果您在偵錯期間碰巧逐步執行其中一個檔案,它仍會在編輯器中開啟。 如果您沒有 .gitignore 檔案設定,則此屬性主要很有用(如果您使用不同的原始檔控制系統,或只是想要擴大已經存在的內容,以避免雜亂或混淆。
gitignore 設定會建立 Live Share 應該如何處理共享資料夾中 .gitignore 檔案的內容。 根據預設,在 .gitignore 檔案中找到的任何 Glob 都會被視為在 “hideFiles” 屬性中指定它們。 不過,您可以使用下列其中一個值來選擇不同的行為:
選項 | 結果 |
---|---|
none |
檔案樹狀結構中的來賓可以看到 .gitignore 內容(假設它們不是由來賓編輯器設定篩選)。 |
hide |
預設值。 .gitignore 內的 Globs 會像在 “hideFiles” 屬性中一樣進行處理。 |
exclude |
.gitignore 內的 Glob 會像在 “excludeFiles” 屬性中一樣進行處理。 |
設定的 exclude
缺點是,node_modules等資料夾的內容經常在 .gitignore 中,但對於偵錯期間逐步執行會很有用。 因此,Live Share 支援在 excludeFiles 屬性中使用 “!” 反轉規則的能力。 例如,這個 .vsls.json 檔案會排除 “.gitignore” 中除了node_modules以外的所有專案:
{
"$schema": "http://json.schemastore.org/vsls",
"gitignore":"exclude",
"excludeFiles":[
"!node_modules"
]
}
隱藏和排除規則會個別處理,因此如果您仍想要隱藏node_modules以減少雜亂,而不實際排除它,您可以直接編輯檔案,如下所示:
{
"$schema": "http://json.schemastore.org/vsls",
"gitignore":"exclude",
"excludeFiles":[
"!node_modules"
],
"hideFiles":[
"node_modules"
]
}
子資料夾中的 .vsls.json 檔案
最後,就像 .gitignore 一樣,.vsls.json 檔案可以放在子資料夾中。 隱藏/排除規則取決於從您共用根資料夾中的 .vsls.json 檔案開始(如果有的話),然後從該處逐步解說,導致指定檔案尋找要處理的 .vsls.json 檔案。 在檔案樹狀結構更遠的資料夾內 .vsls.json 檔案的內容,然後補充在較高層級建立的規則(或覆寫)。
注意:如果排除該檔案的父目錄,則無法重新包含檔案(!)。 與 .gitignore 類似,在重新包含檔案時,您也需要重新包含檔案的每個父目錄。
停用外部檔案共用
根據預設,Live Share 也會共用主機開啟的任何檔案,這些檔案位於共用資料夾/解決方案外部。 這可讓您輕鬆地快速開啟其他相關檔案,而不需要重新共用。
如果您要停用此功能:
在 VS Code 中,將下列內容新增至 settings.json:
"liveshare.shareExternalFiles": false
在 Visual Studio 中,將 [工具 > 選項 > 即時共用 > ] [共用外部檔案] 設定為 False
唯讀模式
有時候,當您將程式代碼共享為主機時,您不希望來賓進行編輯。 您可能需要來賓查看部分程序代碼,或向大量來賓顯示專案,而且不希望進行任何不必要的或意外的編輯。 Live Share 可讓您以唯讀模式共享專案。
身為主機,在共用時,您可以選擇啟用共同作業會話的只讀模式。 當來賓加入時,他們將無法編輯程式代碼,不過您仍然可以看到彼此的數據指標和醒目提示,以及瀏覽專案。
在唯讀模式中,您仍然可以與來賓共同偵錯。 來賓無法逐步執行偵錯程式,但仍可以新增或移除斷點,並檢查變數。 此外,您仍然可以與來賓共享伺服器和終端機(只讀)。
共同偵錯
當您處理棘手的編碼問題或錯誤時,偵錯時會有一對額外的眼睛可能非常有用。 Visual Studio Live Share 可在主機開始偵錯時,與所有來賓共用偵錯會話,以啟用「共同偵錯」或「共同偵錯」。
身為主機,您在偵錯會話啟動時或停止時完全控制,但如果您與不信任的人共用,共同偵錯確實會造成一些風險。 Live Share 可讓您邀請來賓執行主控台/REPL 命令,因此 有惡意動作項目執行您不希望他們執行的命令的風險。
因此,您應該 只與信任的人共同偵錯。
共用本地伺服器
共同偵錯時,能夠存取主持人針對偵錯工作階段所提供的不同應用程式連接埠會非常有用。 您可能想要在瀏覽器中存取應用程式、存取本機資料庫,或從您的工具叫用 REST 端點。 Live Share 可讓您「共享伺服器」,將主機電腦上的本機埠對應至客體電腦上的完全相同埠。 身為來賓,您接著可以與應用程式互動,就如同它是在本機計算機上執行一樣(例如主機和來賓都可以存取執行於 上的 Web 應用程式 http://localhost:3000).
不過,身為主機,您應該 非常選擇性地使用您與來賓共用 的埠,而只共用應用程式埠,而不是系統埠。 對於來賓,共用連接埠的行為就如同該伺服器/服務是在他們自己的機器上執行。 這非常有用,但如果共用不適當的連接埠,也可能有風險。 基於這個理由,Live Share 不會假設在沒有設定設定和主機執行動作的情況下,應該或不應該共用什麼內容。
在 Visual Studio 中 ,ASP.NET 專案中指定的 Web 應用程式埠 會在 偵錯期間自動共用,以便在執行時 協助來賓存取 Web 應用程式。 不過,您可以視需要將 [工具 > 選項 > 實時共用] [偵錯時共用 > Web 應用程式] 設定為 [False] 來關閉此自動化。
在 Visual Studio Code 中,Live Share 會 嘗試偵測適當的應用程式埠 並加以共用。 不過,您可以將下列內容新增至 settings.json 來停用此功能:
"liveshare.autoShareServers": false
在任一情況下,共用其他埠時,請小心謹慎。
共用終端機
新式開發經常會運用各種命令列工具。 幸運的是,Live Share 可讓身為主持人的您選擇與來賓「共用終端機」。 共用的終端機可以是唯讀或完全共同作業,因此您和您的來賓都能執行命令並看到結果。 身為主機,您可以讓其他共同作業者只查看輸出,或使用任意數目的命令行工具來執行測試、組建,或甚至分級環境特定問題。
只有主機可以啟動共享終端機,以防止來賓啟動一個終端機,並執行您未預期或觀看的事情。 當您以主機身分啟動共用終端機時,可以指定它是否應該是只讀或讀取/寫入。 當終端機是讀取/寫入時,包括主持人在內的每個人都可以在終端機中輸入,這樣當來賓在進行您不希望的操作時,您輕鬆就能介入。 不過,為了安全起見,您應該只在確定來賓確實需要讀取/寫入存取權時才提供此權限,並在您只想要來賓查看您執行之任何命令的輸出時提供唯讀終端機。
在 Visual Studio 中,終端機預設不會共用。 在 VS Code 中,終端機預設會自動共用 唯讀 。 不過,您可以將下列內容新增至 settings.json 來停用此功能:
"liveshare.autoShareTerminals": false
AAD 管理員 同意
使用 Microsoft 支援 的工作或學校電子郵件位址 登入時,您可能會在登入時看到一則訊息,指出「 需要系統管理員核准」 。 這是因為 Live Share 需要對其安全性功能的使用者資訊進行讀取存取,而您的 Azure AD 租使用者則設定為要求存取目錄內容的新應用程式需要「系統管理員同意」。
您的 AD 系統管理員必須使用下列資訊來解決此問題:
- 應用程式名稱:Visual Studio Live Share (測試人員)
- 應用程式類型:Web 應用程式
- 應用程式狀態:生產環境
- 委派的許可權:User.Read
- 應用程式 URL: https://visualstudio.microsoft.com/services/live-share/
- 回覆 URL: https://insiders.liveshare.vsengsaas.visualstudio.com/auth/redirect/windowslive/
這只需要針對使用 Live Share 的任何人執行一次。 如需詳細資訊,請參閱 這裡 和 這裡 。