Skip to content

Instantly share code, notes, and snippets.

@ohga
Created December 12, 2017 02:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ohga/0f211ebd99eee02184d44e642601d582 to your computer and use it in GitHub Desktop.
Save ohga/0f211ebd99eee02184d44e642601d582 to your computer and use it in GitHub Desktop.

※ 前提として awscli が入っていて aws configure で特権(ないしiamが作れる)ユーザが設定されていること。  

iam ユーザを作ります。

ここでは 名前を upload-teacher-data とします。

$ aws iam create-user --user-name upload-teacher-data
{
    "User": {
        "UserName": "upload-teacher-data",
        "Path": "/",
        "CreateDate": "2017-12-12T00:47:56.413Z",
        "UserId": "xxxxxxxxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::999999999999:user/upload-teacher-data"
    }
}
$ 

ポリシーを書きます。  

policy.json というファイル名で、以下を書きます。
ここでは、S3の権限PutObject を、バケット名 test-bucket-* の中の /lean-*/*" にマッチするものに付与します。(いちおう、明示的に他の権限は剥奪しておきます。)

注意点として、Resourceで指定しているバケットは利用者で一意でないと駄目なので先に作っておく方がいいです。(ここで指定した値が自分のものになるとは限らないので。。)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket-*/lean-*/*"
            ]
        },
        {
            "Effect": "Deny",
            "NotAction": [
                "s3:PutObject"
            ],
            "NotResource": [
                "arn:aws:s3:::test-bucket-*/lean-*/*"
            ]
        }
    ]
}

ポリシーを作成します。

名前は upload-teacher-data-policy としています。

$ aws iam create-policy --policy-name upload-teacher-data-policy --policy-document file://policy.json
{
    "Policy": {
        "PolicyName": "upload-teacher-data-policy",
        "CreateDate": "2017-12-12T00:44:15.937Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "xxxxxxxxxxxxxxxxxxxxx",
        "DefaultVersionId": "v1",
        "Path": "/",
        "Arn": "arn:aws:iam::999999999999:policy/upload-teacher-data-policy",
        "UpdateDate": "2017-12-12T00:44:15.937Z"
    }
}
$

ポリシーをユーザに適用します。

ユーザはユーザ名(upload-teacher-data) 、ポリシーはAmazonリソースネーム(arn:aws:iam::999999999999:policy/upload-teacher-data-policy) で指定します。

$ aws iam attach-user-policy --policy-arn arn:aws:iam::999999999999:policy/upload-teacher-data-policy --user-name upload-teacher-data

ユーザの鍵を取り出します。

"AccessKeyId", "SecretAccessKey" をメモっておきます。

$ aws iam create-access-key --user-name upload-teacher-data
{
    "AccessKey": {
        "UserName": "upload-teacher-data",
        "Status": "Active",
        "CreateDate": "2017-12-12T00:48:24.186Z",
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "AccessKeyId": "xxxxxxxxxxxxxxxxxxxx"
    }
}
$

挙動を確認します。

とりあえず、特権で。。

$ aws s3 mb s3://test-bucket-us-east-2-003
$ touch dummy
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean-001/dummy
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean2-001/dummy        
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean-dummy

ユーザを切り替えて確認。  

(このユーザだと特定の場所にアップロードは出来るけ何も見えない、を確認。ちゃんとアップロードできたかは、ブラウザから aws console とかで確認すること)

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ 
$ dd if=/dev/zero of=gomi.bin bs=1M count=300  
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/lean-001/
upload: ./gomi.bin to s3://test-bucket-us-east-2-003/lean-001/gomi.bin
$ 
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/
upload failed: ./gomi.bin to s3://test-bucket-us-east-2-003/gomi.bin An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
$
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/lean2-001/
upload failed: ./gomi.bin to s3://test-bucket-us-east-2-003/lean2-001/gomi.bin An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
$
$ aws s3 ls 
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$  
$ aws s3 ls s3://test-bucket-us-east-2-003/
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$ 
$ aws s3 ls s3://test-bucket-us-east-2-003/lean-001/
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$ 

懸念点

  1. 上書きアップロードは出来てしまうので、不安ならバケットの設定でバージョニングはつけても良いかもしれない。
  2. このポリシーだとフォルダを掘り放題だけどいっか。(ワイルドカードを工夫すると良いかもしれない)
  3. 用無しになったらアクセスキーを消すとかすればいいはず。
  4. (なにかあれば追記する)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment