このトピックでは、Amazon Web Services (AWS) のリソースに対する読み取り専用権限を付与する ReadOnlyAccess ポリシーに基づいて、カスタムポリシーを作成する方法について説明します。
背景情報
AWS は、Amazon Simple Storage Service (Amazon S3) などのストレージサービスへの読み取り専用アクセスを許可する ReadOnlyAccess ポリシーを提供しています。ビジネスデータを分離し、データ漏洩を防ぐには、より少ないリソースに対する権限を付与するポリシーが必要です。
ソリューション
特定のデータベースまたはストレージサービスに対する読み取り権限を拒否することで、AWS の ReadOnlyAccess ポリシーに基づいてカスタムポリシーを作成できます。
付録のサンプルコードは、以下のサービスに対する読み取り権限を拒否するカスタムポリシーの例を示しています。
s3: Amazon S3
dynamodb: Amazon DynamoDB
rds: Amazon Relational Database Service
qldb: Amazon Quantum Ledger Database
cassandra: Amazon Keyspaces (for Apache Cassandra)
codecommit手順
スタックの作成
1. 管理者またはパワーユーザーとして AWS CloudFormation コンソールにログインし、リージョンを選択します。ユーザーまたはロールが AWS Identity and Access Management (IAM) に対する操作権限を持っていることを確認してください。
2. [スタック] ページで、[スタックの作成] をクリックします。
3. [スタックの作成] ページの [前提条件 - テンプレートの準備] セクションで、[テンプレートの準備完了] を選択します。[テンプレートの指定] セクションで、[テンプレートファイルをアップロード] を選択し、[ファイルを選択] をクリックして、read-only-priciple.cf.yml ファイルなどのファイルをアップロードします。
4. 右下隅にある [次へ] をクリックします。[スタックの詳細の指定] ページで、[スタック名] フィールドにわかりやすい名前を入力します。この例では、スタックの名前は AliCloudInspector です。

5. その他の手順ではデフォルト設定を使用します。最後のページで、[機能] セクションの [AWS CloudFormation が IAM リソースを作成する可能性があることを承認します] を選択し、[スタックの作成] をクリックします。

6. スタックが作成されるまで待ちます。

スタック情報の取得
AWS CloudFormation コンソールで、[スタック] ペインで作成した AliCloudInspector スタックをクリックします。詳細ページで、[出力] タブをクリックします。スタックのユーザー名、パスワード、AccessKey、SecretKey を表示できます。

スタック情報の検証
スタック情報を取得した後、以下の方法を使用して簡単なテストを実行できます。
コンソールに移動する
現在のユーザーアカウントからログオフします。
取得したユーザー名とパスワードを使用して、AWS CloudFormation コンソールに再度ログインします。コンソールにログインすると、[パスワードのリセット] ダイアログ ボックスが表示されます。
CLI に移動する
次の環境変数テンプレートの AWS_ACCESS_KEY_ID パラメーターと AWS_SECRET_ACCESS_KEY パラメーターの値を取得した AccessKey と SecretKey に置き換えます。コードを CLI にインポートします。
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