课程分享 | 安全设计原则

news2025/4/18 5:50:01

讲师介绍

前言

在数字化时代,软件安全已从技术问题升级为关乎企业存亡的战略要务。从SolarWinds供应链攻击到Log4j漏洞风暴,一次次安全事件不断警示我们:传统的边界防护思维已无法应对日益复杂的威胁环境。面对不断演进的攻击手段,我们需要从根本上重构软件设计理念——将安全性内化为系统基因,而非事后补救的外挂功能。软件安全十大设计原则从攻击面控制、权限最小化到防御层次构建,形成了一套完整的安全原生设计范式。下面我们详细介绍软件安全十大原则。

原则一:攻击面最小化

攻击表面,也称攻击面、攻击层面,是指软件环境中可以被未授权用户(攻击者)输入或提取数据而受到攻击的点位(攻击矢量)。

系统每增加一个功能特性就有可能会引入新的风险,通过安全开发可以减少攻击面进而达到控制系统整体风险的目的。

常见的攻击面示例:

  • 用户输入字段:搜索栏、输入框等;
  • 系统读取的文件或者数据,包含读取的数据库;
  • 协议:内部通信的协议;
  • 接口:包含Web接口、API接口等;
  • 服务:内部的消息服务。

针对Web应用的搜索功能,可以通过以下措施减少攻击面:

  • 该功能只能被授权的用户使用。
  • 后端代码对用户输入的数据进行了校验
  • 该功能不支持任意文字输入,只支持从指定列表中查看。

原则二:默认安全

默认安全是指让默认的配置和策略尽可能的安全,只有充分了解业务安全需求的前提下,才能更好的使用该原则。

在许多场合,安全和产品体验经常会发生冲突,这时候应当选择安全优先,在安全的前提下,可以允许通过手动关闭安全配置或策略来提升产品体验。

产品应该默认打开密码复杂度策略,即不允许用户使用不符合密码复杂度策略的密码,但产品可能可以允许用户关闭这个策略来提升体验。

原则三:权限最小化

权限是指某个特定的用户具有特定的系统资源使用权力,像是文件夹,特定系统指令的使用或存储量的限制,权限分为用户权限和资源权限。系统只拥有完成任务所必须的最小权限,即不赋予不必要权限。

  • 某中间件服务器只需要访问网络、读取数据库和向日志服务器写日志的权限,那就完全没有必要赋予其更多其它的权限(特别是管理级别的特权)。
  • 某业务只需要查询的权限,但却使用了root账户进行连接,如果该业务遭受SQL注入攻击,就会造成很大的影响。

原则四:纵深防御

  • 战争学概念:防御地区或防御部署的纵向深度。分为战役纵深防御和战术纵深防御。

  • 安全管理学概念:通过设置多层重叠的安全防护系统而构成多道防线,使得即使某一防线失效也能被其他防线弥补或纠正,即通过增加系统的防御屏障或将各层之间的漏洞错开的方式防范差错发生的。

从不同的维度去实施安全保护措施来缓解被攻击的风险。实施纵深防御策略,可以让攻击变得更加难以实施,漏洞变得更加难以利用。

针对SQL注入攻击,可以通过构建分层适度的防护体系:

  • 在应用外围部署WAF。
  • 应对输入数据进行有效性验证或进行参数化查询。
  • 数据库连接账户隔离以及权限最小化。
  • 敏感数据加密存储。
  • 对数据库进行安全配置或关闭不必要的强大功能。

需要注意的是当纵深防御机制设计得过于复杂时,同时也增加了系统的复杂性导致为了解决某些安全问题而引入了其它的安全问题,

原则五:安全失败

安全失败是指业务系统能够正确安全地处理各种异常和错误,注意初始值安全、异常处理规范化和错误状态无害化。

以下这段代码,默认把isAdmin(是否为管理员)设置成true,一旦代码执行过程中出现失败的状况,isAdmin不会被修改,依旧保持true的状态。这就意味着,即使原本不该拥有管理员权限的情况,由于这个默认设置和执行失败的漏洞,仍可能会以管理员权限来操作,从而造成安全事故。为了避免这种安全失败的情况,应该把isAdmin的初始值设为false。只有当满足特定的条件,经过严格的身份验证和权限检查后,才将其赋值为true,授予管理员权限。

isAdmin = true;
try {
codeWhichMayFail();
isAdmin =isUserInRole("Administrator");
}
catch (Exception ex){
log.write(ex.toString());
}

原则六:不信任第三方系统

第三方系统是不可控的,不少产品需要和第三方的业务系统对接,并使用其提供的数据。无法掌控这些第三方系统的安全设计和开发过程的,所以它们也可能会存在安全漏洞,进而被人攻击。我们必须充分考虑到当第三方系统被攻击时,如何保障自己的业务系统的安全性。

原则七:业务隔离

通过逻辑或物理隔离,确保不同业务模块、数据或权限之间互不干扰,降低单点故障或恶意操作的影响范围。

原则八:公开设计

不少公司都实现了自己的私有加密算法,他们认为只要算法不被泄露或公开,那么算法就是安全的。但是攻击者可以通过抓包或逆向二进制来进行破解;或者通过入侵服务器或给员工机器种植木马的方式来获取到源代码·对公司不满的员工故意公开算法。一旦以上任意条件满足时,则这种不公开设计方式的保护也就变得没有意义。

假设算法被破解或完全公开,同样能保证系统的安全。业界广泛使用的对称加密算法(AES)非对称加密算法(RSA),它们的设计实现都是公开的,但是仍然是安全的。

原则九:简化系统设计

最小化攻击面和简化系统设计是相辅相成的,复杂的系统设计会导致攻击面变宽,所以如果存在多种系统设计方案则应尽量选择最简单的那种方案。

纵深防御和简化系统设计是矛盾冲突的,需要均衡取舍当纵深防御机制设计得过于复杂时,同时也增加了系统的复杂性,导致为了解决某些安全问题而引入了其它的安全问题。

原则十:白名单

白名单是设置能通过的用户,白名单以外的用户都不能通过,除了定义为合法的,其它都拒绝。常用于:允许访问的IP列表、允许访问的端口、可以选择的列表等。

黑名单是设置不能通过的用户,黑名单以外的用户都能通过,除了定义为不合法的,其它都允许。常用于:WAF拦截规则、杀毒软件的引擎规则、通用组件的非法输入过滤等。

在对所有输入数据进行过滤时,适合使用白名单原则,未在白名单范围内的数据将被视为非法,相反地,如果使用黑名单,其规则可能会被预想不到的方法绕过。

其他原则

  • 木桶原则:木桶的最大容积取决于最短的一块木板,攻击者必然在系统中最薄弱的地方进行攻击。
  • 自主和可控性原则:安全问题关系着一个国家的主权和安全,所以网络安全不可能依赖于国外,必须解决网络安全的自主权和自控权问题。

Spring的设计分析

Spring框架是一个开放源代码的J2EE应用程序框架,大概有20个模块组成,这些模块分为核心容器、数据访问/集成、Web、AOP(面向方面编程)、仪器和测试。那么,从十大安全设计原则的角度来考量,Spring 框架是否具备足够的安全性呢?

使用Spring Boot程序的十大实践

  1. 在生产中使用HTTPS;
  2. 使用SCA工具检查依赖;
  3. 升级到最新版本;
  4. 开启CSRF保护;(SpringSecurity默认支持优秀的CSRF。如果您使用Spring MVC的标记或Thymeleaf和@EnableWebsecurity,CSRF令牌将自动添加为一个隐藏的输入字段)
  5. 使用内容安全策略来防止XSS攻击(HTTP Header);
  6. 使用OpenID Connect进行身份验证(SSO);
  7. 使用密码散列(使用安全合格的哈希方法);
  8. 安全存储密钥安全(使用类似Vault密钥管理工具);
  9. 使用DAST测试您的应用程序;
  10. 您的安全团队是否进行了代码评审。

网安加云课堂

2025年4月7日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构 · 初阶】- 单链表

目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法:tail ! NULL 总结: 正确代码物理图解: (2) 尾插整体代码 (思考…

在Linux系统命令行如何使用deepseek官方API调用AI大模型?

在Linux系统命令行如何调用deepseek官方API调用AI大模型? 书接上文: 同样的开头哈哈哈哈: ”在这个AI技术飞速发展的时代,每一个程序员都应该问问自己:如何将人工智能的强大能力融入到我们熟悉的操作系统中&#xff…

我开源了一个“宝藏”开源项目

我开源了一个“宝藏”开源项目 - AI需求分析项目 | 适合交作业和学习 🚀 前言 大家好!最近在学习软件工程和大模型应用开发的过程中,我发现许多学生都遇到了需求分析AI的题目。把一份需求文档转化为用户故事、实体关系或数据库设计&#xff…

SmolDocling:一种超紧凑的视觉语言模型,用于端到端多模态文档转换

paper地址:SmolDocling: An ultra-compact vision-language model for end-to-end multi-modal document conversion Huggingface地址:SmolDocling-256M-preview 代码对应的权重文件:SmolDocling-256M-preview权重文件 一、摘要 以下是文章摘要的总结: SmolDocling 是一…

理解CSS3 的 max/min-content及fit-content等width值

本文首发在我的个人博客: 理解CSS3 的 max/min-content及fit-content等width值https://www.brandhuang.com/article/1744253362074 width/height 的属性值 fit-content 这是一个 CSS3 属性,用来设置元素的宽度和高度,值为 fit-content&#…

关键路径任务延误,如何快速调整

快速识别延误原因、优化资源配置、实施任务并行、调整任务优先级是关键路径任务延误后快速调整的有效方式。其中,快速识别延误原因尤为重要,需要项目管理者及时发现影响关键路径任务延误的核心问题,通过系统性的分析,确保延误的具…

Elasticsearch 全面解析

Elasticsearch 全面解析 前言一、简介核心特性应用场景 二、核心原理与架构设计1. 倒排索引(Inverted Index)2. 分片与副本机制(Sharding & Replication)3. 节点角色与集群管理 三、核心特点1. 灵活的查询语言(Que…

linux入门四:Linux 编译器

一、C 语言编译器 GCC:开启编程之旅 1.1 GCC 安装:一站式工具链 GCC(GNU Compiler Collection)是 Linux 下最常用的 C/C 编译器,支持多种编程语言。安装命令(适用于 Debian/Ubuntu 系统)&…

springboot集成springcloud vault读值示例

接上三篇 Vault---机密信息管理工具安装及常用示例 Vault机密管理工具集群配置示例 vault签发根证书、中间证书、ca证书流程记录 项目里打算把所有密码都放到vault里管理,vault提供了springcloud vault用来在springboot里连接vault,启动加载vault里的值放…

edis 主从复制

Redis 主从复制是一种数据同步机制,主节点(Master)将数据复制到一个或多个从节点(Slave),从 而实现数据备份、读写分离和高可用性。 1、解决我们的日常一个单机故障,而衍生出来 主从架构 2、…

机器视觉+深度学习,让电子零部件表面缺陷检测效率大幅提升

在精密加工的3C电子行业中,一抹0.1毫米的油渍,一粒肉眼难辨的灰尘或将引发整机性能隐患。当制造业迈入微米级品质竞争时代,产品表面看似微不足道的脏污缺陷,正成为制约企业高质量发展的隐形枷锁。分布无规律的污渍斑点、形态各异的…

Java基础关键_035_Lambda 表达式

目 录 一、引例:TreeSet 排序 1.实现 Comparable 接口 2.比较器 3.匿名内部类 4.Lambda 表达式 5.Lambda 表达式和匿名内部类的区别 二、函数式编程 三、Lambda 表达式的使用 1.无返回值函数式接口 (1)无返回值无参数 (…

OPEX baota 2024.02.26

OPEX baota 2024.02.26 运维集成软件宝塔2024.02.26作废例子: 最重要的两个地方:上传文件 网站,重启应用服务器(tomcat) 其他很少用的

若依 前后端部署

后端:直接把代码从gitee上拉去到本地目录 (https://gitee.com/y_project/RuoYi-Vue ) 注意下redis连接时password改auth 后端启动成功 前端:运行前首先确保安装了node环境,随后执行: !!一定要用管理员权限…

LeetCode算法题(Go语言实现)_37

题目 给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下: 选择二叉树中 任意 节点和一个方向(左或者右)。 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。 改变前进方…

使用 react-three-fiber 快速重构 Three.js 场景⚛️

不明白的知识先放在一边,激发兴趣是第一步,所以不必纠结代码的细节,相信我你很快就会爱上这种感觉!!! 今天,我们将更进一步,将上一篇中vite npm传统 Three.js 原生代码完整 重构为 …

RT-Thread 屏蔽在线软件包的方法

说明 可能大家对 RT-Thread 的 Kconfig 配置项,Scons 构建有些疑惑,其实 BSP 的 Kconfig 可以自由的配置,目录也可以自由的调整 RT-Thread BSP 默认都有在线软件包的配置项,如果你不需要在线软件包,也可以把这个配置项…

深入理解Java反射

反射(Reflection)是Java语言的一个强大特性,它允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法和构造器。就是在获取运行时的java字节码文件,通过各种方法去创建对象,反射是Java被视为动态语言的关键特性之一。 反射其实就是…

Apipost自定义函数深度实战:灵活处理参数值秘籍

在开发过程中,为了更好地处理传递给接口的参数值,解决在调试过程中的数据处理问题,我们经常需要用到函数处理数据。 过去,我们通过预执行脚本来处理数据,先添加脚本,然后将处理后的结果再赋值给请求参数。…

对重大保险风险测试的算法理解

今天与同事聊到重大保险风险测试,借助下面链接的文章, 谈IFRS 17下的重大保险风险测试 - 知乎 谈一下对下图这个公式的理解。 尤其是当看到下面这段文字的解释时,感觉有些算法上的东西,需要再澄清一些。 首先,上面文…