假设我经营一家医疗机构,并且想要一个网站,我的用户/患者可以在其中查找他们的私人记录。针对最常见攻击的最佳解决方案是什么?
即使我使用在某处购买的私人服务器,并依赖其监控服务,也很有可能有人会发现安全漏洞并窃取我的数据。我的生意结束。
这种架构的最佳实践是什么?
假设我经营一家医疗机构,并且想要一个网站,我的用户/患者可以在其中查找他们的私人记录。针对最常见攻击的最佳解决方案是什么?
即使我使用在某处购买的私人服务器,并依赖其监控服务,也很有可能有人会发现安全漏洞并窃取我的数据。我的生意结束。
这种架构的最佳实践是什么?
首先,您需要确定要尝试和防御的攻击,然后单独解决每个攻击。既然你提到了“最常见的攻击”,我们就从那里开始;这是一个常见的三层服务(client-web-datastore)的快速列表:
一旦发生泄漏或破坏,这些是使攻击者更容易的一些问题,因此也应该解决:
现在我们来看看常见的缓解措施:
1-3 (Inputs, SQL Injection, XSS)处理了很多错误的输入。因此,需要对来自客户端的所有输入进行清理,并且需要执行(以攻击为中心的)测试以确保代码正常工作。
4(猜测)自动化工具将用于尝试猜测用户的密码,或者如果他们已经拥有数据,他们将尝试强制使用密钥或哈希。缓解措施涉及为加密或散列选择正确的算法。增加密钥的位大小。对密码/密钥复杂性执行策略。使用盐。限制每秒的尝试次数。等等
5(泄漏)如果数据是现场加密的,而管理员/员工/管理员没有解密数据的密钥,那么泄漏信息的价值是有限的(尤其是在#4处理正确的情况下)。您还可以限制访问数据的人员和方式(美国国家安全局刚刚在这里学到了宝贵的一课,并且正在制定政策以确保需要两个人在场才能访问私人数据)。正确记录和记录访问尝试也很重要。
6(社会工程)攻击者将尝试致电您的支持台,冒充客户,请求访问特权信息或让支持台更改信息(密码、个人信息等)。他们通常会将多个支持电话链接在一起,直到获得控制帐户所需的所有信息。支持人员需要接受培训,并限制他们将提供哪些信息,以及他们可以编辑哪些数据。
7(中间人)这是攻击者试图将自己注入通信流的地方,最常见的是通过使用在客户端机器上运行的rootkit或假接入点(例如wifi)。基于线路/协议的加密(如 SSL)显然是第一级保护。但是变体(例如浏览器中的人)不会得到缓解,因为它们会在 SSL 数据包被解密后看到数据。一般来说,客户端是不可信的,因为平台本身是不安全的。鼓励用户使用专用/隔离机器是一种很好的做法。限制密钥和解密数据存储在内存或其他可访问位置的时间。
8-9(CSRF 和重放)与中间人类似,这些攻击将尝试复制(例如捕获)用户的凭据和/或事务并重用它们。针对客户端来源的身份验证、限制凭据有效时的窗口、要求验证交易(通过电子邮件、电话、SMS 等单独的渠道)都有助于减少这些攻击。
正确的加密/散列/加盐可能是公司搞砸的第一件事。假设你所有的其他防守都失败了(就像你说的,他们可能会失败),这是你最后的希望。在这里投资并确保正确完成。确保使用不同的密钥(不是一个主密钥)对各个用户记录进行编码。让客户端进行加密/解密可以解决很多安全问题,因为服务器永远不知道密钥(所以没有人可以窃取它们)。另一方面,如果客户端丢失了密钥,那么他们也会丢失他们的数据。因此,必须在那里进行权衡。
投资于测试/攻击您的解决方案。实现网站/数据库的工程师通常没有能力考虑所有可能的攻击场景。
您的问题是这种架构的最佳实践是什么?
我喜欢 Microsoft 的这篇文章Security Best Practices to Protect Internet Facing Web Servers
,它有 11 次修订。尽管其中一些是特定于 Microsoft 平台的,但您可以将许多概念应用于独立于平台的解决方案。
虽然josh poley和Bala Subramanyam是很好的答案,但我要补充一点,如果您的业务的核心价值是安全,您应该:
黑客和开发人员将是您的主要资产,他们应该知道这一点。事实上,我们可以在这里列出最常见的安全做法,但应用我们的建议不会让您的系统真正安全,只是很有趣。
当安全很重要时,优秀的人才、热情和能力是您唯一的保护。
好的,我将尝试在您已经提出的内容上进行一些补充。首先,您可能想研究大型网站背后的技术;它使用的大概正是你感兴趣的东西。然而,基于 JS 的动态加密仍然存在一些弱点。话虽这么说,用 js 和 html 对记录进行动态解密并不容易,但并非不可能。因此,是的,我会说您通常在朝着正确的方向思考。
无论如何,您都必须考虑所有常见的攻击技术和防御(网站攻击、服务器攻击等),但是这个主题过于广泛,无法在一个答案中完全涵盖。不用说,其他答案已经很好地涵盖了这些内容。
至于“架构”,如果您真的很偏执,您还可以将数据库放在单独的服务器上,该服务器在一个不起眼的端口上运行数据库,并且只允许来自网络服务器的传入连接。
这就是我的想法:
所有记录都存储在我的家用计算机(离线)中,并使用我的个人密钥加密。在这台计算机中,有患者记录以及每个用户的私钥和公钥。这台计算机将新数据作为加密器上传到网络服务器。
网络服务器仅包含加密数据。
我向我的用户提供公钥。无论是使用从其他地方发送的电子邮件,还是使用普通邮件。
网络服务器解密每个请求的数据。因为用户密码是它的公钥,所以服务器上的解密只能在有活动会话时发生。
因为有非对称密钥在起作用,我什至可以在网络服务器(用户输入)上插入新的加密数据,然后将其提取到我的离线计算机上。
缺点:请求新密码需要离线计算机上传重新加密的数据,并以某种方式发送新密码。
优势:降低网络服务器安全问题的相关性。
这是最好的解决方案吗?