访问控制(Windows 筛选平台)

在 Windows 筛选平台 (WFP) 中,基本筛选引擎 (BFE) 服务基于访问令牌和安全描述符实现标准 Windows 访问控制模型

访问控制模型

添加新的 WFP 对象(例如筛选器和子层)时,可以指定安全描述符。 安全描述符使用 WFP 管理功能 Fwpm*GetSecurityInfo0Fwpm*SetSecurityInfo0 进行管理,其中 * 代表 WFP 对象的名称。 这些函数在语义上与 Windows GetSecurityInfoSetSecurityInfo 函数相同。

注意

Fwpm*SetSecurityInfo0 函数不能从显式事务中调用。

注意

如果 Fwpm*SetSecurityInfo0 函数用于管理在同一会话中创建的动态对象,则只能从动态会话中调用这些函数。

下图中筛选器引擎的默认安全描述符 (根引擎对象) 如下所示。

  • 授予 GENERIC_ALL (GA) 对内置 Administrators 组的访问权限。
  • GENERIC_READ ( GR) GENERIC_WRITE (GW) GENERIC_EXECUTE (GX) 网络配置操作员的访问权限。
  • 向以下服务安全标识符授予 GRGWGX 访问权限 (SSID) :MpsSvc (Windows 防火墙) 、NapAgent (网络访问保护代理) 、PolicyAgent (IPsec 策略代理) 、RpcSs (Remote Procedure Call) 和 WdiServiceHost (Diagnostic Service 主机) 。
  • 向所有人授予 FWPM_ACTRL_OPENFWPM_ACTRL_CLASSIFY 。 (这些是粮食计划署特定的访问权限,如下表所述。)

剩余的默认安全描述符通过继承派生。

某些访问检查(例如 Fwpm*Add0Fwpm*CreateEnumHandle0Fwpm*SubscribeChanges0 函数调用)无法在单个对象级别完成。 对于这些函数,每种对象类型都有容器对象。 对于标准对象类型 (例如提供程序、标注、筛选器) ,将重载现有的 Fwpm*GetSecurityInfo0Fwpm*SetSecurityInfo0 函数,以便 null GUID 参数标识关联的容器。 对于其他对象类型 (例如网络事件和 IPsec 安全关联) ,有用于管理容器安全信息的显式函数。

BFE 支持自动继承自由访问控制列表 (DACL) 访问控制条目 (ACE) 。 BFE 不支持系统访问控制列表 (SACL) ACE。 对象从其容器继承 ACE。 容器从筛选器引擎继承 ACE。 下图显示了传播路径。

显示 ACE 传播路径(以“引擎”开头)的示意图。

对于标准对象类型,BFE 强制实施所有泛型和标准访问权限。 此外,WFP 还定义了以下特定访问权限。

WFP 访问权限 说明
FWPM_ACTRL_ADD
将对象添加到容器时是必需的。
FWPM_ACTRL_ADD_LINK
创建与 对象的关联所必需的。 例如,若要添加引用标注的筛选器,调用方必须具有对标注ADD_LINK访问权限。
FWPM_ACTRL_BEGIN_READ_TXN
开始显式读取事务所必需的。
FWPM_ACTRL_BEGIN_WRITE_TXN
开始显式写入事务所必需的。
FWPM_ACTRL_CLASSIFY
需要针对用户模式层进行分类。
FWPM_ACTRL_ENUM
枚举容器中的对象所必需的。 但是,枚举器仅返回调用方FWPM_ACTRL_READ访问的对象。
FWPM_ACTRL_OPEN
需要使用 BFE 打开会话。
FWPM_ACTRL_READ
读取对象的属性所必需的。
FWPM_ACTRL_READ_STATS
读取统计信息所必需的。
FWPM_ACTRL_SUBSCRIBE
订阅通知所必需的。 订阅服务器将仅接收其FWPM_ACTRL_READ访问对象的通知。
FWPM_ACTRL_WRITE
设置引擎选项时必需。

BFE 跳过内核模式调用方的所有访问检查。

为了防止管理员把自己锁定在 BFE 外,始终向内置管理员组的成员授予 FWPM_ACTRL_OPEN 引擎对象。 因此,管理员可以通过以下步骤重新获得访问权限。

  • 启用 SE_TAKE_OWNERSHIP_NAME 权限。
  • 调用 FwpmEngineOpen0。 调用成功,因为调用方是内置管理员的成员。
  • 获取引擎对象的所有权。 此操作成功,因为调用方具有 SE_TAKE_OWNERSHIP_NAME 特权。
  • 更新 DACL。 此操作成功,因为所有者始终具有 WRITE_DAC 访问权限

由于 BFE 支持自己的自定义审核,因此它不会生成泛型对象访问审核。 因此,将忽略 SACL。

WFP 所需的访问权限

下表显示了 WFP 函数访问各种筛选平台对象所需的访问权限。 FwpmFilter* 函数作为访问标准对象的示例列出。 访问标准对象的所有其他函数都遵循 FwpmFilter* 函数访问模型。

函数 选中的对象 需要访问权限
FwpmEngineOpen0 引擎 FWPM_ACTRL_OPEN
FwpmEngineGetOption0 引擎 FWPM_ACTRL_READ
FwpmEngineSetOption0 引擎 FWPM_ACTRL_WRITE
FwpmSessionCreateEnumHandle0 引擎 FWPM_ACTRL_ENUM
FwpmTransactionBegin0 引擎 & FWPM_ACTRL_BEGIN_READ_TXNFWPM_ACTRL_BEGIN_WRITE_TXN
FwpmFilterAdd0 容器提供程序

Sub-Layer
标注
提供程序上下文
FWPM_ACTRL_ADDFWPM_ACTRL_ADD_LINK
FWPM_ACTRL_ADD_LINK
FWPM_ACTRL_ADD_LINK
FWPM_ACTRL_ADD_LINK
FWPM_ACTRL_ADD_LINK
FwpmFilterDeleteById0
FwpmFilterDeleteByKey0
筛选器 DELETE
FwpmFilterGetById0
FwpmFilterGetByKey0
筛选器 FWPM_ACTRL_READ
FwpmFilterCreateEnumHandle0 容器筛选器
FWPM_ACTRL_ENUMFWPM_ACTRL_READ
FwpmFilterSubscribeChanges0 容器 FWPM_ACTRL_SUBSCRIBE
FwpmFilterSubscriptionsGet0 容器 FWPM_ACTRL_READ
IPsecGetStatistics0 IPsec SA DB FWPM_ACTRL_READ_STATS
IPsecSaContextCreate0
IPsecSaContextGetSpi0
IPsecSaContextAddInbound0
IPsecSaContextAddOutbound0
IPsec SA DB FWPM_ACTRL_ADD
IPsecSaContextDeleteById0
IPsecSaContextExpire0
IPsec SA DB DELETE
IPsecSaContextGetById0 IPsec SA DB FWPM_ACTRL_READ
IPsecSaContextCreateEnumHandle0
IPsecSaCreateEnumHandle0
IPsec SA DB & FWPM_ACTRL_ENUMFWPM_ACTRL_READ
IkeextGetStatistics0 IKE SA DB FWPM_ACTRL_READ_STATS
IkeextSaDeleteById0 IKE SA DB DELETE
IkeextSaGetById0 IKE SA DB FWPM_ACTRL_READ
IkeextSaCreateEnumHandle0 IKE SA DB & FWPM_ACTRL_ENUMFWPM_ACTRL_READ
FwpmNetEventCreateEnumHandle0 容器 FWPM_ACTRL_ENUM
FwpmIPsecTunnelAdd0
FwpmIPsecTunnelDeleteByKey0
除了单个筛选器和提供程序上下文的访问检查之外,没有其他访问检查