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