全部產品
Search
文件中心

Cloud Migration Hub:AWS唯讀許可權脫敏

更新時間:Jun 30, 2024

本文描述了如何將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