You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

针对ECS Java应用:如何创建AWS安全组允许JDBC拒psql流量?

解决思路与配置步骤

首先明确:JDBC和psql(PostgreSQL客户端)默认都使用5432端口通信,仅靠AWS安全组的端口规则无法区分两者。要实现需求,需要结合安全组流量控制、容器层面限制和数据库端验证三个维度。

一、AWS安全组出站规则配置

安全组的核心作用是限制容器的出站流量范围,缩小攻击面:

  1. 定位ECS容器关联的安全组:
    • Fargate模式:查看任务定义中指定的安全组
    • EC2模式:查看承载容器的EC2实例的安全组
  2. 编辑出站规则:
    • 删除默认的全量允许规则(如0.0.0.0/0 所有端口)
    • 添加精准的出站规则:
      • 类型:自定义TCP
      • 端口范围:5432
      • 目标:填写你的外部数据库的具体IP(公网/私网IP,格式如192.168.1.100/32)
    • 保留必要的基础出站规则:比如DNS(UDP 53)、NTP(UDP 123),确保容器正常运行

二、容器层面的硬限制(关键)

要阻止在容器内安装/使用psql,需从镜像和运行权限入手:

  • 构建无psql的镜像:在Java应用的Docker镜像构建阶段,不要安装postgresql客户端包(Debian/Ubuntu的postgresql-client、CentOS的postgresql),确保镜像中无psql可执行文件。
  • 限制容器运行权限:
    • 使用非root用户运行容器
    • 禁用特权模式(privileged: false),防止攻击者提权安装工具
  • 最小化IAM角色权限:给ECS任务分配仅满足应用运行的IAM角色,禁止不必要的权限(如访问包管理仓库、S3存储的权限),避免攻击者下载安装包。

三、数据库端的客户端验证

在外部PostgreSQL数据库中,通过客户端标识区分JDBC和psql连接:

  • 编辑数据库的pg_hba.conf文件,添加规则仅允许来自ECS容器IP段、且application_name为你的Java应用指定值的连接:
    host    all             all             <ECS容器IP段>             md5     application_name=YourJavaAppName
    
  • 同时添加拒绝规则,拦截该IP段内其他application_name的连接,这样即使有人在容器内用psql连接,也会被数据库拒绝(psql默认的application_name为psql)。

内容的提问来源于stack exchange,提问作者karan mirani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:32:26