こんにちは、広野です。
個人的に 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 バケットへのアクセスログ取得とセットで使いたいですね。
本記事が皆様のお役に立てれば幸いです。