在AWS生态中如何实现用户数据仅本人可访问,管理员无权查看?
用户数据完全私有(管理员不可访问)的AWS实现方案
核心思路
要实现管理员/开发者完全无法访问用户数据,核心是把数据加密的控制权完全交给用户:
- 所有敏感数据必须在客户端加密后再上传,服务端(Lambda/API Gateway)只处理密文
- 加密密钥由用户自己生成并保管,全程不经过任何AWS服务(包括Cognito、KMS)
- 权限层面绑定用户唯一标识(Cognito的
sub字段),确保服务端只能操作用户自己的数据条目
DynamoDB实现步骤
- 客户端加密数据:用户在本地用自己生成的密钥加密要存储的数据,再上传到API Gateway
- Lambda权限限制:给Lambda的IAM角色配置细粒度DynamoDB权限,仅允许操作与用户
sub匹配的条目
示例IAM策略片段:{ "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:PutItem"], "Resource": "arn:aws:dynamodb:your-region:your-account-id:table/your-table", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } } - 密钥存储建议:用户密钥可以存在客户端本地(比如浏览器IndexedDB、移动端Keychain),如果要存在Cognito,必须先在客户端加密密钥再存到用户自定义属性里(避免Cognito管理员直接查看)
S3实现步骤
- 客户端加密上传:用AWS SDK的客户端加密功能,用户生成数据密钥(DEK)加密文件,再用自己的主密钥(MK)加密DEK,最后把加密后的文件+加密DEK一起上传到S3
- S3桶权限控制:配置桶策略,仅允许用户访问自己前缀的路径(比如
s3://your-bucket/${cognito-sub}/)
示例桶策略片段:{ "Effect": "Allow", "Principal": {"AWS": "${cognito-identity-arn}"}, "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::your-bucket/${cognito-identity.amazonaws.com:sub}/*" } - 密钥注意事项:用户的主密钥(MK)绝对不能上传到AWS KMS,因为KMS管理员有权限访问托管密钥,必须由用户自己本地保管
关于Cognito密钥对的问题
Cognito生成的所有凭证(ID Token、Access Token等)都是用AWS托管的密钥签名的,账号管理员或AWS内部人员有权限访问这些签名密钥,所以不存在管理员无法获取的Cognito原生密钥对。要实现管理员不可访问数据,必须由用户自行生成并保管密钥,密钥全程不经过AWS服务端。
方案可行性说明
这个方案完全可行,但需要注意几个细节:
- 用户密钥丢失后无法恢复数据,必须在应用中明确提示用户备份密钥
- 客户端加密会增加前端开发工作量,需要处理加密/解密的逻辑实现
- 服务端仅做数据转发和权限校验,绝不触碰明文数据,确保数据只有用户本人能解密
内容的提问来源于stack exchange,提问作者HOK
相关产品推荐
相关产品推荐

