有关 follow-on 对话威胁建模
Michael Howard
MSDN Magazine 》 的可能 2009年问题包括 A 对话关于威胁建模"一文就会暴露 Paige,一个年轻的安全 neophyte 之间 Michael,一个有点 jaded 的安全专家对话。本月我将占用对话它离开的地方。
场景我
在 coffeepot 旁边一个小型办公室厨房。
Paige:最后一次我们满足,做好查看我的威胁模型的时间,但您说您希望在以后介绍一些加密和安全设计问题。欢迎也,使用该更高版本的日期。
Michael:我可以请获得一个咖啡第一次吗?
不等待一个响应,Michael pours 自己一个巨大的咖啡。
Paige:,确定。
Michael:再提醒我您的应用程序是什么。
Paige:这是允许用户在我们的服务器上存储数据的产品。还有一小段将位推送到服务器保留为该用户的客户端代码。此代码可以上载文件从用户通过在 Web 服务器我们后端,并且文件存储在文件系统一起存储在 SQL Server 中快速查找文件元数据中。我们可能会存储最终几十亿张的文件。在两个主要的环境是加入域的计算机和 Internet 连接的计算机。
Michael:噢,右那我记得现在。如此多的代码,所以很少的时间。确定,我们回到您要查看我们关心的哪一部分的威胁模型。您是否在 DFD--数据流关系图吗?
两种指导通过 Paige 的支持。她使用她的智能卡登录,并加载 SDL 威胁建模工具。
Paige:下面是。
Michael 关系图上的外观。
Michael:这是在第 1 级关系图右吗?这是一个级别详细比上下文关系图吗?
Paige:yup。我们也有一个第 2 级关系图,但我不认为我们需要的深度还。
Michael:您说,这是理想的。如果需要更精确地为我们通过此,我们可以查看第 2 级关系图。
Paige:通过在方法未调用它们 DFD 不再。
Michael:确定擦除!什么是它们称为,然后?
Paige:应用程序关系图。
Michael:任何浮动在船形,我 s'pose。我们将使用蜡笔下一步。确定,回该关系图。从而在用户发出请求来上载或下载文件,或从服务器,客户端应用程序的服务器仍然存在放在文件系统中的数据结尾,以及有关文件保留在 SQL Server 一些元数据?
Paige:这是一个使用 ;实际上,它可能是主方案。当然,管理员需要设置、 配置和监视应用程序 ;这是在管理工具的用途。
Michael:我们将重点核心方案的然后。
场景 II
Michael 为 intently 面对在应用程序关系图。
Michael:让我们开始查看该核心方案中的每个元素,并且我们将拼写出每个 STRIDE 威胁。
Paige:跨距?再提醒我。
Michael:欺骗否认、 信息泄露、 拒绝服务、 特权提升中篡改。
Michael 快速开始编写一张纸上。
Michael:查看此列表:
Paige:没有这些威胁建模工具中的所有问题吗?
Michael:是,但希望显示该工具如何到达列表中。通过在方法您不需要为 SDL 兼容,使用威胁建模工具,只要威胁模型是完整和准确。基本上,每个元素是遵循一组特定的威胁。我认为,您可以使用它出从列表中。
Paige:是,得到它,但不您缺少某些吗?所有这些数据流在各种应用程序元素之间?
Michael:yup,但是我所做的故意,因为我确实不想还--关注那些我们它们中详细讨论最后一次。
Paige:我们吗?
Michael:可以。查看威胁模型。
Paige 查找通过了 SDL 威胁建模工具
Paige:噢,看的我们讨论了使用 SSL/TLS 修复该篡改,在客户端和服务器进程右边之间流动的数据的信息泄漏威胁吗?
Michael:好!因此,这里的问题。到服务器再到服务器的文件系统--从用户移动的数据的数据是敏感吗?
Paige:您的最后一次。是,可能。
Michael:太糟糕了。
Paige:为什么?数据被加密使用 SSL TLS,因此我们正常,右吗?
Michael:完全不会。两个进程--2.0 客户端进程和 3.0 服务器进程之间传输时,SSL/TLS 降低信息泄露威胁的数据。但数据离开受保护的隧道的后,数据位于清除,并且您正在编写数据以明文鏂囦欢绯荤粺。
Paige:是,但有何风险吗?
Michael:您能告诉我!
Paige:不了解。
Michael sighs。
Michael:假设您的应用程序的客户端是一个公开交易的公司的员工。让我们来进行更具体:员工在 CFO 公开交易公司的他使用您的应用程序存储在电子表格显示了当前季度的数据,不是公共的并将不是公共直到结束时公司宣布其收益的该季度财务数据。假设黑客分成您的系统,获取数据的并使用它来出售或购买股票在公司中。这可能是内部贸易。
Paige:太糟糕了。
Michael:.-哦,确实。这是严重的。在 CFO 没有相应的控件上可能与 SOX 法规的冲突此敏感数据。
Paige:您说"可能"很多。
Michael:您当然我所做的那样。我类似律师您吗?现在回到原始问题。是这种情况下您关心的内容吗?
Paige:好,不正确。我认为我们术语状态不应使用我们的服务的 ultra-sensitive 数据。但是,将一起播放。假设我说"是,我们关心 ㄨ 繖绉嶆儏鍐典笅。"现在要做什么?
Michael:将您的律师以确保您在将不放置公司与此方案的风险,请参阅的建议我第一位。但假设他们说您可以继续为其,但您需要确保您在保护后端数据。
Paige:您正试图说是 5.0,在服务器,文件系统进行信息泄露,我们需要缓解该威胁在数据存储区中保留数据。我右吗?
Michael:您在专色。那么,如何您修复它?
Paige:ACL。
Michael:为什么访问控制列表?
Paige:我们可以限制只有有效用户数据的访问。
Michael:那么,如何执行服务器应用程序读取和写入数据?
Paige:噢,假定作为唯一的标识运行的进程。我们将调用它 FooID。我们可以将 ACL 应用于允许 FooID 以及为有效用户的文件对文件的访问。
Michael:它不会起作用 ;它并不安全。
Paige:为什么不能?
Michael:如果作为鏀诲嚮鑰呭彲我可以 FooID 作为运行由破坏服务器进程,并在该服务器上运行恶意代码。voila,我的代码以运行 FooID,而我自己的数据!
dejected Paige 的外观。
Paige:humph。
Michael:您必须使用加密。
Paige:答案是肯定的!服务器将只是读取和写入加密的 Blob,如果攻击者破坏服务器,他仍不能获得数据除非他会加密。
Paige perks 组成。
Michael:现在,有趣真正开始。我们涉及的一些加密问题上次的时间特别是与有关密钥。
Paige:含义是什么? 您
Michael:好了您如何对数据进行加密吗?
Paige:用户键入密码,客户端的应用程序和客户端应用程序中对数据使用的密码进行加密,并将加密的 Blob 通过网络发送到服务器。服务器写入 SQL Server 元数据,然后将加密的 Blob 写入到服务器文件系统。
Michael:元数据中的内容?
Paige:所有者的标识、 文件大小、 文件名、 时间写入文件系统和上次读取的时间。这种东西。我知道此信息保留在文件系统在过,但做一些用于存储此类型的数据中查找方法更快:SQL Server 数据库。
Michael:好,高兴它并不存储在文件中保存数据!
Paige:为什么会是这样?
Michael:为几个原因。第一次,它意味着您的服务器应用程序访问数据以明文,获取该数据需要您的服务器进程解密数据。
Paige:因此?
以大但不-完全-shouting 语音 Michael 响应。
Michael:因为这意味着您的服务器应用程序需要知道意味着您进入各种真正可怕的密钥管理游戏的解密密钥。如果在所有可能,要保持该业务的 !有种方法可以执行此此完全拥有多个的键,但不希望现在解释的。如果有!如果您确实想了解,请继续阅读向上 Microsoft 如何对文件使用加密文件系统,或 EFS 进行加密。
Paige:我们可以使用 EFS 吗?
Michael:可能。这取决于您的客户端。您是否在客户端支持哪些平台?
Paige:我们将在 Windows 上一年的结束,然后几个月以后的 Linux 传送。
Michael:没有 Solaris?
Paige:Solaris 的是什么?
Michael sniggers,并忽略 Paige 的答复。
Michael:您不能使用 EFS,因为它需要 Windows 帐户。因此,您必须使用不同的技术数据进行加密。可以是很棒如果可以使用 EFS,或甚至数据保护 API,称为 DPAPI,因为它同时使用相同的基本加密技术和可以无缝地加密和解密数据通过从用户的密码派生的键。噢好。让我们了解其他我们可以执行哪些操作。
Paige:我们可以使用加密库吗?
Michael:当然能。实际上,这就更好一些比我听说过其他某一天。
Paige:为什么?
Michael:有人要求我是否它是确定创建自己的加密算法。
Paige:您说的不正确吗?
Michael:当然我说过不。将您预期我说?我还很完成与 SDL 策略的冲突,他应该不甚至 contemplate 使用任何 homegrown 加密的可能性非常清楚。
Paige:因此我们怎么办呢?
Michael:因为客户端代码是 C#,您可以使用.NET System.Security.Cryptography 命名空间。单这意味着您可以将它从 Linux 的声道中可用的。试图没有它,但您可以实验。您还需要确保任何授权问题律师与聊天。
Paige:什么授权问题?
Michael:它是第三方代码。谁知道该内容许可证 says.Paige:我们将使用用户的密码数据进行加密以便中好发送 Blob...
Michael:否。非。Nyet。Nada。错。不使用用户的密码作为加密密钥 ;您可以从密码派生密钥。密码是太容易猜到。
Paige:如何一个"派生"一个密钥?
Michael 微笑。
Michael:使用派生密钥的函数。
Paige:先生。smarty。您可以更精确吗?
Michael:确保。到这类函数在.NET 中,Rfc2898DeriveBytes 一个 salt 值一起传递该密钥。一个 salt 值是只是一个使它难以执行某些攻击的唯一编号。它是一个通常中,千万如果不是数百个千位的迭代计数。该函数采用密码和 munges 它数千个带有 salt 的时间。这通常称为将密码的拉伸。在操作通常需要小于一秒的末尾得到一些字节,,可以将这些字节用作键。密钥派生不仅做出它难猜出密钥,它还使它难以装入高速密码猜测攻击,因为攻击者通过将迭代次数太转。因此如果鏀诲嚮鑰呭通常可以测试 1,000,000 秒的迭代次数为 100,000,使用的密码他的减少到每秒 10!很酷吧?
Paige:非常酷。因此我们使用该密钥加密在的数据使用,说,高级加密标准吗?
Michael:可以。当然,此功能是所有数据进行加密。它不提供任何窗体的检查完整性,但这相当容易。您可以派生出另一个键,使用的创建消息验证代码和元数据一起存储的。不要为加密和完整性检查使用相同的密钥。派生一个键,并使用它。
Adam,另一个安全专家,指导通过 muttering。
Adam:安全向导总是要转到加密的深度的第一个和类似的内容。但攻击者为弱的链接。
Michael:Adam 正确,安全人员倾向于深快速讨论。和我感到收取,为,但希望获得此方式。
Paige:确定擦除。任何其他操作?
Michael:也,还有粘滞忘记他们的密码的用户的问题。我将给的用户机会备份到一个 USB 杆或,他们的密码,并使其知道我们没有密码如果他们忘记了,还有没有方法我们可以将数据重新从该死!
Paige:我们做吗?
Michael:目前,为是。希望这样,您权衡需要构建安全的应用程序时的一些想法和它的大和重要该威胁模型的一部分。
Paige:现在,我做。谢谢。
Michael Howard* 在高级安全程序经理在 Microsoft 侧重于安全的过程改进和最佳做法。他是该 coauthor 的五个包括"编写安全代码的 Windows Vista,"的安全性书籍"安全开发生命周期"编写安全代码"和"19 Deadly Sins 软件安全"。*