本文描述了如何将AWS原有只读权限策略(ReadOnlyAccess)脱敏的方案。
背景
当前AWS提供的只读权限策略可以访问 S3 等存储产品的业务数据,用户为了避免业务数据的泄露,需要一个更小权限的策略来实现业务数据的隔离。
方案
基于原有AWS 管理的只读权限策略(ReadOnlyAccess),通过自定义策略拒绝数据库/存储等服务的数据读取权限。
附录中提供的策略代码拒绝覆盖的服务有:
s3
dynamodb
rds
qldb
cassandra
codecommit
使用
部署
1. 使用Admin 或者Poweruser 权限登录到AWS Cloudformation控制台,并选择任意常用的区域(region)。(请保证该用户/角色持有操作IAM 的权限)
2. 在“Stacks”页面上,点击“Create stack” 按钮。
3. 在创建页面选择“Template is ready” 以及“Upload a template file”, 并选择“read-only-priciple.cf.yml” 上传.
4. 点击“Next”, 给Stack 一个有意义的名字,比如:AliCloudInspector。
5. 保持其他设定为默认设定,点击“Next” 直到最后一个页面。在最后的“确认页面” 勾选“I acknowledge that......”,并点击“Create stack”
6. 等待stack 创建完毕
获取
1. 在AWS Cloudformation 控制台,点击刚才创建的stack,并在详情页面选择“Outputs” 标签页. 在“Outputs” 标签页下就能看到用户名、密码、AKSK 的信息。
验证
拿到相应的AKSK 以后,可以用以下方式来做一个简单的测试:
前往控制台
登出当前用户
使用上述Read-Only 用户的账号密码登录控制台(弹出重制密码的对话框说明登录成功)
前往命令行
将AKSK 替换到如下环境变量模板中, 并导入命令行环境中
export AWS_ACCESS_KEY_ID=<AK>
export AWS_SECRET_ACCESS_KEY=<SK>
export AWS_DEFAULT_REGION=<Region>
使用如下命令进行测试
aws s3 ls # 所有存储桶都应该被列出来
aws s3 cp <object> # 应该被拒绝访问
附录
read-only-user.cf.yaml
---
AWSTemplateFormatVersion: '2010-09-09'
Description: A cloudformation template to create a true read-only user and corresponding AKSK to let AliCloud team be able to access resources but no data.
Resources:
ReadOnlyUser:
Type: AWS::IAM::User
Properties:
ManagedPolicyArns:
- arn:aws:iam::aws:policy/ReadOnlyAccess
LoginProfile:
Password: !Ref AWS::StackId
PasswordResetRequired: true
DenyUnnecessaryPolicies:
Type: AWS::IAM::Policy
Properties:
PolicyName: DenyUnnecessaryPermissionsOfReadOnlyAccess
PolicyDocument:
Statement:
- Effect: Deny
Action:
- s3:GetObject*
- dynamodb:BatchGet*
- dynamodb:Get*
- dynamodb:Query
- dynamodb:Scan
- rds:Download*
- glacier:Get*
- qldb:Get*
- cassandra:Select
- codecommit:BatchGet*
- codecommit:Get*
- codecommit:GitPull
Resource: "*"
Users:
- !Ref ReadOnlyUser
CFNKeys:
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref ReadOnlyUser
Outputs:
Password:
Value: !Ref AWS::StackId
UserName:
Value: !Ref ReadOnlyUser
Description: Username of new user
AccessKey:
Value:
Ref: CFNKeys
Description: AWSAccessKeyId of new user
SecretKey:
Value:
Fn::GetAtt:
- CFNKeys
- SecretAccessKey
Description: AWSSecretKey of new user