跨AWS账号AssumeRole访问S3的IAM配置及Laravel适配问题
1. IAM配置的问题
当前配置存在核心遗漏,同时有可优化的安全点:
- 权限策略错误:账号A中角色的权限策略里,
s3:GetObject的Resource仅指定了桶的ARNarn:aws:s3:::my_awesome_files,但该权限需要的是桶内对象的ARN,即arn:aws:s3:::my_awesome_files/*。原配置只能让用户获取桶的元数据,无法读取具体文件,这是导致访问失败的关键原因。 - 信任实体可优化:虽然用账号B的root用户作为Principal是可行的,但从安全角度,建议限定为账号B中需要访问的特定用户/角色ARN,避免账号B内其他未授权用户也能Assume该角色。
- 其余配置(账号B用户的AssumeRole权限、信任策略的
sts:AssumeRole动作)是正确的。
2. Laravel Filesystem配置调整
默认配置使用长期访问密钥,无法直接实现AssumeRole,必须添加相关参数让Laravel自动获取临时凭证:
调整后的配置示例:
'my_awesome_files_bucket_config' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID', 'xxxx'), 'secret' => env('AWS_SECRET_ACCESS_KEY', 'xxxx'), 'region' => env('DEFAULT_REGION', 'eu-central-1'), 'bucket' => env('MY_AWESOME_FILES_BUCKET', 'xxxx'), 'role_arn' => env('AWS_ASSUME_ROLE_ARN', 'arn:aws:iam::<account_id_account_a>:role/allow-account-b-access-s3-bucket-role'), 'session_name' => env('AWS_ASSUME_ROLE_SESSION_NAME', 'laravel-s3-access'), ]
role_arn:填写账号A中创建的目标角色ARNsession_name:自定义会话名称,用于AWS审计日志区分不同访问会话
Laravel的Flysystem S3适配器会自动用账号B的密钥调用STS AssumeRole接口获取临时凭证,再用临时凭证访问目标S3桶,无需额外编写代码。
内容的提问来源于stack exchange,提问作者linx
相关产品推荐
相关产品推荐

