能否从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角色实现认证:- 给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" } ] } - 在RDS中创建支持IAM认证的数据库用户,以MySQL为例:
CREATE USER 'php-app-user' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; GRANT INSERT, SELECT ON your_database.* TO 'php-app-user'; - 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 ] );
- 给EC2实例关联的IAM角色添加权限,允许连接目标RDS实例,示例权限策略:
强制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
相关产品推荐
相关产品推荐

