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