1.1实施安全评估的基本过程
安全问题的本质:信任问题
信任域,信任边界
安全三要素:机密性,完整性,可用性
如何实施安全评估?
资产等级划分------------------威胁分析------------风险分析---------------------确认解决方案
资产等级划分:明确目标是什么,要保护什么,互联网安全的核心问题,是数据安全的问题,对互联网公司拥有的资产进行等级划分,就是对数据做等级划分。例如有的公司最关心的是客户资料,有的公司最关注的员工资料信息,做等级划分的过程,需要同各个业务部门的负责人一一进行沟通,了解公司最重要的资产是什么。(公司拥有什么数据,数据的重要程度,为后续的安全评估过程指明方向),完成资产等级的划分,也就是对要保护的对象有个大致的了解,接下来就是划分信任域和信任边界。
威胁分析:如何确定威胁来自于哪里?在安全领域,所有能够造成危害的来源称为威胁,而把可能出现的损失成为风险,风险一定是和损失联系在一起的。
威胁分析就是将所有的威胁都找出来,怎么找?----------------威胁建模,在进行威胁分析的时候,要尽可能地不遗漏威胁。在维护系统安全的时候,有可能花费很多时间与精力实施安全方案,但是攻击者却利用了实现完全没有想到的漏洞,因此在确定攻击面的时候,应该尽可能的全面。
微软提出的STRIDE模型:分析威胁时,可以从以下6个方面去考虑。
威胁 | 定义 | 对应的安全属性 |
Spoofing(伪装) | 冒充他人身份 | 认证 |
Tampering(篡改) | 修改数据或代码 | 完整性 |
Repudiation(抵赖) | 否认做过的事情 | 不可抵赖性 |
Information Dislosure(信息泄露) | 机密信息泄露 | 机密性 |
Denial of Service(拒绝服务) | 拒绝服务攻击 | 可用性 |
Elevation of Privilege(提升权限) | 未经授权获得许可 | 授权 |
风险分析:Risk = Probability*Damage Potential
影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性。
如何科学的衡量风险?微软提出的DREAD模型,指导我们应该从那些方面去判断一个威胁的风险程度。
等级 | 高(3) | 中(2) | 低(1) | |
Damage Potential | 获取完全验证权限;执行管理操作;非法上传文件 | 泄露敏感信息 | 泄露其他信息 | |
Reproducibility | 攻击者可以随意再次攻击 | 攻击者可以重复攻击,但有时间限制 | 攻击者很难重复攻击过程 | |
Exploitability | 初学者在短期内能掌握攻击方法 | 熟练的攻击者才能完成这次攻击 | 漏洞利用条件非常苛刻 | |
Affected users | 所有用户,默认配置,关键用户 | 部分用户,非默认配置 | 极少数用户,匿名用户 | |
Discoverability | 漏洞很显眼,攻击条件很容易获得 | 在私有区域,部分人能看到,需要深入挖掘漏洞 | 发现该漏洞及其困难 |
确认解决方案:设计安全方案,安全评估的产物就是安全解决方案,解决方案一定具备针对性,其针对性是由资产等级划分,威胁分析,风险分析等阶段的结果给出的。
观点:很多人认为安全和业务是冲突的,因为往往为了安全,要牺牲业务。
安全确切的说,应该属于产品的一种属性
一个好的安全方案应该对用户是透明的,尽可能的不要改变用户的使用习惯
一个优秀的安全方案具备哪些特点?
- 能够有效的解决问题
- 用户体验好
- 高性能
- 低耦合
- 易于扩展与升级
1.2 设计具体安全方案的准则和技巧
1.2.1 Secure By Default原则
A:黑白名单原则
黑白名单思想,尽可能的多使用白名单,不使用黑名单
例1:在制定防火墙访问控制策略时,若网站只提供Web服务,那么正确的做法应该是只允许网站服务器的80端口和443端口对外提供服务,屏蔽除此之外的端口(白名单做法)。
若使用黑名单就会出现问题,假设黑名单的访问策略是:不允许SSH端口对Internet开放,那么就要审计SSH的默认端口:22端口是否开放了Internet。但在实际工作过程中,经常会发现有的工程师为了偷懒或图方便,私自改变了SSH的监听端口,比如把SSH的端口从22改到了2222,从而绕过了安全策略。
例2:在网站的生产环境服务器上,应该限制随意安装软件,需要制定统一的软件版本规范。这个规范的制定也可以选择白名单的思想来实现。按照白名单的思想,应该根据业务需求,列出一个允许使用的软件以及软件版本的清单,在此清单外的软件则禁止使用和安装。如果允许工程师在服务器上随意安装软件的话,则可能会因为安全部门不知道、不熟悉这些软件而导致一些漏洞,从而扩大攻击面。
注:在使用白名单时,应当注意避免出现类似通配符“*”
B:最小权限原则:
即是要注意系统只授予主体必须的权限,而不要过度授权。这样能有效减少系统,数据库,网络,应用等出错的机会。
很多时候,开发者不会意识到业务授予用户的权限过高,一定要反问,您确定您的程序一定需要访问Internet吗?
纯文本,富文本
纯文本,只能有文字,基本的标点符号,富文本可以有图,可以有各种特殊的标点符号、分段等格式
1.2.2 纵深防御原则
两层含义:
A:在不同层面,不同方面实施安全方案。
例如:在设计安全方案时,尽可能考虑到web应用安全,os系统安全,数据库安全,网络环境安全等不同层面。不同安全方案之间需要互相配合,构成一个整体,共同组成防御体系。
常见的入侵案例中,大多数是利用Web应用的漏洞,攻击者先获得一个低权限的webshell,然后通过低权限的webshell上传更多的文件,并尝试在服务器上提升权限为root;接下来攻击者再进一步尝试渗透内网,例如数据库服务器所在的网段。此类入侵案例中,若在攻击过程中任何一个环节设置有效的防御措施,都可能导致入侵过程失败,没有哪种方案能够解决所有问题,因此非常有必要将风险分散到系统的各个层面。
B:在正确的地方做正确的事情,要求我们深入理解威胁的本质,从而做出应对措施。即要在解决根本问题的地方实施有效的针对性的方案。
例:XSS防御技术发展过程
UTM产品Unified Threat Management 几乎集成了所有主流安全产品的功能,例如防火墙。VPN,反垃圾邮件,IDS,反病毒等
1.2.3数据与代码分离原则(适用于各种由于“注入”而引发安全问题的场景)
在Web安全中,由于“注入”引起额问题比比皆是,例如XSS,SQL Injection,CSRF Injection,X-Path Injection
1.2.4不可预测性原则
Secure by Default 是时刻要牢记的总则,纵深防御是要更全面、更准确的看待问题;数据与代码分离是从漏洞成因上看问题;不可预测性原则是从克服攻击方法的角度看待问题。
这是一种即使无法修复代码,但是让攻击变得无效的成功的防御。
比如:让程序的栈基址变得随机化,使攻击程序无法准确猜测到内存地址,而大大的提高攻击的门槛。再比如在一些应用系统中,使用随机的id。那么如果攻击者再
想使用类似于
for(int i=0;i<1000;i++){
delete(url="xxx?id="+i);
}
这种方法的攻击将无效,起码是先爬取id的值,再进行delet操作。同样的,现在利用token,利用加密算法,随机算法,哈希算法等,其实都可以找到这条原则的影子。