我们公司目前拥有一个面向客户的集群,用于我们的注册和客户账户pipe理,可直接访问实时数据库(一个主数据库和多个只读从属数据库)。
最近我们已经讨论过一些关于提高安全性(超越现有防火墙)的安全性。 这个想法(来自pipe理层)是生产服务器不应直接访问数据库的读取或写入,而应该从数据库服务器或连接到生产服务器的其他内部服务器运行,在那里存在一些临时队列。
所以
目前:
应用程序将新注册写入数据库应用程序从数据库读取有关客户的数据
(App -> DB)
build议:
应用程序将新注册写入临时本地caching(可能是文件系统,临时数据库,memcached等)内部networking的Cron /守护程序连接OUT到应用程序服务器并获取排队的数据库请求Cron /守护进程将新数据写入数据库或从数据库读取旧数据按照要求
Cron /守护进程将结果推回给应用程序服务器
(App <- Daemon -> DB)
作为一个开发人员(不是系统pipe理员),这对我来说似乎很可笑,但我却承认不是安全专家。 作为替代,我提出如果我们不能直接访问数据库,那么我们可以有一个中间层接受结构化请求并生成数据库查询并返回数据。 这看起来更像
(App -> Proxy -> DB)
pipe理层的回应是,这是不理想的(但至less还是有争议的)。
我认为这种说法在很多地方都演过很多次,但是我没有看到任何具体说明他们提出的架构的利弊的事情。 提出的向后代理方法是否真的更安全,值得花时间来构build呢? 如果不是的话,如果你被要求实施这样的体系结构,会用什么来支持你的观点。
他们希望减轻哪些具体的漏洞? 似乎有很多额外的开销和复杂性(这不可避免地导致这样或那样的问题)。
如果应用程序服务器仍然可以通过代理或其他中介访问数据库服务器,那么根源应用程序服务器仍然可以创build一个请求来pipe理数据库。 我只是没有看到提案中有任何特别的安全性。 也许我错过了一些东西。
安全不是一些模糊或可替代的“事物”,您可以通过模糊或复杂的方式添加。 安全是为缓解特定威胁而采取的具体措施。
生产服务器不应该是外部的。 典型的模式是三区模式,外部,DMZ(非军事区)和内部。 外部永远不能访问内部。 但是,Productions服务器应该在DMZ中。 DMZ服务器应该限制访问内部networking。 从DMZ访问应该是一个最小的特权基础。
对于这种types的应用程序,我将提供访问内部networking上的服务,从而采取必要的行动。 这些应该是可以一次更新一个客户数据的有限的一组操作。
如果有人破解了生产Web服务器,那么来自DMZ的通用访问可能会危及您的数据。