如何配置AWS EFS策略,仅允许指定Fargate任务访问?
我有一个AWS EFS文件系统,当资源策略的主体设为"AWS":"*"时,Fargate任务可以正常挂载读写,但这样会允许所有AWS实体访问,不符合安全要求。我想仅让指定的Fargate任务访问该EFS卷,于是把主体换成Fargate任务执行角色my-fargate-role的ARN,但任务挂载失败,报错如下:
Task stopped at: 3/14/2023, 18:35:47 UTC ResourceInitializationError:
failed to invoke EFS utils commands to set up EFS volumes: stderr:
b'mount.nfs4: access denied by server while mounting 127.0.0.1:/' :
unsuccessful EFS utils command execution; code: 32
当前EFS文件系统策略:
{ "Version": "2012-10-17", "Id": "my-app-efs-pol", "Statement": [ { "Sid": "my-app-efs-pol-sid", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123123123123:role/my-fargate-role" }, "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientWrite", "elasticfilesystem:ClientRootAccess", "elasticfilesystem:DescribeMountTargets" ], "Resource": "arn:aws:elasticfilesystem:us-east-1:123123123123:file-system/fs-0d12312312312312c", "Condition": { "Bool": { "aws:SecureTransport": "true", "elasticfilesystem:AccessedViaMountTarget": "true" } } } ] }
my-fargate-role附加的权限策略(另有两个SSM和任务执行相关策略,与EFS问题无关):
{ "Statement": [ { "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientRootAccess", "elasticfilesystem:ClientWrite", "elasticfilesystem:CreateFileSystem", "elasticfilesystem:CreateMountTarget", "elasticfilesystem:DescribeMountTargets" ], "Effect": "Allow", "Resource": "*" } ], "Version": "2012-10-17" }
请问如何正确配置,实现仅允许该Fargate任务访问EFS文件系统?
解决挂载方式与策略条件的冲突
报错中的挂载地址127.0.0.1:/说明Fargate使用的是EFS弹性网络接口直接挂载,而非通过EFS挂载目标。但当前策略中elasticfilesystem:AccessedViaMountTarget设为true,会直接拒绝这种挂载请求。要么移除该条件,要么配置任务通过EFS挂载目标进行挂载。修正EFS资源策略的身份匹配逻辑
Fargate任务挂载EFS时使用的是任务执行角色的临时凭证,直接指定角色ARN作为Principal可能存在匹配问题。改用aws:PrincipalArn条件精确匹配角色ARN,确保只有该角色发起的请求被允许。调整并简化EFS资源策略
移除不必要的elasticfilesystem:DescribeMountTargets权限(挂载EFS无需此权限),同时优化权限范围。调整后的策略示例:
{ "Version": "2012-10-17", "Id": "my-app-efs-pol", "Statement": [ { "Sid": "my-app-efs-pol-sid", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientWrite", "elasticfilesystem:ClientRootAccess" ], "Resource": "arn:aws:elasticfilesystem:us-east-1:123123123123:file-system/fs-0d12312312312312c", "Condition": { "StringEquals": { "aws:PrincipalArn": "arn:aws:iam::123123123123:role/my-fargate-role" } } } ] }
这里Principal用*但通过条件限制仅指定角色可访问,比直接指定角色ARN更适配临时凭证的身份匹配逻辑。
- 验证任务执行角色的信任关系
确保任务执行角色的信任策略允许ECS任务服务扮演它,否则任务无法获取有效访问凭证。信任策略需包含以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- 逐步测试安全条件
调整策略后重启Fargate任务验证挂载。如果仍失败,可暂时移除aws:SecureTransport条件(若任务未使用TLS挂载EFS),确认挂载正常后再重新添加安全限制。
内容的提问来源于stack exchange,提问作者Nstevens

