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 的连接要求。
网络加密
SSH 协议使用 Diffie-Hellman 密钥交换来建立会话的共享机密,并从中派生出用于 AES 对称加密的密钥。 加密密钥在整个会话期间定期轮换。 共享会话机密和所有加密密钥仅由双方在内存中维护,并且仅在会话期间有效。 它们永远不会写入磁盘或发送到任何服务(包括 Live Share)。
对等身份验证
SSH 会话也是经过双向身份验证的。 主机(SSH 服务器角色)使用公钥/私钥身份验证这是 SSH 协议的标准身份验证。 当主机共享 Live Share 会话时,它会为该会话生成唯一的 RSA 公钥/私钥对。 主机私钥只保存在主机进程的内存中;它永远不会写入磁盘或发送到任何服务,包括 Live Share 服务。 主机公钥与会话连接信息(IP 地址和/或中继终结点)一起发布到 Live Share 服务,来宾可以通过邀请链接进行访问。 当来宾连接到主机的 SSH 会话时,来宾使用 SSH 主机身份验证协议来验证主机是否持有与发布的公钥对应的私钥(来宾实际上不会看到私钥)。
来宾使用 Live Share 令牌向主机进行身份验证。 该令牌是由 Live Share 服务颁发的签名 JWT,其中包含有关用户标识(通过 MSA、AAD 或 GitHub 登录获得)的声明。 该令牌还具有表明允许来宾访问特定 Live Share 会话的声明(因为他们具有邀请链接和/或他们受到主持人的特别邀请)。 在允许来宾加入会话之前,主机验证该令牌并检查声明(具体取决于选项可能会提示主机用户)。
邀请和加入访问
每次启动新的协作会话时,Live Share 都会生成一个新的唯一标识符,并放置在邀请链接中。 这些链接为邀请你信任的人提供了可靠、安全的基础,因为链接中的标识符是“不可猜测的”,并且仅在单个协作会话的持续时间内有效。
删除意外来宾
作为主持人,一旦来宾加入协作会话,就会自动收到通知。
在 Visual Studio Code 中:
在 Visual Studio 中:
更好的是,如果由于某种原因,你不认识已加入的来宾,则通知允许你删除他们。 (例如,如果不慎将链接发布到公司范围内的聊天系统且有一名随机员工加入。)只需单击显示通知中的“删除”按钮,便可将其从协作会话中移除。
在 VS Code 中,即使已经关闭了加入通知,也可以在此之后删除参与者。 通过在资源管理器中打开 Live Share 视图或在 VS Code 活动栏中打开自定义选项卡,可以将鼠标悬停在参与者的姓名上或右键单击参与者的姓名,然后选择“删除参与者”图标或选项。
需要来宾批准
通常,加入协作会话的参与者将使用 Microsoft 工作或学校帐户 (AAD)、个人 Microsoft 帐户或 GitHub 帐户登录 Live Share。 虽然已登录用户的“通知 + 删除”默认设置为这些来宾提供了很好的速度和控制,但如果你正在做一些敏感的事情,你可能需要更多的时间来锁定内容。
此外,在某些情况下,强制所有来宾登录加入协作会话可能会有问题。 例如,要求 Live Share 的新用户以来宾身份加入课堂/学习场景,或者与没有受支持帐户类型之一的用户协作时。 由于这些原因,Live Share 可以允许未登录的用户以只读来宾身份加入协作会话。 默认情况下,虽然主持人需要先批准这些来宾,他们才能加入,但你可能想要禁止这些“匿名”来宾或始终批准他们。
要求对已登录的用户进行来宾批准
如果你想要阻止已登录的来宾加入你的协作会话,直到你“批准”他们,请更改以下设置:
在 VS Code 中,将以下内容添加到 settings.json(“文件”>“首选项”>“设置”):
"liveshare.guestApprovalRequired": true
在 Visual Studio 中,将“工具”>“选项”>“Live Share”>“需要来宾批准”设置为 True。
从现在开始,系统会要求你批准加入的每个来宾。
在 Visual Studio Code 中:
在 Visual Studio 中:
作为来宾,如果你加入主持人启用了此设置的会话,你将在状态栏或加入对话框中收到 Live Share 正在等待主持人批准的通知。
自动拒绝或接受未登录的用户(匿名)
如上所述,Live Share 可以配置为允许未登录的用户以只读来宾身份加入协作会话。 虽然这些“匿名”来宾在加入时必须输入姓名,但简单的姓名并不提供与真实登录相同的保证级别。 因此,默认情况下,无论上述“需要来宾批准”设置如何,都会提示主持人批准任何匿名来宾。
你可以始终拒绝(禁用匿名来宾)或始终接受匿名用户,如下所示:
在 VS Code 中,根据需要将 settings.json(“文件”>“首选项”>“设置”)中的
liveshare.anonymousGuestApproval
设置为accept
、reject
或prompt
(默认值)。在 Visual Studio 中,将“工具”>“选项”>“Live Share”>“匿名来宾批准”设置为“接受”、“拒绝”或“提示”(默认值)。
无论如何,请记住,只应将 Live Share 邀请链接发送给你信任的人。
允许来宾命令控制
若要允许来宾通过代码操作(“快速修复”)和 CodeLens 运行任意命令,请设置以下设置:
- 在 VS 代码中,将 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 属性允许你指定阻止 Live Share 为来宾打开某些文件或文件夹的 glob 文件模式列表(非常类似于找到的 .gitignore 文件)。 请注意,这包括以下场景:例如来宾追随或跳转到你的编辑位置、在协作调试期间单步执行文件、任何代码导航功能(如转到定义)等等。它适用于在任何情况下都不想共享的文件,例如包含机密、证书或密码的文件。 例如,由于 .vsls.json 文件控制安全性,因此始终会排除它们。
hideFiles 属性类似,但没有那么严格。 这些文件只是从文件树中隐藏起来。 例如,如果你在调试期间碰巧单步执行了其中一个文件,它仍会在编辑器中打开。 如果你没有 .gitignore 文件设置(如果使用不同的源代码管理系统就是这种情况),或者如果你只是想增加已经存在的内容以避免混乱或混淆,则此属性非常有用。
gitignore 设置确定 Live Share 应如何处理共享文件夹中 .gitignore 文件的内容。 默认情况下,.gitignore 文件中的任何 glob 都被视为在“hideFiles”属性中指定。 但是,可以使用以下值之一选择不同的行为:
选项 | 结果 |
---|---|
none |
.gitignore 内容在文件树中对来宾可见(假设它们没有被来宾编辑器设置筛选)。 |
hide |
默认值。 .gitignore 中的 glob 被处理,就好像它们在“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 中,将“工具”>“选项”>“Live Share”>“共享外部文件”设置为 False
只读模式
有时,当你以主持人身份分享代码时,不希望来宾进行编辑。 你可能需要来宾查看一些代码,或者你正在向大量来宾展示你的项目,并且不希望进行任何不必要或意外的编辑。 Live Share 提供了在只读模式下共享项目的功能。
作为主持人,在共享时,你可以选择为协作会话启用只读模式。 当来宾加入时,他们将不能对代码进行编辑,但你仍然可以看到彼此的游标和突出显示的内容以及在项目中导航。
在只读模式下,你仍然可以与来宾进行共同调试。 来宾将无法逐步完成调试过程,但仍可添加或删除断点以及检查变量。 此外,你仍然可以与来宾共享服务器和终端(只读)。
共同调试
处理棘手的编码问题或 bug 时,在调试时获得他人的帮助可能非常有用。 Visual Studio Live Share 通过在主持人开始调试时与所有来宾共享调试会话来启用“协作调试”或“共同调试”。
作为主持人,你可以完全控制调试会话何时开始或停止,但如果你与不信任的人共享,则共同调试确实会带来一些风险。 Live Share 允许你邀请的来宾运行控制台/REPL 命令,因此存在恶意行动者运行你不希望他们运行的命令的风险。
因此,你应只与你信任的人进行共同调试。
共享本地服务器
共同调试时,访问主持人为调试会话提供的应用程序的各个部分非常有用。 你可能希望在浏览器中访问应用、访问本地数据库或从工具中访问 REST 终结点。 Live Share 可实现“共享服务器”,它将主持人计算机上的本地端口映射到来宾计算机上完全相同的端口。 作为来宾,你可以像在应用程序在你的计算机上本地运行时那样与它交互(例如,主持人和来宾都可以访问在 http://localhost:3000). 上运行的 Web 应用
但是,作为主持人,你应谨慎选择要与来宾共享的端口,并只共享应用程序端口(而不是系统端口)。 作为来宾,如果服务器/服务是在其自己的计算机上运行的,则共享端口的行为完全相同。 这很有用,但是如果共享了错误的端口,也会具有风险。 出于此原因,Live Share 不会对在没有配置设置和主持人执行操作的情况下应该或不应该共享的内容进行任何假设。
在 Visual Studio 中,ASP.NET 项目中指定的 Web 应用端口仅在调试期间自动共享,以方便来宾在运行时访问 Web 应用。 但是,如果你愿意,可以通过将“工具”>“选项”>“Live Share”>“在调试时共享 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 的任何人,只需执行一次此操作。 查看此处和此处了解详细信息。