Abp框架Web站点的安全性提升
本文将从GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》规定的安全计算环境中解读、摘要若干安全要求,结合Abp框架,对站点进行安全升级。
【身份鉴别】应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。
解决方案
设置密码最小长度
密码由数字、字母和特殊字符组合而成
设置密码每隔90天需要更换一次
实施
在AbpSettings表中配置开启PasswordComplexity密码复杂度校验,设置密码最小长度为7位
配置密码强制过期策略,参考用Abp实现找回密码和密码强制过期策略
【身份鉴别】应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。
解决方案
登录后无操作15分钟,系统自动退出登录状态。
连续登录失败5次后,锁定账户15分钟
实施
在WebCoreModule中,将Jwt Bearer Token的过期时间从默认的1天改为15分钟
配置用户登录失败锁定
默认将新增用户的IsLockoutEnabled打开
public User()
{
this.IsLockoutEnabled = true;
}
在AbpSettings表中配置开启用户登录失败锁定,并配置失败尝试次数和锁定时长
【身份鉴别】应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
解决方案
采用两种以上组合的鉴别技术对用户进行身份鉴别,采用用户名+手机短信验证码方式登录
实施
对Abp框架改造,加入两步验证功能,参考用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块
【访问控制】应对登录的用户分配账户和权限;并授予管理用户所需的最小权限,实现管理用户的权限分离。
解决方案
删除或者禁用默认账户,
禁用超级管理员,
设置独立的审计管理员、安全管理员等。
实施
更改AbpPermissions,AbpRoles,AbpUserRoles表,合理安排用户角色的权限配置。
【入侵防范】应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制。
解决方案
限制管理员的登录地址范围,仅允许特定IP进行登录管理。
实施
使用IP白名单限制管理员账户登录。
AppSettingNames.cs:
public static class AppSettingNames
{
...
public const string AdminIpAddressWhitelist = "CAH.AdminIpAddressWhitelist";
}
AppSettingProvider.cs:
public class AppSettingProvider : SettingProvider
{
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
return new[]
{
...
new SettingDefinition(AppSettingNames.AdminIpAddressWhitelist, "127.0.0.1,::1,localhost,0.0.0.0", scopes: SettingScopes.Application | SettingScopes.Tenant | SettingScopes.User, isVisibleToClients: true),
};
}
}
在身份验证终节点方法Authenticate中,添加对管理员账户IP白名单的校验:
var ipAddress = this._logInManager.ClientInfoProvider.ClientIpAddress;
var adminIpAddressWhitelist = await SettingManager.GetSettingValueForTenantAsync(AppSettingNames.AdminIpAddressWhitelist, loginResult.Tenant.Id);
var IpCheckRequired = false;
var roles = await userManager.GetRolesAsync(loginResult.User);
if (roles.Contains(StaticRoleNames.Tenants.Admin) || roles.Contains(StaticRoleNames.Tenants.Super))
{
IpCheckRequired = true;
}
if (!string.IsNullOrEmpty(adminIpAddressWhitelist))
{
if (!adminIpAddressWhitelist.Split(',').Contains(ipAddress) && IpCheckRequired)
{
throw new UserFriendlyException("IP不在允许的列表中");
}
}
【入侵防范】应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求。
解决方案
- 对上传接口进行文件格式限制转义处理。
- 对系统配置防范XSS跨站脚本攻击
实施
文件系统中配置仅允许业务相关的文件类型上传
"FileStorage": {
...
"AllowOnlyConfiguredFileExtensions": true,
"FileExtensionsConfiguration": ".jpg,.png",
}
配置上传文本中高危脚本过滤,参考[Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
【安全审计】应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等
解决方案
审计日志存储6个月以上。
实施
对AbpAuditLogs中的数据定期异地备份,保存时长至少6个月以上。
【数据完整性、保密性】应采用校验技术或密码技术保证重要数据在存储过程中的完整性以及保密性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等
解决方案
- 采用AES加密对身份证号码等重要数据进行加密后再存储
- 传输报文中对敏感数据进行脱敏处理
- 页面中对敏感数据进行脱敏处理
实施
使用加密转换器对身份证号字段进行加密存储,参考在EF Core中为数据表按列加密存储
modelBuilder.Entity<User>().Property(c => c.IdentificationNumber).HasConversion<EncryptionConverter<string>>();
修改User到UserDto的字段映射,对手机号,身份证号和邮箱地址进行正则替换。
public UserMapProfile()
{
CreateMap<UserDto, User>();
CreateMap<UserDto, User>()
.ForMember(x => x.Roles, opt => opt.Ignore())
.ForMember(x => x.CreationTime, opt => opt.Ignore())
.ForMember(x => x.IdentificationNumber, opt => opt.Ignore())
.ForMember(x => x.EmailAddress, opt => opt.Ignore())
.ForMember(x => x.PhoneNumber, opt => opt.Ignore());
CreateMap<User, UserDto>()
.ForMember(
dest => dest.PhoneNumber,
opt => opt.MapFrom(
src => Regex.Replace(src.PhoneNumber, "(\\d{3})\\d{4}(\\d{4})", "$1****$2")))
.ForMember(
dest => dest.IdentificationNumber,
opt => opt.MapFrom(
src => Regex.Replace(src.IdentificationNumber, "(?<=\\w{3})\\w(?=\\w{4})", "*")))
.ForMember(
dest => dest.EmailAddress,
opt => opt.MapFrom(
src => Regex.Replace(src.EmailAddress, "(^\\w)[^@]*(@.*$)", "$1****$2")));
CreateMap<CreateUserDto, User>();
CreateMap<CreateUserDto, User>().ForMember(x => x.Roles, opt => opt.Ignore());
}
页面中修改更新方式
【数据备份恢复】应提供重要数据的本地数据备份与恢复功能
解决方案
在本地定期备份配置数据、业务数据。根据实际业务需求定期对备份数据进行恢复测试,保存相关的恢复测试记录。
实施
项目按照SQL server完全备份指南进行备份作业,
由运维人员定期对业务数据进行异地备份,根据实际业务需求定期对备份数据进行恢复测试,并对恢复测试进行记录
Abp框架Web站点的安全性提升的更多相关文章
- ABP框架Web API跨域问题的解决方案
1.在Web Api 项目下安装 Microsoft.AspNet.WebApi.Cors 包 Install-Package Microsoft.AspNet.WebApi.Cors 2.在Web ...
- [转] ABP框架Web API跨域问题的解决方案
原文地址:https://www.cnblogs.com/farb/p/ABPWebAPICrossDomain.html 1.在Web Api 项目下安装 Microsoft.AspNet.Web ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取
点这里 阅读目录 用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取 解决方案 为什么公开我们的解决方案 实现 AngularJS 服务 结论 Pr ...
- crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取
[转载,后续补上实践case] 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取 [编者的话]Prerender 服务能够为网络爬虫提供预先渲染的 ...
- 手工搭建ABP框架(1) - Web项目
为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Proj ...
- ABP框架 - 我的第一个Web API
本文示例源代码地址https://github.com/lcyhjx/abp-training 上一篇我们已经对ABP是什么,能做什么.有了一个印象.那么接下来我们将动手使用ABP框架快速开发一个AP ...
- CodeIgniter框架——创建一个简单的Web站点(include MySQL基本操作)
目标 使用 CodeIgniter 创建一个简单的 Web 站点.该站点将有一个主页,显示一些宣传文本和一个表单,该表单将发布到数据库表中. 按照 CodeIgniter 的术语,可将这些需求转换为以 ...
- ABP框架学习
一.总体与公共结构 1,ABP配置 2,多租户 3,ABP Session 4,缓存 5,日志 6,设置管理 7,Timing 8,ABPMapper 9,发送电子邮件 二.领域层 10,实体 11, ...
- web iis服务器安全性配置实例
自己不维护服务器,不知道维护服务器的辛苦.刚开始为了嫌麻烦,抱有侥幸心理,一些繁琐的安全设置没有配置,结果服务器连一天都没撑过去.经过10天的反复摸索和努力,现在服务器已经稳定工作一个月了,特此整理本 ...
随机推荐
- 学习dom,bom中全选按钮设置
<script> var cbAll = document.getElementById('j_cbAll') //全选按钮 var jt ...
- QT网络编程【一】
1.QUdpSocket头文件无法识别怎么解决? 问题原因:qmake没有添加network的模块.在工程配置文件中添加配置即可. 2.选择c++的socket库还是QUdpSocket? 3.同样的 ...
- UIPath踩坑记一在浏览器控件中找不到”打开浏览器“控件
问题:在浏览器控件中找不到"打开浏览器"控件 解决: 1.检查程序包中是否正常安装"UiPath.UiAutomation"包,如下图12.检查设计设置,是否关 ...
- CH573 CH579 CH582程序烧录讲解
WCH的蓝牙芯片CH57x/CH58x系类大部分是支持串口烧录.USB烧录和LINK烧录的,除了一些特殊的封装,如571K,它引脚较少,只支持串口免按键烧录. 仿真下载:ARM内核的CH579支持Jl ...
- 了解RTT 和RTO 对于TCP 重传的影响
前言 我们已经在很多地方了解TCP 的功能和常用字段.但是TCP 传输发生的异常情况总是让我们很棘手,不知改如何处理.陷入迷茫之中.本文章只针对RTT 和RTO 做了解. 描述 RTT (Round ...
- Windows软件堆栈溢出(stack overflow)的一些解决方法
欢迎访问我的个人博客:xie-kang.com 原文地址 Windows平台下,有三种方法调整堆栈大小(适用于MSVC编译器): 1)添加编译参数:/F size #其中size的单位是byte可设 ...
- python打包成exe过程中遇到的问题
先描述下初始状况: python版本为3.7.3,直接在cmd中运行pip安装pyinstaller失败,应该是最开始安装python时没有把目录添加到环境变量中(我很懒).直接在python的安装目 ...
- webpack之性能优化(webpack4)
在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...
- spring-service.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- markdown常用语法及Typora的使用
一.markdown markdown简介 markdown是一种文档格式,后缀名为.md.markdown非常适于写博客,基本所有博客网站都支持markdown语法格式. 1.标题 mark ...