在开发人员的便携式计算机上存储关键数据库的良好安全实践是什么?


33

我们有一些建议:

  1. 开发人员需要在其机器上复制生产数据库。
  2. 开发人员在App.config文件中具有所述数据库的密码。
  3. 我们不想破坏所说数据库中的数据。

一些建议的解决方案及其缺点:

  1. 全盘加密。这样可以解决所有问题,但会降低笔记本电脑的性能,而且我们是一家初创企业,因此没有钱购买动力强劲的产品。
  2. 使用加密的硬盘创建虚拟机,并将数据库存储在该虚拟机上。它运行良好,但并没有太大帮助,因为Web.Config中有一个密码。
  3. 解决方案2 +要求开发人员在每次运行任何操作时都要键入数据库密码。它解决了所有问题,但是对于开发人员而言,有时一分钟多次启动应用程序确实很麻烦。另外,我们有多个连接到同一数据库的应用程序,并且每个密码屏幕的实现都必须有所不同。

因此,我的问题是,是否有针对此类问题的通用解决方案,或有关如何使上述解决方案可行的建议?


26
您是否实际测量了全盘加密对性能的影响?我一直在相当旧的笔记本电脑上使用它,但没有发现任何明显的性能下降。现代操作系统非常擅长缓存,而磁盘仍然很慢。影响最大的可能是电池寿命。
5gon12eder 2015年

69
老实说,这听起来不像是正确的方法。1)为什么开发人员需要在其机器上使用生产数据库?没有办法为开发数据库创建虚拟数据吗?2)为什么密码以纯文本格式存储在配置文件中?看来,您正试图在有缺陷的过程中使用创可贴。也许您可以修改开发机器上实际存储的内容以及数据库的密码存储方式。
Thomas Stringer

2
开发人员有理由需要生产数据库。由于历史原因,他们的工作与实时数据相结合。我知道这是个坏主意,如果找不到合适的解决方案,我们将转向虚拟数据。现在,我正在尝试寻找一个没有该问题的好的解决方案。
Svarog

6
MacBook Pro的任何用户都无法从计算机的速度告诉您SSD驱动器上是打开还是关闭全盘加密。没有区别 您可能没有注意到。也许您可以测量,但是没有什么是值得注意的。
gnasher729

5
我第二个@ gnasher729的评论。在受监管的环境(金融和医疗保健)中使用全磁盘加密已有很多年了,它并不一定会明显降低性能。许多人提出了其他有效的观点,但是在HIPAA环境中,即使没有将数据库放置在笔记本电脑上,也没有完整的磁盘加密就很难制定合理的策略。无论如何,电子邮件和其他数据片段经常会泛滥成灾。交换文件...等...全盘加密是不够的,但通常是必需的。
joshp

Answers:


100

您不仅不想要生产数据库的副本,而且实际上可能是非法的。例如,在美国,如果生产数据包含受管制的信息(例如个人健康数据,财务数据甚至可能用于身份盗窃的数据),则不能将其移出生产环境。如果这样做,您可能会被罚款,失去合规性,因此将受到更积极的审核,甚至被提起诉讼。

如果您需要生产规模的数据进行测试,则有两种选择:

  1. 生成所有伪数据。这比听起来要棘手。生成合理的虚构数据非常困难且费力。
  2. 匿名化您的生产数据。这可能更容易,但请谨慎行事。

对于选项2

  • 在生产环境中,授权的数据库管理员将复制生产数据。
  • 仍然在生产环境中,同一授权管理员运行一个例程,以匿名化所有敏感数据。如有疑问,请匿名。
  • 只有这样才能将数据移至另一个环境。

31
并且数据库副本的密码不应与生产版本的密码相同.....
Lightness与Monica赛跑

3
“例如,在美国,如果包含管制信息,则不能将生产数据移出生产环境。”什么?你有这个来源吗?例如,您是否可以不将生产数据库的备份用作登台环境的数据或在开发人员计算机上测试数据库?
保姆2015年

12
@nanny如果您使用的是受控数据,则不会。例如,我一直在HIPAA监管下工作。HIPAA指出:“受保护实体还必须实施合理的最低限度必要政策和程序,以限制出于某些目的使用,披露和要求使用多少受保护的健康信息。” 最低限度的政策允许一些解释。我们的法律顾问建议采用严格的解释,将敏感数据包含在开发人员无法访问的地方。(他们真的有必要做他们的工作吗?)同样的警告同样适用于PCI等财务合规。
科尔宾2015年3

4
@nanny将此作为非律师的传闻,但据我了解,规则因州而异。我一直与之合作的法律顾问总是谨慎行事。严格来说,开发人员不需要实际的 SSN来履行职责,因此律师建议这些SSN处于开发人员无法访问它们的受保护环境中。不过不要听我的话。寻找的长远利益的律师将是最好的资源。
科尔宾2015年3

5
严格来说,对PPI粗心并不是非法行为,除非您在从事政府工作,否则Title 32会起作用……但这是一个严重的民事责任敞口。不过,这是一个很好的答案。赞成。
dwoz

9

您是否至少可以为数据中心中的开发人员VM提供RD,以便他们可以完成这项工作?尽管他们确实应该处理非生产数据,但这将是更安全的,直到您到达那里为止,因为数据不会存储在容易被盗的笔记本电脑上。


这读起来更像是一条评论,请参阅“ 如何回答
gna15年

5
@gnat,这个答案可能很短,但这是一个很好的建议替代方法。

别这样学究,@ gnat ...这是一个很好的答案。
dwoz

@ dan1111就是这个问题。这不是答案。这是另一种选择。这使它成为评论,而不是答案。
corsiKa

2
@corsiKa,可以挑战问题前提的答案,通常都是非常好的答案。请参阅XY问题:meta.stackexchange.com/questions/66377/what-is-the-xy-problem。更详细的答案可能会更好,但这仍然是答案。

8

如有可能,请更改工作方式。

正如其他人指出的那样:

  • 使用生产数据进行开发不是一个好习惯。
  • 用纯文本存储密码不是一个好习惯。

这两种方法都使您面临巨大风险,应尽可能进行更改。您至少应该认真评估进行这些更改的成本。如果这是您无权更改的外部依赖项,请考虑将其作为拥有此权力的人的关注点。

但是,在现实世界中,实际上可能无法更改此设置。假设您所做的是合法的,则您可能不得不接受这种安排(至少是暂时的)。

如果确实需要这样做,则只需执行全盘加密。

鉴于风险,您需要使用最佳可用的安全选项,就是这样。如果对性能有影响,请忍受。这是处理敏感数据的成本。

如果我是您的客户,那么您决定不对我的数据使用最佳的安全选项,将不会给我留下深刻的印象,因为这会使您的笔记本电脑速度稍慢。


1
国际海事组织(IMO)
Darkhogg,Darkhogg,2015年

@Darkhogg,你是对的,它应该更强大。编辑。在不知道应用程序有多敏感的情况下,我不会走到“完全愚蠢”的地步。实际上,如果使用全盘加密,则受到损害的风险非常低,因此有可能将其过多地视为安全问题。

我同意第一点,但第二点不同意。如果您不是以明文形式存储密码,则将密码存储在(1)密文或(2)大脑中。如果为(1),那么您将密码存储在哪里(检测到无限循环)。如果为(2),则希望您喜欢在2:00 AM醒来键入密码以重新启动服务。
2015年

1

Corbin March的答案非常好,我将添加一个额外的细节,即您的生产数据库中通常有两类数据:系统/应用程序元数据;和客户端用户数据/交易数据。后者绝对不能按原样在开发环境中使用。

实际上,您需要实际的生产客户信息来进行开发的确很少见。

但是,如果OP在此描述的问题涉及商业机密数据或其他不涉及客户数据的高度专有的系统数据,那么开发人员就需要...安全方法必须涉及一种不具有数据库密码以明文形式保存在资源文件中的某个位置。例如,需要一种机制来重新生成未存储在磁盘上的每日密码。


5
client user data/transactional data... should NEVER be used in a development environment "as is." -这对我来说听起来是行不通的。在这种安排下,与特定客户数据有关的与生产相关的编程问题将无法解决。此外,从测试的角度来看,实际的实时数据非常有用。私有化或匿名化工作应仅专注于专门监管的数据。
罗伯特·哈维

@RobertHarvey,只有在开发环境中无法重现生产问题时,这才行得通。我认为在我的整个职业生涯中(很长一段时间),我可以依靠几个手指来指望经过适当消毒的测试数据不足以再现生产错误的次数。“专有业务信息”远远超出了SSN和CC编号!
dwoz

4
但是,如果您要走这条路,那么您将拥有无法执行工作的IT人员,因为他们没有对所有内容的管理权限。我承认这会导致潜在的斯诺登问题,但是除了雇用您可以信任的人之外,我看不到其他可行的选择。萨班斯·奥克斯利(Sarbanes Oxley)和HIPAA对于需要隔离什么样的数据非常明确,并且不包含“所有生产数据”,也不是一成不变的。就是说,我不认为漫游笔记本电脑上应该存在任何形式的生产数据。
罗伯特·哈维

1
永不为-1。您更细微的评论比您的答案更好;您应该对其进行编辑。

1
@ dan1111我们可以同意不同意。客户数据“永远”永远不能在开发系统中使用。应该始终对其进行消毒。您不相信这一点,因为您还没有被这种狂犬猫咬伤……这就是发生的时候。一种疯狂的疯狂啮齿动物,意在吸引您的血液。听我的建议,避免狂犬猫。
dwoz

1

您没有说明哪个数据库和哪个环境。

如果可以使用集成安全性,那么只有以该用户身份登录后才能访问该数据库。是的,如果数据位于硬盘上,则可以对其进行黑客入侵,但这是一级防御。

App.config使我认为这可能是.NET。将配置放入拇指驱动器中,然后从拇指驱动器中读取它。如果驱动器不存在,请让用户输入密码。

有没有一种方法可以在密码第一次被所有人输入和读取时将其存储在内存中。同样,您不声明环境。 内存映射文件

使用某些TDE,您可以将密钥存储在单独的设备上,以便它们仅在启动数据库服务器时提供密钥。


0

一种可能的选择是制作数据库副本,并使用脚本清理该副本,以便最终获得与实际生产中不同的数据。您最终不会获得与生产相同的数据,但是您将拥有相同的规模。


这似乎只是在重复大约一周前在最佳答案中提出并解释的观点
gna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.