GitHub最大的安全工程书籍、演讲和论文集

2020-08-03 05:54:22

对我来说,安全工程是建立安全系统的学科。最终,我希望学习如何系统地保护任何东西--无论是计算机网络还是中世纪城堡。

我花了几年时间读罗斯·安德森的书,最终我意识到这本书的结构不适合我。这条学习之路是,希望它也适用于您。

它是关于提出您希望系统拥有的安全属性,选择强制执行这些属性的机制,并确保您的安全属性有效。

策略是我们希望我们的系统具有的高级属性。政策是我们希望发生的事情。

然后我们可以把我们的政策变成一个更详细的模型。模型是一组规则,一种规范,用于实现我们的策略。

监狱设施中的每个人都必须有一个身份证明,表明他/她是囚犯,或者不是囚犯。

幸运的是,在信息安全方面,我们的策略通常围绕机密性、完整性和可用性展开,因此每个策略都有流行的现有安全模型。

多边安全,可以使用分区、BMA、中国墙(根据安德森的书)

没有系统是安全的,只是针对特定的对手是安全的。

这就是为什么了解你的对手是谁,以及每个对手背后的动机和能力是很重要的。

也要考虑非人类的威胁。如果你被要求保护博物馆里的一幅画,从技术上讲,火灾可能不是一个安全问题--但无论如何,它都是需要防范的事情。

我认为只要从一开始就尝试在安全性方面进行设计,就可以使系统变得相当安全。这里有一些这样做的技巧。

例如:您可以设置ail2ban,当然可以。但是这对你有什么好处呢?如果您在任何地方启用了密码SSH身份验证,那么您就已经输了,日志记录和反应性阻止对您没有真正的帮助。不要为这个问题扫描您的日志;扫描您的配置,并确保暴力攻击根本不起作用。

压缩包装工具在Web日志中查找的大部分内容也是如此。OSSEC并不坏,但是你开箱即用OSSEC点亮的东西都意味着出了问题,以至于你被拥有了。

URL正则表达式也是如此。您可以为点击您的管理界面的人设置日志检测。但是,您必须问:为什么您的管理接口一开始就在可路由的IP上可用?

在评估设计时,了解为了实现安全目标必须信任多少系统是很有用的。可信计算基础越小越好。

此外,一旦您确定了现有系统的TCB,您就知道您只需要保护您的TCB。您不必担心将组件固定在TCB外部。

您希望使您的TCB尽可能小、简单、不可绕过、防篡改和可验证,正如我在这里所写的那样。

在设计系统时,减轻成功攻击的影响的一个很好的方法是根据组件的权限级别将系统分解为组件。

然后,询问每个组件需要的最低权限是多少--然后使用沙箱(如果适用)强制执行允许的权限。

假设我们的SRE SSH;之一以root身份进入生产EC2实例,以检查该实例的内存和CPU使用率。相反,我们可以为SRE分配一个非root帐户。更好的是,我们可以将此帐户可以运行的命令列入白名单,甚至可以完全删除SSH访问并设置普罗米修斯进行监视。

一旦你想出了一个初步的设计,下面的技术将帮助你找到你可以添加的额外控件和你需要解决的漏洞。

接受任何攻击。然后,对于这七个类别中的每一个类别,进行头脑风暴防御,这些都属于该类别。

构建攻击树后,您可以方便地进行查询:";列出100k";以下的所有攻击路径。(请记住:我们不寻求绝对的安全,而是针对某一组对手寻求安全。)

另外,记住最薄弱环节原则。您可以在攻击树中查询成本最低的攻击路径,并确保成本不会太低。

通过勾画出对手的杀伤链,我们就可以确定在杀伤链中进行反击的控制措施。请查看MITRE ATT&A;CK。

每个安全控制必须是不可能绕过的、防篡改的和功能正确的。它也必须失效关闭。

如果情况并非如此,则攻击者可以通过颠覆系统控件来侵犯系统的安全属性。

协议不是保护某些东西的工具。但是系统的两个组件之间的所有通信都是通过协议完成的,因此值得学习如何分析协议的漏洞。

我们希望我们的安全控制失效关闭,而不是打开。有两种方法可以分析某些事情可能失败的方式:自上而下的失效树分析(FTA)和自下而上的失效模式和影响分析(FMEA)。

即使某些东西不容易受到攻击(在机密性、完整性或可用性方面),它也可能会泄露信息,从而使这些攻击变得更容易。

例如,以检查用户名是否有效的登录程序为例,如果用户名无效,则返回通用登录失败错误,然后检查密码是否有效,如果无效,则返回相同的通用错误。

乍一看,确定特定用户名是否有效似乎是不可能的。毕竟,无论用户名无效还是用户名有效和密码无效,错误消息都是相同的。

但是,攻击者可以检查获得错误所需的时间,以确定用户名是否有效。

为了保护某些东西,您需要知道您可以使用哪些工具。下面是一些可以在许多不同上下文中使用的内容。

然而,很多工具都是特定于上下文的。例如,在我开始保护一座建筑之前,我会花时间学习我可以使用的所有工具:墙壁、传感器、天然屏障、警卫、闭路电视摄像头等。

这里的想法是让攻击者攻击我们在经济上而不是技术上是不可行的。他仍然可以攻击我们,但他的预期努力将超过他的预期收益。

假设一个骗子设法从每100个人中骗取了5美元。如果我们可以在每个电话中加0.1美元的手续费,那么他就需要支付10美元的手续费才能赚到5美元。

另一个例子是我们自己不存储信用卡数据,而是将其外包给支付处理器,因此攻击我们的回报更少。

威慑有三个部分:确定性、严肃性和快速性。换句话说,为了最有效地威慑攻击者,应该有人能够抓住大部分或全部攻击者--而且动作要快--一旦你抓住了他们,就应该对他们进行充分的惩罚。

这个人可能是政府,通过法律和法规来反对你试图防御的任何东西。政府可能不会抓到每个人,但这些法律法规会阻止大多数人。版权保护、反入店行窃和反非法侵入的法律都是这样的例子。

政府并不是唯一可以阻止对你的攻击的第三方。像北约这样的组织也可以。

或者,您也可以尝试自己对攻击进行报复。例如,媒体公司起诉盗版其电影的人。

如果我们不能防止篡改,我们可以试着在某些东西被篡改时让它变得明显。

例如,这就是一袋袋薯片或几加仑牛奶被密封的原因之一。

在我看来,生物识别是一种认证机制。它通过指示你是谁来做到这一点。(另外两种机制是您知道的和您拥有的)。

在未经授权的情况下,任何向我们系统进行身份验证的人都将拥有对所有内容的完全访问权限。我们想让它比攻击者更困难,而且可能也不会那么信任所有的内部人士。

想想英特尔的保密等级:一些文件是绝密的,另一些是机密的,其他的是机密的,以此类推。这是一个多层次的方案。

即使分析师拥有秘密许可,您也可能不希望他能够访问其他部门的任何文档。这是一个多边方案。

沙箱允许我们获取系统中不受信任的组件,并对其应用安全策略。

假设你是国王,统治着一些公民和罪犯。你可能想用沙箱保护罪犯,以防止他们伤害你的公民,比如说,把他们关进监狱。虽然他们仍然可以互相伤害,但你已经控制了伤害。

默默无闻,而不是它自己,不能算作安全。然而,它可以添加到真正的安全措施之上,使对你的攻击需要更多的时间和更高的技能水平。

在安德森的书中的章节分为两类,在我看来:系统的安全机制和一些现实世界的系统如何被保护的例子。

安全工程的目标是构建一个满足某些安全属性的系统--而不仅仅是添加大量的控制。保证是我们如何证明我们的系统满足我们想要的属性。

“计算机安全:艺术与科学”(毕晓普著)--我先读这篇文章;它按照正确的顺序教授安全工程:政策和模型,然后是机制,最后是保证。

计算安全(作者:Pfleeger)--我特别喜欢关于可信操作系统的章节。

工程信息安全(雅各布斯著)-主要包含一般安全内容,而不是有关安全工程的内容。只有系统工程这一章让人感觉新鲜。

包括一组案例研究,在这些案例研究中,我将按照上面的步骤写出我是如何保护某些东西的。这将帮助我使这些步骤更实用,并填补我缺失的任何空白。