我有以下设置:
同时托管应用程序服务器和数据库(mysql)的EC2实例,属于安全组:让我们称之为“AppServerSG”,并分配一个弹性公共IP(AWS还为其分配一个私有IP)。
启动时需要连接到应用程序服务器数据库的各种EC2工作程序实例。这些工作者实例属于另一个安全组:我们称之为“WorkerSG”。
安全组的入站规则如下所示。
对于AppServerSG:
80 (HTTP) 0.0.0.0/0
3306 (MYSQL) WorkerSG
对于WorkerSG
80 (HTTP) AppServerSG
因此,基本上只能从外部访问应用程序服务器,并且工作人员和应用程序应该能够相互通信。
但是,当数据库主机设置为应用程序服务器的私有IP而不是公共弹性IP时,仅从工作实例连接到数据库成功。
使用应用程序服务器的公共IP从工作者实例连接到数据库的唯一方法似乎是需要更改MYSQL规则以允许AppServerSG上的所有连接(0.0.0.0/0),这是我非常的不愿出于安全问题。
将私有IP硬编码到工作者实例中也不是一个好主意,因为每次停止/重新启动应用服务器实例时,都会为其分配一个新的专用IP,然后需要手动更改数据库地址每个工作者实例都需要连接到。
我基本上想知道是否有人遇到类似的麻烦,因为这似乎不是事情的方式,所以要么我在设置中做错了,要么以某种方式解决方法。
非常感谢帮助!
修改
这种设置背后的动机是,如果我想让整个事情脱机,我可以安全地将其重新联机,而无需更改应用程序服务器和工作人员的配置。
如果我使用RDS,当再次使应用程序脱机/联机时,我将需要拍摄数据库的快照并停止它,然后基于快照创建一个新的数据库,该快照将具有不同的地址,然后让我回到更改配置的问题。
老实说,如果每次重新启动应用程序时我都要编辑配置,我宁愿在应用服务器上安装数据库并节省与RDS相关的成本。
这里的主要问题是,我不明白为什么当我使用公共弹性IP作为数据库地址时安全组似乎不适用,是在AWS端设计,还是错误在我的某个地方的配置?
答案 0 :(得分:1)
实际上,推荐的配置会让您使用RDS数据库实例,将数据库安全组设置为仅接受来自相应EC2安全组的连接。在此配置中,您可以设置数据库用户,如user@%
,并仍然只对指定的EC2安全组强制访问数据库。
通过这种方式,您可以将数据库访问控制的负担转移到AWS安全模型,而不是MySQL用户配置。当然,您仍然需要将DB用户配置为只能访问数据库中的相应资源。