AWS只读权限脱敏

本文描述了如何将AWS原有只读权限策略(ReadOnlyAccess)脱敏的方案。

背景

当前AWS提供的只读权限策略可以访问 S3 等存储产品的业务数据,用户为了避免业务数据的泄露,需要一个更小权限的策略来实现业务数据的隔离。

方案

基于原有AWS 管理的只读权限策略(ReadOnlyAccess),通过自定义策略拒绝数据库/存储等服务的数据读取权限。

附录中提供的策略代码拒绝覆盖的服务有:

s3
dynamodb
rds
qldb
cassandra
codecommit

使用

部署

1. 使用Admin 或者Poweruser 权限登录到AWS Cloudformation控制台,并选择任意常用的区域(region)。(请保证该用户/角色持有操作IAM 的权限)

2. 在“Stacks”页面上,点击“Create stack” 按钮。step2

3. 在创建页面选择“Template is ready” 以及“Upload a template file”, 并选择“read-only-priciple.cf.yml” 上传. step3

4. 点击“Next”, 给Stack 一个有意义的名字,比如:AliCloudInspector。

step4

5. 保持其他设定为默认设定,点击“Next” 直到最后一个页面。在最后的“确认页面” 勾选“I acknowledge that......”,并点击“Create stack”

step5

6. 等待stack 创建完毕

step6

获取

1. 在AWS Cloudformation 控制台,点击刚才创建的stack,并在详情页面选择“Outputs” 标签页. 在“Outputs” 标签页下就能看到用户名、密码、AKSK 的信息。

step7

验证

拿到相应的AKSK 以后,可以用以下方式来做一个简单的测试:

前往控制台
  1. 登出当前用户

  2. 使用上述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