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

能否从Secrets Manager调用RDS凭证?如何从EC2 Auto Scaling组安全访问RDS?

从EC2 Auto Scaling组安全访问RDS实例的方法

针对你的场景(Auto Scaling组管理的PHP Web服务器向RDS提交表单数据),可以通过以下几种方式实现安全访问:

  • VPC安全组隔离
    这是最基础的网络安全控制:

    • 配置RDS实例的安全组,仅允许来自EC2 Auto Scaling组对应安全组的入站流量(根据数据库类型开放对应端口,比如MySQL用3306,PostgreSQL用5432)。
    • 配置EC2实例的安全组,仅允许出站到RDS安全组的对应端口,其他出站流量按需限制。
      这样只有Auto Scaling组内的EC2实例能发起RDS连接,外部无法直接访问数据库。
  • IAM数据库身份验证
    无需硬存数据库密码,利用IAM角色实现认证:

    1. 给EC2实例关联的IAM角色添加权限,允许连接目标RDS实例,示例权限策略:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "rds-db:connect",
                  "Resource": "arn:aws:rds-db:us-east-1:1234567890:dbuser:db-ABCDEFGHIJKLMNOPQRSTUVWXYZ/php-app-user"
              }
          ]
      }
      
    2. 在RDS中创建支持IAM认证的数据库用户,以MySQL为例:
      CREATE USER 'php-app-user' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
      GRANT INSERT, SELECT ON your_database.* TO 'php-app-user';
      
    3. PHP代码中通过IAM角色生成临时认证Token连接RDS,无需硬编码密码:
      $host = 'your-rds-endpoint.rds.amazonaws.com';
      $user = 'php-app-user';
      $region = 'us-east-1';
      $dbName = 'your_database';
      $port = 3306;
      
      // 生成IAM认证Token
      $token = trim(shell_exec("aws rds generate-db-auth-token --hostname $host --port $port --username $user --region $region"));
      
      // 启用SSL连接(配合下面的SSL要求)
      $pdo = new PDO(
          "mysql:host=$host;port=$port;dbname=$dbName",
          $user,
          $token,
          [
              PDO::MYSQL_ATTR_SSL_CA => '/etc/php/rds-ca.pem',
              PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true
          ]
      );
      
  • 强制RDS SSL连接
    确保数据传输过程加密:

    • 在RDS控制台开启实例的「Require SSL」选项,强制所有连接使用SSL。
    • 在EC2实例中放置AWS官方提供的RDS根CA证书,启动模板的用户数据中可以添加下载脚本:
      wget https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem -O /etc/php/rds-ca.pem
      
    • PHP连接时指定CA证书路径,避免数据被窃听或篡改。
  • 敏感信息安全存储
    绝对不要在启动模板的用户数据中硬编码数据库密码、密钥等敏感内容:

    • 使用AWS Secrets Manager存储RDS的用户名、密码等凭证。
    • 给EC2的IAM角色添加访问该Secret的权限,启动时通过脚本拉取凭证并注入环境变量:
      # 拉取Secret并解析
      SECRET_JSON=$(aws secretsmanager get-secret-value --secret-id your-rds-secret --query SecretString --output text)
      export DB_USER=$(echo $SECRET_JSON | jq -r '.username')
      export DB_PASS=$(echo $SECRET_JSON | jq -r '.password')
      # 将环境变量写入配置文件,确保重启后生效
      echo "DB_USER=$DB_USER" >> /etc/environment
      echo "DB_PASS=$DB_PASS" >> /etc/environment
      
    • PHP代码中通过getenv('DB_USER')、getenv('DB_PASS')读取凭证,避免硬编码泄露风险。
  • 最小化IAM权限
    遵循权限最小化原则:给EC2实例的IAM角色仅分配所需权限,比如仅允许访问指定的RDS Secret、仅允许连接目标RDS实例的特定用户,避免过度授权带来的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:10:34