本文将从GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》规定的安全计算环境中解读、摘要若干安全要求,结合Abp框架,对站点进行安全升级。

【身份鉴别】应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。

解决方案

  1. 设置密码最小长度

  2. 密码由数字、字母和特殊字符组合而成

  3. 设置密码每隔90天需要更换一次

实施

在AbpSettings表中配置开启PasswordComplexity密码复杂度校验,设置密码最小长度为7位

配置密码强制过期策略,参考用Abp实现找回密码和密码强制过期策略

【身份鉴别】应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。

解决方案

  1. 登录后无操作15分钟,系统自动退出登录状态。

  2. 连续登录失败5次后,锁定账户15分钟

实施

在WebCoreModule中,将Jwt Bearer Token的过期时间从默认的1天改为15分钟

配置用户登录失败锁定

默认将新增用户的IsLockoutEnabled打开

public User()
{
this.IsLockoutEnabled = true;
}

在AbpSettings表中配置开启用户登录失败锁定,并配置失败尝试次数和锁定时长

【身份鉴别】应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。

解决方案

采用两种以上组合的鉴别技术对用户进行身份鉴别,采用用户名+手机短信验证码方式登录

实施

对Abp框架改造,加入两步验证功能,参考用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块

【访问控制】应对登录的用户分配账户和权限;并授予管理用户所需的最小权限,实现管理用户的权限分离。

解决方案

  1. 删除或者禁用默认账户,

  2. 禁用超级管理员,

  3. 设置独立的审计管理员、安全管理员等。

实施

更改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不在允许的列表中");
}
}

【入侵防范】应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求。

解决方案

  1. 对上传接口进行文件格式限制转义处理。
  2. 对系统配置防范XSS跨站脚本攻击

实施

文件系统中配置仅允许业务相关的文件类型上传

 "FileStorage": {
...
"AllowOnlyConfiguredFileExtensions": true,
"FileExtensionsConfiguration": ".jpg,.png",
}

配置上传文本中高危脚本过滤,参考[Asp.Net Core] 网站中的XSS跨站脚本攻击和防范

【安全审计】应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等

解决方案

审计日志存储6个月以上。

实施

对AbpAuditLogs中的数据定期异地备份,保存时长至少6个月以上。

【数据完整性、保密性】应采用校验技术或密码技术保证重要数据在存储过程中的完整性以及保密性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等

解决方案

  1. 采用AES加密对身份证号码等重要数据进行加密后再存储
  2. 传输报文中对敏感数据进行脱敏处理
  3. 页面中对敏感数据进行脱敏处理

实施

使用加密转换器对身份证号字段进行加密存储,参考在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站点的安全性提升的更多相关文章

  1. ABP框架Web API跨域问题的解决方案

    ​1.在Web Api 项目下安装 Microsoft.AspNet.WebApi.Cors 包 Install-Package Microsoft.AspNet.WebApi.Cors 2.在Web ...

  2. [转] ABP框架Web API跨域问题的解决方案

    原文地址:​https://www.cnblogs.com/farb/p/ABPWebAPICrossDomain.html 1.在Web Api 项目下安装 Microsoft.AspNet.Web ...

  3. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  4. 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

    点这里 阅读目录 用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取 解决方案 为什么公开我们的解决方案 实现 AngularJS 服务 结论   Pr ...

  5. crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取

    [转载,后续补上实践case] 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取 [编者的话]Prerender 服务能够为网络爬虫提供预先渲染的 ...

  6. 手工搭建ABP框架(1) - Web项目

    为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Proj ...

  7. ABP框架 - 我的第一个Web API

    本文示例源代码地址https://github.com/lcyhjx/abp-training 上一篇我们已经对ABP是什么,能做什么.有了一个印象.那么接下来我们将动手使用ABP框架快速开发一个AP ...

  8. CodeIgniter框架——创建一个简单的Web站点(include MySQL基本操作)

    目标 使用 CodeIgniter 创建一个简单的 Web 站点.该站点将有一个主页,显示一些宣传文本和一个表单,该表单将发布到数据库表中. 按照 CodeIgniter 的术语,可将这些需求转换为以 ...

  9. ABP框架学习

    一.总体与公共结构 1,ABP配置 2,多租户 3,ABP Session 4,缓存 5,日志 6,设置管理 7,Timing 8,ABPMapper 9,发送电子邮件 二.领域层 10,实体 11, ...

  10. web iis服务器安全性配置实例

    自己不维护服务器,不知道维护服务器的辛苦.刚开始为了嫌麻烦,抱有侥幸心理,一些繁琐的安全设置没有配置,结果服务器连一天都没撑过去.经过10天的反复摸索和努力,现在服务器已经稳定工作一个月了,特此整理本 ...

随机推荐

  1. SAP B1 增加或删除单据,或者是新增修改BOM清单,报错‘出现内部错误时’,一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行检查SQL代码,一般就能发现错误所在。

    SAP B1 增加或删除单据,或者是新增修改BOM清单,报错'出现内部错误时',一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行 ...

  2. cesium 3d tileset 问题总结

    Cesium 3d Tileset 中 i3dm 中存储的模型坐标为笛卡尔坐标,占四个字节,因为地球半径比较大,所以只有整数位和小数点后1位有效,因此会损失精度.对于要求精度比较高的模型,会发现位置偏 ...

  3. C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法

    main.c: #include <stdio.h> #include <stdlib.h> #include "SequenceList.h" int m ...

  4. c语言中%d %f %c %s等的区别

    %d整型输出(%ld长整型输出)%f以小数形式输出,默认情况下保留小数点6位 这里是引用%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号.其中:float,单精度浮 ...

  5. mysql5.7主从搭建过程

    1.下载程序包 mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz ,解压至/opt/app/mysql2.配置/etc/my.cnf[mysql]socket=/o ...

  6. java的maven项目打包成.exe可执行文件

    打包exe可执行脚本: 1.源代码maven项目写完后打包成可执行jar包,此处我使用的是assembly插件. <plugin> <groupId>org.apache.ma ...

  7. Harmonic Number 调和级数(欧拉常数)或者分块暴力

    给你个n让你求 Memory limit 32768 kB 输出误差不超过1e-8 思路:做之前不知都调和级数不知道欧拉常数没问题,肯定能先想到暴力打标,打完发现数组内存太大,那么问题就是怎么能让内存 ...

  8. NET 8 预览版 2 亮点是Blazor

    .NET 团队在2023年3月14日发布了.NET 8预览版2,博客文章地址:https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-pre ...

  9. Solon2 接口开发: 强化 Gateway 模式

    一般可以从这几方面对 Gateway 模式进行强化: 定制异常状态码 定制基类 将一些处理独立封装成类 接口只返回数据部份,异常状态用抛 强化之后,具体的网关即简单,又功能强大.同时会对团队开发形成一 ...

  10. Java 编程入门第一课:HelloWorld

    在之前的文章中,壹哥带大家搭建出了 Java 的开发环境,配置了 JDK 环境变量,并且我们也熟悉了 dos 命令行的操作.那么从这篇文章开始,壹哥就开始带各位真正地学习 Java 代码该怎么写. - ...