访问控制(Windows 筛选平台)
在 Windows 筛选平台 (WFP) 中,基本筛选引擎 (BFE) 服务基于访问令牌和安全描述符实现标准 Windows 访问控制模型 。
访问控制模型
添加新的 WFP 对象(例如筛选器和子层)时,可以指定安全描述符。 安全描述符使用 WFP 管理功能 Fwpm*GetSecurityInfo0 和 Fwpm*SetSecurityInfo0 进行管理,其中 * 代表 WFP 对象的名称。 这些函数在语义上与 Windows GetSecurityInfo 和 SetSecurityInfo 函数相同。
注意
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_OPEN 和 FWPM_ACTRL_CLASSIFY 。 (这些是粮食计划署特定的访问权限,如下表所述。)
剩余的默认安全描述符通过继承派生。
某些访问检查(例如 Fwpm*Add0、 Fwpm*CreateEnumHandle0、 Fwpm*SubscribeChanges0 函数调用)无法在单个对象级别完成。 对于这些函数,每种对象类型都有容器对象。 对于标准对象类型 (例如提供程序、标注、筛选器) ,将重载现有的 Fwpm*GetSecurityInfo0 和 Fwpm*SetSecurityInfo0 函数,以便 null GUID 参数标识关联的容器。 对于其他对象类型 (例如网络事件和 IPsec 安全关联) ,有用于管理容器安全信息的显式函数。
BFE 支持自动继承自由访问控制列表 (DACL) 访问控制条目 (ACE) 。 BFE 不支持系统访问控制列表 (SACL) 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 |
除了单个筛选器和提供程序上下文的访问检查之外,没有其他访问检查 |