我一直在做一个项目,根据我们的安全要求,我们正在努力将 Web 层与应用层分离到单独的服务器上。除了一个部分之外,它实际上运行得很好。访问 TFS 站点时,除静态页面位(一些字体、横幅图像和图标)外,所有内容都会加载。我已通过应用服务器上的日志确认服务帐户似乎被授予了访问文件的权限,但它们实际上并未呈现在页面上。此外,对于尝试加载的每个项目,都会出现登录提示,并且输入用户凭据时似乎不起作用。问题大多只发生在仅强制执行 HTTPS 时。如果我将 8080/HTTP 保留为主要 URL 并且不强制执行 SSL,它似乎工作得更好,因为不再有连续的登录提示,但仍然缺少一些图标。在加载 SSL 强制页面时查看页面检查,加载失败的内容显示 HTTP/1.0 并出现 401 错误,但其引用的 URL 列出了 HTTPS。当使用图标或图像文件的直接 HTTPS URL 时,它将下载正常。然后,由于文件已被缓存,我可以刷新 TFS 页面,并且该图标/图像将正确加载而无需登录提示,直到我清除浏览器缓存。我觉得这是 TFS 内部的一些错误行为。我已为服务帐户正确配置了组策略,并在 Web 和应用层服务器上设置了模拟登录和作为服务登录,因此我不认为这是问题所在。我在 2017 年的几个不同版本上尝试过此操作,所有结果都相似。目前在 2017 Update 3.1 patch 6 上,并且 TFS 配置为使用 Negotiate,因为我们在环境中有 NTLM 限制。
更新: 本来想回到这里进一步解释,但我一直很忙。我们遵循 NIST 800-53 要求并遵守 CIS 2 级。因此,Web 应用程序的推荐配置是三层(Web、应用程序和数据)。默认情况下,TFS 在技术上允许最多 2 个层,其中应用程序和 Web 位于同一个框中。我需要将 Web 移到另一个框中才能实现真正的三层架构。所以我想我已经设法找到了一种方法来“欺骗”TFS,让它认为 Web 有第三个服务器,它实际上并没有像应用程序层那样使用应用程序服务,从而从本质上将两个层分开。
这就是我实现目前目标的方法。这些都是 Server 2016 盒子。
- 部署 SQL 2016 框并在 TFS 安装之前使用 sysadmin 将服务帐户添加到 SQL
- 启动 Web 服务器和应用服务器。将服务帐户添加到两个系统上的“身份验证后模拟客户端”和“作为服务登录”策略中。
- 在应用服务器上安装 TFS,在配置期间指向 SQL 框,让安装创建数据库。最初使用自签名 TFS 颁发的证书进行设置以使其运行,并设置 HTTPS 重定向,以便 web.config 文件已为此预设。
- 在 Web 服务器上安装 TFS,但不要配置任何功能。
- 在 TFS 应用程序上使用命令提示符导出 IIS 应用程序池和站点并复制到 Web 服务器。禁用 IIS 服务。在 TFS 安装文件夹和 TFSCache 文件夹设置网络共享并授予 tfsservice 帐户读/写访问权限和 NETWORK SERVICE 以及 TFS_Users 组读取访问权限。(这一部分我仍然不是 100% 确定,并且尝试了多种变化,结果几乎没有变化,除了 TFS_Users 组似乎允许我拉下大部分静态站点位)
- 在 Web 服务器上,编辑导出的“站点”文件以调整绑定以指向自身而不是应用服务器,并将所有三个条目的物理路径更新为应用服务器上的各自 UNC 路径。导入应用程序池和站点。在 IIS 中使用内部 CA 颁发的证书更新绑定,并编辑应用程序设置 > dataDirectory 以指向 tfs_cache 的 UNC 路径。重新启动 IIS。
- 返回应用服务器,打开 TFS 管理控制台并更新公共 URL 以指向 Web 框。点击测试,以便验证并接受证书。(我还在应用服务器上安装了证书,只是为了好用,因为我读到过一些关于多服务器部署的内容,其中有多个应用服务器,在使用来自 CA 的 SSL 证书时,需要让它们都颁发正确的证书。不确定这对我的配置是否真的有必要。)
- 更新后,测试对 TFS 的访问。
TFS 会将 Web 框添加到管理控制台中的应用服务器列表中,但 Web 框上的任何功能均未配置。TFS 几乎将其视为 TFS 代理,因为它在 Web 框上启用了 TFS_Proxy 本地安全组,但实际上并没有像在应用服务器上那样创建 TFS_Application_Tier 安全组。Web 服务器也不能用作典型的“TFS 代理”,因为它不会像设置代理功能那样在本地缓存数据以供使用。
我认为这就是简要的概述,但我会回顾我在经历这一切时所写的记录,以跟踪我在做什么,并确保我没有错过任何相关内容。