读软件开发安全之道:概念、设计与实施05模式(上)

news/2024/11/15 13:32:33/文章来源:https://www.cnblogs.com/lying7/p/18372516

1. 模式

1.1. 模式分类

  • 1.1.1. 设计属性

  • 1.1.2. 暴露最少信息

  • 1.1.3. 冗余

  • 1.1.4. 强力执行

  • 1.1.5. 信任与责任

  • 1.1.6. 反模式

1.2. 模式可以缓解或者避免很多种类的风险,它们可以形成一个重要的工具箱,帮我们解决潜在的安全威胁

1.3. 不需要为了解决一个问题就把所有设计模式全都使用一遍

  • 1.3.1. 如果所有模式都可以使用,就从中选择最好的一两种

  • 1.3.2. 对于关键的安全需求也可以多使用几种模式

  • 1.3.3. 过度使用这些模式反而会带来反效果

  • 1.3.4. 增加复杂性和开销所造成的损失很快就会超过额外增加的安全性

2. 设计属性

2.1. 极简设计

  • 2.1.1. 保持简单

  • 2.1.2. 设计方案应该尽可能简单

  • 2.1.3. 极简设计提高了安全标准,因为设计方案越是简单,出现错误的可能性就越小,没有检测出来的漏洞自然也就越少

  • 2.1.4. 所有特殊的设计都有可能要求我们有大量备用组件,技术层面的挑战也更艰巨

  • 2.1.5. 将功能分解成更小的、独立的组件,让它们共同执行复杂的操作

  • 2.1.6. 极简设计并没有强制规定所有元素必须永远是最简单的

  • 2.1.7. 简单性给系统带来的巨大优势,强调我们只有在复杂性可以带来巨大价值的情况下才应该拥抱“复杂”​

  • 2.1.7.1. 各类Linux平台的权限更简单,也更容易正确地使用

  • 2.1.8. 并不是说越简单的方法就一定越好,或者越复杂的方法就一定存在越多的问题

2.2. 透明设计

  • 2.2.1. 你不应有所隐瞒

  • 2.2.2. 强大的保护方案永远不应该靠隐瞒信息来实现

  • 2.2.2.1. 透明设计(而不是完全透明)

  • 2.2.3. 我们应该把它的强大展现在人们面前,从而起到阻吓攻击者的效果,让攻击者更不容易入侵这个系统

  • 2.2.4. 对于透明设计对应的反模式,知道的人更多,即通过隐匿信息来实现的安全(security by obscurity,隐晦式安全)​

  • 2.2.5. 这种模式反对依靠设计中的机密信息来提升系统的安全性

  • 2.2.5.1. 不是说我们必须公开披露设计方案的信息,也不是说隐藏信息有什么不对

  • 2.2.6. 如果把设计方案彻底公开,这个设计方案的安全性就会降低,就说明这个设计方案应该进行改进,而不是依赖那些没有公开的部分来保持系统的安全性

  • 2.2.7. 通过隐秘来实现的安全之所以不靠谱,是因为虽然这种方式也可以暂时让对手知难而退,但这种机制非常脆弱

  • 2.2.8. 应该努力建立起一套稳固的安全机制,确保无论设计方案的具体信息是否公开,这个设计方案都没有什么需要刻意隐瞒的

3. 暴露最少信息

3.1. err on the safe side

  • 3.1.1. 这是所有模式组别中模式数量最多的一组,也需要我们格外注意

3.2. 最小权限

  • 3.2.1. 只给予刚好能够完成工作的权限,这就是最安全的做法

  • 3.2.2. 永远不要擦一把上膛的枪

  • 3.2.3. 在给电锯更换刀片的时候一定要拔掉电源

  • 3.2.4. 最小权限模式的案例

  • 3.2.5. 这种模式的目的就是在执行任务时降低犯错造成的风险

  • 3.2.6. 也是重要系统的管理员不应该在工作中随便浏览互联网的原因

  • 3.2.6.1. 任何一位称职的管理员都不会输入sudo再加上命令来意外破坏这个系统

  • 3.2.7. 火警警报控制开关上面那一层写着“在紧急情况下打破玻璃”的玻璃

  • 3.2.7.1. 这层玻璃的存在,没有人可以说自己是无意拉响了火警警报

  • 3.2.8. 哪怕攻击者利用了漏洞,我们也希望他们获取到的权限越小越好

  • 3.2.9. 只有在确有必要的情况下,才应该使用那些拥有全部权限的授权(比如超级用户权限)​,而且应该把使用这类权限的时间窗口减到最小

  • 3.2.10. 正确地使用权限肯定更加安全

  • 3.2.10.1. 即使漏洞被攻击者利用,也可以分成轻微的入侵和整个系统遭到入侵

  • 3.2.10.2. 采用最小权限也可以减少因软件错误或者人为失误所造成的破坏

  • 3.2.11. 最小权限并不意味着系统永远都应该赋予用户最低程度的授权

  • 3.2.11.1. 需要控制授权机制的粒度,同时控制调整权限所产生的成本

  • 3.2.11.2. 代码应该尽可能在比较低的权限下运行,只有在必要的情况下才在自然决策点转换到比较高的权限

3.3. 最少信息

  • 3.3.1. 任何情况下,我们都应该收集和访问尽可能少的、完成工作必不可少的个人信息

  • 3.3.2. 最少信息模式(相当于数据隐私方面的最小权限模式)可以帮我们把信息泄露的风险降到最低

  • 3.3.2.1. 应该避免提供不必要的个人信息,一有机会就减少不必要的信息流

  • 3.3.3. 很多时候,软件都不满足这种模式,因为随着时间的推进,接口设计就会服务于越来越多的目的

  • 3.3.4. 在实施层面,最少信息设计方案也包括清除本地缓存的信息(在这些信息已经不需要的情况下)​,只在系统中显示可用数据的一部分信息,并只在用户明确发出请求的情况下才显示信息的详情

  • 3.3.4.1. 显示密码的一般做法就是把密码显示成星号(*),这样可以降低有人在身边窥探密码的风险

  • 3.3.5. 可以让主叫方指定他们需要的信息,同时也只提供他们指定的字段,这就可以把私有信息的数据流减到最低限度

3.4. 默认防御

  • 3.4.1. 软件永远应该是“开箱即用”的安全软件

  • 3.4.2. 在设计软件时,应该坚持默认防御原则(包括其初始状态)​,这样工作人员不加操作也不会给系统带来威胁

  • 3.4.3. 默认防御模式适用于整个系统的配置,以及组件和API参数的配置可选项

  • 3.4.3.1. 默认防御适用于一切有可能影响安全性的设置或者配置,绝不仅仅是默认密码

  • 3.4.3.2. 权限应该默认采用以最严格的限制方式进行设置

  • 3.4.3.3. 用户在确有需要且绝对安全的情况下才能手动修改以使用限制更少的权限

  • 3.4.3.4. 默认情况下,应该禁用一切有可能带来危险的可选项

  • 3.4.3.5. 应该默认启用所有能够提供安全保护的特性,让这些特性从一开始就能够生效

  • 3.4.3.6. 需要始终保持软件更新到最新的版本

>  3.4.3.6.1. 不要使用旧版本且很可能包含已知漏洞的软件,然后盼着它未来自己就能更新
  • 3.4.3.7. 在理想情况下,我们永远都不应该使用那些不安全的可选项

  • 3.4.4. 如果我们希望严肃对待系统安全的问题,就永远不要给系统配置一个不安全的状态,并指望日后再去提升它的安全性,这样做不光会制造漏洞,我们事后还常常会把这件事抛诸脑后

  • 3.4.4.1. 如果我们使用的设备有默认的密码,就应该首先在一个安全的、位于防火墙后面的私有网络中配置好这台设备,然后再把它部署到网络当中

  • 3.4.5. 默认防御比配置各个可选项的应用范围要大得多

  • 3.4.5.1. 不指定API参数的默认值是一种比较安全的做法

  • 3.4.5.2. 浏览器应该默认站点使用的是HTTPS,只有在站点无法连接的时候才切换回HTTP

  • 3.4.5.3. 协商建立新的HTTPS连接的两个对等体设备应该默认首先接受更安全的密码套件

3.5. 放行列表与阻塞列表

  • 3.5.1. 在设计安全机制的时候,应该优选放行列表(allowlist)而不是阻塞列表(blocklist)

  • 3.5.2. 放行列表列举的是安全的情形,所以这种列表在本质上是一个有限枚举的列表

  • 3.5.2.1. 放行列表没有进行穷举也不会给有可能造成人们大面积感染的高风险行为打开大门

  • 3.5.2.2. 使用放行列表可以确保我们的安全

  • 3.5.3. 阻塞列表则正好相反,这种列表希望列举出所有不安全的情形,这样做相当于隐含地放行了其他所有我们希望是安全访问的情形,这类被放行的访问在数量上是无限的

  • 3.5.3.1. 阻塞列表的问题在于,所有它忽略的情形都是这类列表的缺陷

  • 3.5.4. 最安全的阻塞列表是那种包含所有限制情形的列表,但这样的列表往往也过于严格,所以无论如何,阻塞列表都很难满足设计要求

  • 3.5.5. 使用放行列表是一种比较简单的逻辑,我们一般不会把这种做法视为一种模式

3.6. 避免可预测性

  • 3.6.1. 任何可以预测的数据或者行为都没有机密性可言,因为攻击者可以通过猜测来学习到这些内容

  • 3.6.2. 数据的可预测性可以导致严重的缺陷,因为这样的系统可能会导致信息泄露

  • 3.6.3. 可预测性还可以给攻击者提供其他机会

  • 3.6.4. 可预测性的问题有很多不同的形式,不同的设计方案也可能会导致不同类型的信息泄露

  • 3.6.5. 采用安全的随机ID

  • 3.6.5.1. 伪随机数生成器或者使用安全随机数生成器

  • 3.6.5.2. 除非我们确定可预测性不会给我们带来损失,否则应该选择后者,即使安全随机数生成器的生成速度会慢一点

3.7. 失效安全

  • 3.7.1. 如果发生了问题,我们至少要确保问题最终能够被妥善解决

  • 3.7.2. 在物理世界中,失效安全本身属于一种常识

  • 3.7.2.1. 物理定律就决定了这种电路不可能长时间维持过量的电流,否则其最终会被烧毁

  • 3.7.3. 错误情形一般很难进行彻底的测试,如果多种错误组合在一起,出现在新的代码路径上,就更难测试出来了,出现错误的地方就是发起攻击的沃土

  • 3.7.4. 很容易把错误处理当成一项可有可无的工作,然后把这项任务抛诸脑后,很多常见漏洞就是这样产生的

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dapr v1.14 版本已发布

Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统难题,由此显著提高生产力并缩短开发时长。Dapr 是用于构建云原生应用…

k线训练营排名

玩了1天时间,就能排到前30 量学真的好,别的不多说了

tar命令打包指定目录及其文件,而不包括其上级目录

想指定将/var目录下的log目录及其文件打包到当前目录,在压缩包解压时不包括/var目录,可使用如下方式: tar -zcvf log_bak.tar.gz -C /var/ log    # 注意log前面有空格,不是/var/log解压到data目录里查看 tar -zxvf log_bak.tar.gz -C data/可见,将打包的文件解压到da…

【第3期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读 - 下篇

本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,活动主题将深入探讨 Elasticsearch 的两个核心方面:代码结构以及写入和查询的关键流程。本次活动将为 Elasticsearch 初学者和有经验的用户提供宝贵的见解,欢迎大家报名参加、交流学习。 活动主题:Elasticsearch 的…

后台设计产品经理指南:用AxureRP设计功能强大的后台系统仪表盘

在现代化的后台管理系统中,仪表盘(Dashboard)作为核心界面,提供了关键数据的实时可视化展示。它不仅能帮助管理者迅速了解当前业务状况,还能发现潜在问题并及时作出调整。仪表盘的重要性在于其能够整合各类复杂信息,以直观的图表、数字等形式呈现,极大地提升了数据的易读…

网络资产安全防护系统设计与应用(产品经理视角下使用AxureRP的设计方案)

在当今高度数字化的世界中,网络资产的安全防护已成为企业生存与发展的关键要素。网络资产安全防护后台系统作为保障企业信息安全的核心工具,能够实时监控、分析和管理网络中的各类资产,防止潜在的安全威胁。这类系统的重要性在于其可以识别并应对多种安全风险,提供全面的漏…

【内网渗透】域信任关系

https://mp.weixin.qq.com/s/124rVk7mws5jfvIYS1rAaA 一、介绍 信任关系就是可以让一个域内的用户访问另一个域内的资源。 二、传递 2.1 可传递: 什么是信任关系可传递,如下图:A域和B域之间的信任关系是可传递的,B域和C域之间的信任关系也是可传递的,那么A域和C域之间就会…

042、Vue3+TypeScript基础,pinia库存储数据修改的两种方式

01、main.ts代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue//第一步:引入pinia import {createPinia} from piniaconst app = createApp(App);//第二步:创建pinia实例 const pinia = createPinia()…

极客少年旅游回忆录

Day 0 “意外惊喜”原本8:20的飞机直接给我干到8:05起飞,抵达成都天府机场大概在9:35。——哥们太早了,我们在成都租的车还没有及时赶到! 于是,我们等到10:10,驾驶着川 G的车在高速公路上行驶,我特别感慨:大城市的车真的好多!(不怕被超速了哈哈) 待 1h 之后,成功入住…

[vue3] vue3更新组件流程与diff算法

Vue3 中的 patch 函数结合 diff 算法,通过比较新旧 vnode 序列,优化组件更新流程。diff 算法复用旧节点并最小化移动操作,利用最长递增子序列算法提升渲染性能,可以有效减少创建和销毁节点的开销。在Vue3中,组件的更新通过patch函数进行处理。 patch函数源码位置:core/pa…

DDD的函数式编程实现

DDD是一种成熟的软件设计方法,旨在确保领域专家和开发人员能够有效合作,创造出高质量的软件。 本文介绍咋将FP(函数式编程)应用于DDD的实现,使其既优雅又简洁。C4模型中,软件架构图分为四个层次:“系统上下文”、“容器”、“组件”和“代码”。 “组件”是构成容器的基…

使用FModel提取黑神话悟空的资产

介绍使用FModel提取黑神话悟空资产的方法目录前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook。本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的基础使用流程,请见《使用FModel提取UE4/5游戏资产》 …