不依赖AppDomain的.NET进程多权限细粒度安全控制方案咨询
针对.NET进程的细粒度安全权限控制方案
核心思路
放弃AppDomain和AppContainer的粗粒度隔离,采用「API拦截 + 自定义权限校验逻辑 + 平台原生安全机制」的组合方案,实现File I/O、进程启动、网络访问、注册表操作的细粒度权限管控,且无需手动配置文件ACL。
1. File I/O 权限控制
实现方案:拦截文件操作API,结合Windows令牌权限校验
无需手动设置ACL,通过拦截.NET文件操作方法(如File.ReadAllText、Directory.CreateDirectory),在调用前校验自定义规则或当前进程的系统令牌权限:
- 用
System.Reflection.DispatchProxy创建文件操作类的代理,在代理层嵌入权限校验逻辑; - 或依赖
Castle.DynamicProxy这类拦截器,对所有封装的文件操作服务进行拦截; - 底层可通过P/Invoke调用Windows API
AccessCheck,基于进程令牌检查目标文件的访问权限,替代手动ACL配置。
示例代码片段:
public class FileAccessProxy : DispatchProxy { private readonly FileAccessRules _rules; protected override object Invoke(MethodInfo targetMethod, object[] args) { if (args.Length > 0 && args[0] is string path) { if (!_rules.IsAllowed(path, targetMethod.Name)) { throw new UnauthorizedAccessException($"File access denied: {path}"); } } return targetMethod.Invoke(typeof(File), args); } }
2. 进程启动权限控制
实现方案:拦截Process.Start系列API,自定义启动规则
直接拦截Process.Start的所有重载方法,在启动前校验目标进程的合法性:
- 用
DispatchProxy创建Process类的代理,或封装专属的SafeProcessStarter服务,强制业务代码通过该服务发起进程启动; - 底层可通过P/Invoke调用
CreateRestrictedToken生成降权令牌,再传入CreateProcess限制子进程的权限范围。
关键校验点:
- 目标进程路径是否在白名单内;
- 是否允许传递敏感启动参数;
- 是否允许以提升权限启动进程。
3. Web访问权限控制
实现方案:自定义HttpClientHandler拦截HTTP请求
针对.NET的HTTP请求(HttpClient、WebClient等),通过自定义DelegatingHandler插入权限校验逻辑:
- 封装全局的
SafeHttpClientFactory,所有HTTP请求必须通过该工厂创建的HttpClient发起; - 自定义
PermissionCheckHandler继承DelegatingHandler,在SendAsync方法中校验请求URI是否符合白名单规则。
示例代码片段:
public class PermissionCheckHandler : DelegatingHandler { private readonly WebAccessRules _rules; protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (!_rules.IsAllowed(request.RequestUri)) { throw new HttpRequestException($"Web access denied: {request.RequestUri}"); } return await base.SendAsync(request, cancellationToken); } }
4. 注册表访问权限控制
实现方案:拦截注册表操作API,结合系统权限校验
拦截Microsoft.Win32.Registry类的所有操作方法(如OpenSubKey、SetValue),在调用前校验目标注册表路径的访问权限:
- 用
DispatchProxy创建注册表操作类的代理,或封装SafeRegistryAccessor服务统一处理注册表操作; - 底层可通过P/Invoke调用
RegQueryInfoKey获取注册表项权限,或用AccessCheck校验当前进程令牌的访问权限。
5. 权限组合与全局管控
- 维护统一的
SecurityPolicy配置类,集中管理所有权限规则(文件路径黑白名单、进程白名单、Web域名白名单、注册表路径规则等),所有拦截器共享该配置; - 通过依赖注入将权限校验逻辑注入到所有管控服务中,避免业务代码绕过拦截;
- 对于非托管代码调用(如直接P/Invoke系统API),可配合Windows
Job Object限制进程整体权限,实现双重管控。
注意事项
- 确保拦截器覆盖所有操作入口,包括直接调用.NET底层API和P/Invoke路径;
- 性能敏感场景可缓存权限校验结果,减少重复计算开销;
- 支持权限规则动态更新,无需重启进程生效。
内容的提问来源于stack exchange,提问作者Mohd Ahmed




