特定の Amazon S3 バケットにのみアクセス可能な IAM アクセスキーをつくる [AWS CloudFormation 使用]

こんにちは、広野です。

個人的に JPCYBER S3 Drive という、Amazon S3 バケットを Windows のエクスプローラで操作できるツールを使い始めまして、ファイルサーバ代わりにしています。若干レスポンスは遅いですが、Amazon S3 ユーザーにとっては想像以上に便利です。Microsoft OneDrive と同じじゃん、って言われたらそれまでなんですが。w

このツールは Windows に設定用のアプリをインストールして、アクセスしたいバケット名と IAM アクセスキーを入れれば使用開始できます。当然ですが AWS 側であらかじめ IAM ユーザーとアクセスキーを作成しないといけないので、それを AWS CloudFormation で作成しました。

今回は具体的な例になりますが、他の似たような用途で IAM アクセスキーが必要なケースにも応用できると思います。

要件

JPCYBER S3 Drive のドキュメントに、必要な IAM ユーザーの最小権限が掲載されていました。

これをベースに AWS CloudFormation テンプレートを作成します。

  • Amazon S3 バケットは作成済みとします。
  • 作成する IAM ユーザーではマネジメントコンソールへのログインはできません。(権限もパスワードもない)
  • アクセス可能な S3 バケットは指定した 1 つだけです。他へのアクセスはできません。
  • 作成されたアクセスキーは AWS Secrets Manager で参照できます。

AWS CloudFormation テンプレート

作成したい IAM ユーザー名と、アクセスしたい Amazon S3 バケット名をパラメータに入力して実行します。

AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that creates an IAM user with the grant to access the specific S3 bucket only.

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
  IamUserName:
    Type: String
    Description: The IAM user name.
    Default: S3BucketAccessOnly
    MaxLength: 100
    MinLength: 5
    AllowedPattern: ^[A-Za-z0-9_+=,.@-]+$

  S3BucketName:
    Type: String
    Description: The target S3 bucket name.
    Default: bucketname
    MaxLength: 63
    MinLength: 3
    AllowedPattern: ^(?!.*\.\.)[a-z0-9]([a-z0-9-]{1,61}[a-z0-9])?$

Resources:
# ------------------------------------------------------------#
# IAM User
# ------------------------------------------------------------#
  IamUser:
    Type: AWS::IAM::User
    Properties:
      UserName: !Ref IamUserName
      Path: /

# ------------------------------------------------------------#
# IAM User Policy
# ------------------------------------------------------------#
  IamUserPolicy:
    Type: AWS::IAM::UserPolicy
    Properties:
      UserName: !Ref IamUser
      PolicyName: !Sub ${IamUserName}-${S3BucketName}
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action: "s3:ListAllMyBuckets"
            Resource: "arn:aws:s3:::*"
          - Effect: "Allow"
            Action:
              - "s3:ListBucket"
              - "s3:ListBucketVersions"
              - "s3:GetBucketACL"
            Resource: !Sub "arn:aws:s3:::${S3BucketName}"
          - Effect: "Allow"
            Action:
              - "s3:GetObject"
              - "s3:PutObject"
              - "s3:AbortMultipartUpload"
              - "s3:DeleteObject"
              - "s3:GetObjectVersion"
              - "s3:DeleteObjectVersion"
              - "s3:GetObjectACL"
              - "s3:PutObjectACL"
            Resource: !Sub "arn:aws:s3:::${S3BucketName}/*"
    DependsOn:
      - IamUser

# ------------------------------------------------------------#
# IAM Access Key
# ------------------------------------------------------------#
  AccessKey:
    Type: AWS::IAM::AccessKey
    Properties:
      Serial: 1
      Status: Active
      UserName: !Ref IamUser
    DependsOn:
      - IamUser

# ------------------------------------------------------------#
# Secrets Manager
# ------------------------------------------------------------#
  Secret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: !Sub IamAccessKey-${IamUserName}
      Description: !Sub IAM Access Key for the IAM user ${IamUserName}
      SecretString: !Sub "{\"accessKeyId\":\"${AccessKey}\",\"secretAccessKey\":\"${AccessKey.SecretAccessKey}\"}"
    DependsOn:
      - AccessKey

結果

AWS CloudFormation テンプレートを実行すると、指定した名前の IAM ユーザーが作成され、アクセスキーが発行されます。アクセスキーの情報は、以下のように AWS Secrets Manager で参照可能です。

 

この値を使用して、無事 JPCYBER S3 Drive を使用することができました!

 

まとめ

本記事の仕様は、セキュリティ面で個人使用限定の AWS アカウントであったり、他の IAM ユーザーの権限管理をきっちりできていたりする状況でないと使いづらいと思いますが、外部ツールから AWS にアクセスさせる要件に応用できると思います。

AWS Secrets Manager にアクセスキー情報を格納することで、作成後もキー情報を参照することができます。ただしセキュリティ的にそうやって残しておくのが良いのか?というと微妙ではありますが、どこかに情報を保存して忘れたーとなるのもどうかと思いますので、これを良しとするかは判断が必要です。また、AWS Secrets Manager の料金がかかってしまうのはデメリットです。

記事では書いていませんが、Amazon S3 バケットへのアクセスログ取得とセットで使いたいですね。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもフロントエンド開発の方が好きでして、バックエンド構築を簡単にしてくれたAWSには感謝の気持ちの方が強いです。
取得資格:AWS 認定は13資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2024 Japan AWS Top Engineer 受賞
2022 - 2024 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
タイトルとURLをコピーしました