9.4 KiB
网络防护
**本文档中引用的文件** - [SameSiteCookiesServiceCollectionExtensions.cs](file://aspnet-core\services\LY.MicroService.AuthServer\Microsoft\Extensions\DependencyInjection\SameSiteCookiesServiceCollectionExtensions.cs) - [IdentityServerModule.Configure.cs](file://aspnet-core\services\LY.MicroService.IdentityServer\IdentityServerModule.Configure.cs) - [AbpAspNetCoreHttpOverridesModule.cs](file://aspnet-core\framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN\Abp\AspNetCore\HttpOverrides\AbpAspNetCoreHttpOverridesModule.cs) - [yarp.json](file://gateways\internal\LINGYUN.MicroService.Internal.ApiGateway\src\LINGYUN.MicroService.Internal.Gateway\yarp.json) - [ocelot.json](file://gateways\internal\LINGYUN.MicroService.Internal.ApiGateway\src\LINGYUN.MicroService.Internal.ApiGateway\ocelot.json)目录
引言
本项目是一个基于ABP框架的微服务管理平台,提供了完整的网络防护机制。系统通过多层安全策略确保Web应用的安全性,包括HTTPS强制、CORS跨域控制、CSRF防护、安全头设置等。本文档详细说明了这些安全功能的实现原理和配置方法。
HTTPS强制重定向与HSTS头设置
系统通过Cookie策略和请求处理机制实现了对HTTPS的强制要求。当检测到非HTTPS请求时,系统会自动调整Cookie的SameSite属性以增强安全性。
在SameSiteCookiesServiceCollectionExtensions.cs文件中,系统实现了对SameSite Cookie策略的精细控制:
flowchart TD
A[开始] --> B{请求是否为HTTPS?}
B --> |是| C[允许SameSite=None]
B --> |否| D[设置SameSite=Unspecified]
C --> E[检查User-Agent兼容性]
D --> F[防止不兼容浏览器的问题]
E --> G[完成Cookie设置]
F --> G
G --> H[结束]
图示来源
- SameSiteCookiesServiceCollectionExtensions.cs
该机制特别针对以下情况进行了优化:
- iOS 12上的Safari、WkWebview和Chrome浏览器
- macOS 10.14上使用Mac OS网络堆栈的Safari浏览器
- Chrome 50-69版本
对于这些可能存在兼容性问题的浏览器,即使在HTTPS环境下也会将SameSite设置为Unspecified,以避免认证问题。
章节来源
- SameSiteCookiesServiceCollectionExtensions.cs
CORS策略配置
系统通过统一的CORS配置实现了跨域资源共享的安全控制。在多个服务模块中都实现了相似的CORS策略配置。
graph TB
A[CORS配置] --> B[获取允许的源列表]
B --> C{源列表为空?}
C --> |是| D[从配置字符串解析]
C --> |否| E[直接使用配置]
D --> F[去除末尾斜杠]
E --> F
F --> G[构建CORS策略]
G --> H[允许任何头部]
G --> I[允许任何方法]
G --> J[允许凭据]
G --> K[暴露ABP特定头部]
H --> L[完成配置]
I --> L
J --> L
K --> L
图示来源
- IdentityServerModule.Configure.cs
CORS配置的主要特点包括:
- 支持通配子域名:通过
SetIsOriginAllowedToAllowWildcardSubdomains()方法实现 - 暴露ABP特定头部:使用
WithAbpExposedHeaders()和WithAbpWrapExposedHeaders()方法 - 允许凭据传输:通过
AllowCredentials()方法支持身份验证信息的跨域传递 - 动态源配置:从配置文件中读取允许的源列表,支持逗号分隔的多个源
这种配置方式既保证了必要的跨域功能,又通过限制暴露的头部和严格的源验证确保了安全性。
章节来源
- IdentityServerModule.Configure.cs
- WorkflowManagementHttpApiHostModule.Configure.cs
CSRF防护机制
虽然项目中没有直接的CSRF防护代码,但通过JWT认证和API网关的转发机制间接实现了CSRF防护。
在API网关配置中,系统通过YARP和Ocelot实现了请求转发和安全控制:
sequenceDiagram
participant Client as 客户端
participant Gateway as API网关
participant Service as 后端服务
Client->>Gateway : 发送API请求
Gateway->>Gateway : 验证JWT令牌
Gateway->>Gateway : 添加X-Forwarded头部
Gateway->>Service : 转发请求
Service->>Service : 验证身份和权限
Service-->>Gateway : 返回响应
Gateway-->>Client : 返回结果
图示来源
- yarp.json
- ocelot.json
关键安全特性:
- 使用JWT进行身份验证,避免了基于Cookie的会话管理
- API网关作为单一入口点,集中处理安全策略
- 请求转发时添加
X-Forwarded-*头部,保留原始请求信息 - 限制响应头的暴露,只允许必要的ABP包装结果头部
章节来源
- yarp.json
- ocelot.json
内容安全策略(CSP)与XSS防护
系统通过多层机制防范XSS攻击,主要包括输入验证、输出编码和安全头设置。
在反向代理配置中,系统实现了请求和响应的转换规则:
flowchart LR
A[客户端请求] --> B{请求类型}
B --> |API请求| C[添加X-Forwarded头部]
B --> |SignalR连接| D[复制请求/响应头]
B --> |静态资源| E[常规转发]
C --> F[后端服务]
D --> F
E --> F
F --> G[处理请求]
G --> H[返回响应]
H --> I[限制暴露的响应头]
I --> J[客户端]
图示来源
- yarp.json
安全特性包括:
- 限制暴露的响应头,只允许
_AbpWrapResult、_AbpDontWrapResult和_AbpErrorFormat - 对SignalR连接启用请求和响应头复制,确保实时通信的安全性
- 使用反向代理隐藏后端服务的真实地址
- 通过JWT认证确保只有授权用户才能访问API
章节来源
- yarp.json
- ocelot.json
安全头信息设置
系统通过多种方式设置了关键的安全头信息,包括X-Content-Type-Options、X-Frame-Options等。
X-Forwarded头部处理
系统通过AbpAspNetCoreHttpOverridesModule模块处理转发的请求头:
classDiagram
class AbpAspNetCoreHttpOverridesModule {
+ConfigureServices()
+Configure()
}
class RequestForwardedHeaderWebClientInfoProvider {
+GetClientIpAddress()
+GetClientName()
+GetClientPort()
}
AbpAspNetCoreHttpOverridesModule --> RequestForwardedHeaderWebClientInfoProvider : "使用"
图示来源
- AbpAspNetCoreHttpOverridesModule.cs
- RequestForwardedHeaderWebClientInfoProvider.cs
主要功能:
- 配置
ForwardedHeadersOptions以处理代理转发的头部 - 替换默认的客户端信息提供者,正确识别通过代理的客户端IP地址
- 支持X-Forwarded-For、X-Forwarded-Proto等标准头部
安全头配置
在网关级别,系统配置了多种安全相关的头部:
flowchart TD
A[请求进入] --> B{是否需要安全头?}
B --> |是| C[添加X-Forwarded头部]
C --> D[设置响应头白名单]
D --> E[转发到后端服务]
E --> F[处理请求]
F --> G[返回响应]
G --> H[确保安全头被正确处理]
H --> I[返回给客户端]
B --> |否| I
图示来源
- yarp.json
安全头策略包括:
- 使用
X-Forwarded-*头部传递原始请求信息 - 严格控制响应头的暴露,防止敏感信息泄露
- 通过网关统一处理安全策略,减轻后端服务的负担
- 支持WebSocket连接的安全转发
章节来源
- AbpAspNetCoreHttpOverridesModule.cs
- yarp.json