在 Microsoft SQL Server 2012 上激活 FILESTREAM 功能后,SQL Server 将在系统上创建一个“隐藏”共享。份额定义如下:
Sharename FILESTREAM_SHARE
Path \\?\GLOBALROOT\Device\RsFx0320\<localmachine>\FILESTREAM_SHARE
Remark SQL Server FILESTREAM share
Maximum users unlimited
Users Caching Manual caching of documents
Permissions NT-AUTHORITY\Authenticated Users, FULL
该名称是您在SQL Server 配置管理器中最初配置 FILESTREAM 时提供的共享名称。但它是为了什么?
至今
我从以下位置开始通读所有可用的 FILESTREAM 文档:
- 文件流(SQL 服务器)
- 启用和配置 FILESTREAM
- 创建启用 FILESTREAM 的数据库
- 创建用于存储 FILESTREAM 数据的表
- ...以及所有相关的
- FILESTREAM 与其他 SQL Server 功能的兼容性
- FILESTREAM DDL、函数、存储过程和视图
- 使用 OpenSqlFilestream 访问 FILESTREAM 数据
- 论文SQL Server 2008 - SQL Server 2008 中的 FILESTREAM 存储
- 和文章FILESTREAM (OLTP)---a Technical Reference Guide for Designing Mission-Critical OLTP Solutions参考了许多其他材料
...但没有提及份额及其作用或用途。您输入名称,SQL Server 将在后台创建共享。
启用 FILESTREAM 的数据库
当您创建启用 FILESTREAM 的数据库时,该数据库引用一个文件组,该文件组引用一个与共享完全无关的目录(建议在单独的驱动器上),该目录最初是在 FILESTREAM 配置期间创建的。
屏幕截图 启用 FILESTREAM 的数据库脚本
Paul Randall 等人的白皮书。继续解释...
FILESTREAM 数据存储在文件系统中一组称为数据容器的 NTFS 目录中,这些目录对应于数据库中的特殊文件组。对 FILESTREAM 数据的事务访问由 SQL Server 和作为在 Windows 级别启用 FILESTREAM 的一部分而安装的文件系统筛选器驱动程序控制。使用文件系统过滤器驱动程序还允许通过 UNC 路径远程访问 FILESTREAM 数据。SQL Server 维护从表行到与其关联的 FILESTREAM 文件的排序链接。这意味着直接通过文件系统删除或重命名任何 FILESTREAM 文件将导致数据库损坏。
...在文档(第 14 页)的更下方,他们继续进行...
每个具有 FILESTREAM 数据容器的 NTFS 卷都有一个 FILESTREAM 文件系统筛选器驱动程序,并且每个版本的 SQL Server 都有一个在卷上具有 FILESTREAM 数据容器的驱动程序。每个筛选器驱动程序负责管理该卷的所有 FILESTREAM 数据容器,以及使用特定 SQL Server 版本的所有实例。
例如,托管三个 FILESTREAM 数据容器(三个 SQL Server 2008 实例各一个)的 NTFS 卷将只有一个 SQL Server 2008 FILESTREAM 文件系统筛选器驱动程序。
问题
- 很高兴知道 SQL Server 的一切都很好并且捆绑在一起,但是这个共享实际上有什么作用呢?它是所谓的“文件系统过滤驱动程序”吗?
- 看到任何经过身份验证的用户都可以访问“共享”,安全隐患是什么?
- 设备 RsFx0320 是 Windows Server 2012 引入的弹性文件系统格式的前身吗?
如果您可以提供我的问题的答案,那么如果您可以提供源参考,那就太好了。
默认情况下它不这样做,您必须选择启用共享。这是通过 SQL Server 配置管理器完成的。如果您取消选择
Enable FILESTREAM for file I/O access
,共享将被删除。该共享允许客户端(本地和远程)拥有一个单一的共享位置,以使用流式 Windows api 访问文件流数据。这与用于文件流访问的 SQL Server 实例级别设置结合使用
Full Access Enabled
,任何其他访问设置都不应与流 API 一起使用。不它不是。这只是一个文件共享。我试图不弄混水,但您确实要求提供尽可能多的信息。实际上,在上面的删除线文本中,我确实说这不是过滤器驱动程序。然而,这在技术上是半真半假的。是的,它是一个共享文件夹,但它实际上是通过过滤器驱动程序共享的。我真的对此进行了辩论,因为它开始变成一个没有源代码的兔子洞,你真的无法进入(老实说,在我看来,除了学术之外,它没有什么价值)。
过滤器驱动程序的重点是做一些事情,但其中之一是通过各种接口对存储在文件流目标中的数据进行事务访问;SQL Server、Transact SQL、Windows API。它还执行一些其他项目 - 但是通过共享提供的访问权限是通过过滤器驱动程序完成的。事实上,如果您尝试访问文件流中的文件并且不是管理员或 SQL Server,您应该无法访问它们。
所以,是的,这既是也不是过滤器驱动程序。它是通过过滤器驱动程序公开的一半 Windows 文件共享。您可以看到这是您查看共享的路径属性。
您可以更改权限并要求正确设置设置。安全隐患是任何其他文件共享的安全隐患。
不,这是特定版本的过滤器驱动程序的名称。例如,这是一个加载 2016 的系统
RsFx0410
。ReFS 是一个文件系统,这是一个位于文件系统和微型端口驱动程序之间的过滤器驱动程序。实际上,令人不安的是,这是一个遗留过滤器驱动程序,由高度末端的 .10 表示......嗯。您还会注意到它的高度相当低,这对于 3rd 方过滤器驱动程序通常是不可接受的。我没有这方面的来源,但通过屏幕截图和更改设置的配置选项备份了我的信息。通过查看产品本身并了解窗口的工作原理(例如:过滤器驱动程序),可以找到此答案中的所有内容。
以下是我对您的问题的看法:
1. 很高兴知道 SQL Server 拥有一切美好的东西并且捆绑在一起,但这个共享实际上有什么作用?它是所谓的“文件系统过滤驱动程序”吗?
SQL Server 文件流访问就是对文件的访问。共享通过文件共享提供该位置。
您可以使用 OpenSqlFilestream 上的一些 C# 代码轻松地看到这一点
https://learn.microsoft.com/en-us/sql/relational-databases/blob/access-filestream-data-with-opensqlfilestream
如您所见,CreateFile 没有 FILE_SHARE_READ,也没有文件魔术,没有文件流:
注意: 至于为什么没有本地服务器/无共享 FILESTREAM 选项——我不知道。听起来有些人可能会喜欢这种额外的安全级别。
2.看到任何经过身份验证的用户都可以访问“共享”,有什么安全隐患?
哇,好问题。看来,任何经过身份验证的用户都可以使用共享权限,但是,底层的 NTFS 权限应该微调安全性。但是,这对我来说似乎是一个安全漏洞。我必须进一步调查 NTFS 权限的微调程度,但我绝对不喜欢通用文件共享权限。加油微软,所有“经过身份验证的用户”?对或错,我认为微软倾向于忽略共享/关注 NTFS 权限。
多年来,提供“经过身份验证的用户”一直是一个争论不休的话题。这是我反复阅读的关于“经过身份验证的用户”的最佳博客之一。它在 Windows 中根深蒂固,我认为他们不会说这是一个合法的风险——直到他们的新产品问世并摆脱它。
https://social.technet.microsoft.com/Forums/windowsserver/en-US/bb74fa7c-89bd-476d-88bf-e88cd66618e6/why-is-authenticated-users-in-the-local-users-group-by-默认?论坛=winserversecurity
3. 设备 RsFx0320 是 Windows Server 2012 引入的弹性文件系统格式的前身吗?
看起来是基于 SQL 而不是基于 O/S。RsFx0320.sys 是 SQL 2008。如下所示,SQL 2012 是 RsFx0201.sys,SQL 2014 是 RsFx0300.sys:
https://support.microsoft.com/en-us/help/2961258/fix-cannot-access-the-data-in-filetable-after-you-upgrade-from-sql-ser
Microsoft 展示了当您从 2012 升级到 2014 时会发生什么: