2021-09-20

许多库封装了一些外部通信。无论是类似REST的API、消息队列、数据库、邮件服务器还是其他什么。因此,你必须有一些时间-连接,阅读,写作或空转。遗憾的是,许多库的默认超时设置为“0”或“-1”,这意味着“无穷大”。

这是一个非常无用甚至有害的违约。没有一个实际的用例,您希望永远等待一个资源。在很多情况下,这种情况可能会发生,例如,另一端会卡住。在过去的3个月中,我有两个库,它们的默认超时为“无穷大”,这最终会导致生产问题,因为我们忘记了正确配置它们。有时你甚至看不到问题,直到线程池耗尽。

因此,我向API/库设计人员提出了一个请求(正如我之前所做的。永远不要将“无穷大”作为默认超时。因此,您的库将导致许多生产问题。
还请注意,有时是底层HTTP客户端(或套接字)没有合理的缺省值--在包装它时修复它仍然是您的工作。

您应该提供什么缺省值?合情合理。也许5秒?您可以(正确地)说,您不想将任意的超时强加给您的用户。在这种情况下,我有一个更好的建议:

在构建“客户端”时显式要求超时(因为这些库通常是某些外部系统的客户端)。例如:Client.create(url, credentials, timeout)。如果不提供超时,则失败。这使得客户端的用户积极考虑一下对他们的使用来说什么是好的超时--没有强加任何东西,最重要的是--而不冒在生产中陷入连接的风险。此外,您仍然可以给他们一个“默认”选项,但仍然让他们显式地选择它。例如:

1

2

3

4

5

6

7

8

9

Client client = ClientBuilder.create(url)

                   .withCredentials(credentials)

                   .withTimeouts(Timeouts.connect(1000).read(1000))

                   .build();

// OR

Client client = ClientBuilder.create(url)

                   .withCredentials(credentials)

                   .withDefaultTimeouts()

                   .build();

上面的构建器应该要求设置“超时值”,如果这两个方法都没有被调用,那么应该会失败。即使您没有提供这些选项,至少也有一种指定超时的好方法--一些库需要反射来设置其底层客户端的超时。

我相信这是那些看起来很小的问题之一,但是在现实世界中引起了很多问题。它可以(而且应该)由库/客户端设计器来解决。


https://www.lofter.com/tag/%E5%BF%83%E4%BA%8B%E4%B8%8D%E5%A6%82%E9%A5%AE%E9%A3%9F/date

但是,由于情况并不总是如此,所以我们必须确保每次使用第三方库时都会配置超时。

果您正在构建存储敏感数据的服务,您最关心的应该是如何保护它。什么是敏感数据?有一些明显的例子,如医疗数据或银行账户数据。但你会认为交友网站数据库是敏感数据吗?基于最近一家大型交友网站的泄密,我会说是的。云对数据库敏感吗?最有可能的是,因为用户旅行存储在那里。Facebook的信息、电子邮件等等--所有这些都可以而且应该被认为是敏感的。因此必须受到高度保护。如果您不确定所存储的数据是否敏感,请假设是敏感的,以防万一。或者随后的违规行为会轻易地打垮你的生意。


https://aoliji50371.lofter.com/tag/%E5%BF%83%E4%BA%8B%E4%B8%8D%E5%A6%82%E9%A5%AE%E9%A3%9F

现在,保护数据并不是微不足道的壮举。当然也不可能在一篇博客文章中报道。首先,我将概述一些良好做法:

  • 不要在其他地方转储生产数据。如果您想要一个用于测试的“副本”,请混淆数据-用假值替换真实值。
  • 确保对服务器的访问受到适当限制。这包括使为您的管理员设置适当的访问控制设置,基于密钥的SSH访问。
  • 加密你的备份--如果你的系统“完全”安全,但是你的备份不加密,它们将是你的弱点。解密密钥应尽可能受到保护(将在下面讨论)
  • 对存储进行加密--尤其是使用云提供商时,假设您不能信任它。例如,AWS是相当不错的。还有其他方法,例如使钥存储在组织的基础结构中。这一点和前一点是关.
  • 监视所有访问和审核操作--不应该对生产发出未经审核的命令。
  • 在某些情况下,您甚至可能希望使用拆分键登录到生产机器--这意味着两个管理员必须在一起才能获得访问权限。
  • 随时更新软件包和库(嗯,也许要等待几天/几周,以确保没有引入新的明显漏洞)。
  • 对服务器之间的内部通信进行加密--如果数据是“正在传输”的纯文本,那么您的数据“处于静止状态”这一事实可能并不重要。
  • 在很少的情况下,当只有用户能够看到他们的数据并且非常机密时,您可以根据他们的密码(部分)用密钥对其进行加密。密码本身并不是很好的加密密钥,但是有一些密钥派生函数(例如PBKDF 2)是为了将低熵密码转换成公平密钥而创建的。密钥可以与另一个部件组合,存储在服务器端。因此,只有用户才能解密他们的内容,因为他们的密码不能存储在任何地方的纯文本,并且不能访问,即使是在破译。

你看,有很多加密发生,但加密有一个钥匙问题-谁持有解密密钥。如果密钥存储在您的服务器上的配置文件中,访问您的基础结构的攻击者也会找到该密钥,得到它,得到整个db,然后高兴地等待它在他自己的计算机上被完全解密。

http://www.itangyuan.com/book/16245218.html

为了安全地储存钥匙,它必须放在防篡改的储藏室里.例如,HSM(硬件安全模块)。如果你没有HSM是特定的提供者并不重要--概念是重要的。然后,您需要在任何情况下都不会泄露密钥的设备上有一个安全存储的密钥,甚至是一个漏洞(HSM供应商声称情况就是这样)。

现在,如何使用这些键取决于特定情况。通常,您不会使用HSM本身对数据进行解密,而是对解密密钥进行解密,而解密密钥则用于解密数据。如果您的数据库中的所有敏感数据都是加密的,即使攻击者获得SSH访问,从而获得对数据库的访问(因为您的应用程序需要使用未加密的数据;同态加密还没有在这里),他将不得不获得内存中的解密密钥。如果你攻击者将更难直接转储数据并离开。

请注意,此处的加密和解密处于应用程序级别,因此加密的数据不仅可以是“每个存储”或“每个数据库”,还可以是每个列--用户名不必如此保密,但是相关的个人数据(在接下来的3个数据库列中)应该是这样的。因此,您可以在预持久化(和解密后加载)钩子中插入加密机制。如果速度是一个问题,即你不想做实时解密,你可能有一个(分布式)缓存的解密数据,你可以刷新一个背景作业。

但是,如果您的应用程序必须知道数据,获得无限时间完全控制的攻击者最终也将拥有完整的数据。再多的封装和层层加密也无法阻止这一点,它只会使获得转储变得越来越困难和缓慢(即使存储在HSM上的主密钥没有被提取,攻击者也会有一个接口来使用该密钥来解密数据)。怪不

众所周知,从来没有100%的安全系统。我们的工作是使大容量数据提取几乎不可能。这包括正确的密钥管理、正确的系统级和应用层加密处理以及正确的监控和入侵检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值