安全和性能是否联系在一起?
首先要考虑一个事实,性能和安全密切相关。出现这种情况的主要原因是,开发人员,无论是初级的还是资深的,在其职业生涯的某个时刻开始意识到:
- 安全性提高时,实现性能目标通常会变得有点困难(也就是说,开发人员通常需要“千方百计”来实现他们的目标)
- 提高性能时,有时会以安全为代价——比如说,放宽权限等等。
用Mark Eldridge制作的图做下说明:
希望你能通过这种图理解前面所要表达的意思。当然,这个箭头反映的是密码管理中安全性和便利性的权衡,这与SQL中的安全性和性能没有直接关系,但是两者可以进行类比。提高安全性通常意味着会把性能相关的任务变得更加困难,反之亦然。
SQL中的安全性和性能
现在,你可能想知道,SQL中,性能和安全性是如何融合在一起的?一句话,显而易见——当其中一个方面(安全性或性能)提升时,另一个则需要额外的维护措施,反之亦然。以下是数据库管理员和开发人员在考虑安全性和性能时通常会想到的一些主要措施:
如上表所示,所有的选择通常都有收益,或者利弊皆有。在这个领域,你还需要考虑另一个问题:你是否具备执行操作所需的知识?在性能领域没有必要的知识可能并不一定是坏事(学习这个领域的知识很快,如果有一天你的查询表现不佳,一两天后的结果可能会大不相同),但是,在安全领域,每件事都在改变并且会比预期更快地咬你一口:忽略了一个必要的方面或者错误地引入,我们可以向你保证,日后当数据窃贼来敲门时,你会记住你的错误(考虑权限的例子:向一个用户授予太多权限是危险的,应该只授予绝对必要的权限)。
一旦出现性能或安全问题,你如何知道怎样纠正错误?这可不像乍看起来那么简单,所以一些额外的知识会有所帮助。
性能和安全问题的后果
SQL世界中性能主要与创建、读取、更新或删除(CRUT)的执行性能相关,而安全性通常与数据库实例的整体安全性有关,但是当出现错误时,如何确定先前采取的哪些操作对数据库有害,为什么?
谢天谢地,答案相当简单——看看你最近采取的行动的后果,再看看下表。下表将问题开始前可能采取的措施与最可能的后果做了关联:
正如你所见到的,当确定导致问题的操作时,特定选项的结果应该是一个很好的起点。每个选项都有自己的好处,但每个选项也会带来一些影响,所以首先要了解需要采取的步骤,评估可用的选项,并谨慎选择。
学习自己需要做的每件事,尤其是在处理性能和安全性方面的工作,特别是你没有太多数据库领域的背景知识时,可能会非常困难:在这种情况下,首先,弄清楚正在使用什么样的数据库管理系统,然后阅读性能或安全领域的文档(或两者都读,取决于需要)。
一旦确定了性能和安全性的组合,就可以考虑使用SQL客户端:查询的性能与构建方式密切相关,SQL客户端不仅可以帮助构建出更好的SQL查询,而且好的SQL客户端通过提供一系列附加选项,比如与团队共享查询结果的选项等,从而使处理数据库实例中的数据变得轻而易举。
SQL客户端的安全与性能
如前所述,正确构建的SQL客户端包含非常广泛的职责,包括自动完成查询、根据查询的输出生成图表等。
SQL客户端不仅使调整数据库实例的性能更容易(例如,能密切关注表结构以确保数据库始终保持高性能),而且还允许执行其他操作,比如,与同事或队友分享编写的查询。就如同下面这样:
使用恰当的SQL客户端时,能够访问一些非常有价值的信息,比如有助于你密切关注数据库模式(请参见上文),帮你处理最宝贵的数据,或者自动完成查询,从而帮你提高数据库性能。
当然,数据库实例的安全性仍然由你负责:对于小型开发团队,通过数据库安全检查清单就够了。或者,看一下所选择的数据库管理系统的安全部分,因为许多与安全相关的选项都取决于所使用的是哪种数据库管理系统。
安全性和性能的良好组合能够充分保护你免受威胁,同时避免来自数据库开发人员的抱怨或客户的投诉。如果数据库和web应用程序协调一致,则应:
- 初始的(root)账号使用强密码锁
- 不向用户提供超出严格必要的权限(例如,只从数据库读取的用户应该只拥有SELECT权限等)
- 通过使用防火墙或开发人员遵循恰当的安全程序,能够抵御比如SQL注入等基本的安全威胁
- 能够在不妨碍其它操作的情况下快速完成web应用程序所需的全部查询(SQL客户端非常适合这种情况:客户端通常提供完成查询所需的毫秒级时间,因此,如果哪个查询速度慢,就从那里开始。)
- 不会降低用户体验
上面给出的建议中,如果能将哪怕一小部分作为日常工作的一部分,都有助于你在SQL中找到性能和安全性的良好结合。
当然说起来容易做起来难,但按照本文和所选数据库管理系统文档中给出的建议,一切都能变得轻而易举。别忘了,在数据库领域,事物的发展和变化日新月异,今天有用的东西明天可能就不一定有用了——为了达到精益求精,扩展两个领域的知识,并根据具体情况采用恰当的措施。
总结
希望这篇文章能帮你深入了解数据库世界及其性能和安全相关的权衡。
为了提高数据库实例的性能和安全性,请务必阅读所选数据库管理系统的文档,运行一两次通过数据泄露搜索引擎(如BreachDirectory)的查询,确保你的基础设施不会受到黑客攻击,并且防止身份盗用。
原文链接:
https://dzone.com/articles/security-vs-performance-in-the-sql-world
译者介绍
杨晓娟,51CTO社区编辑,西安电子科技大学计算机专业硕士研究生,资深研发工程师,信息系统项目管理师,拥有近20年Java开发经验。分别在NEC、甲骨文、英方从事数据存储、Oracle数据库的数据迁移以及同构/异构数据库复制等研发工作,尤其在数据库、数据编码等方面有深入钻研和了解。