teketeke_55の日記

技術メモとか

amazon S3 のアクセス制御をIAMポリシーで行うメモ

IAMのポリシー作成機能を使用してS3をアクセス制御する

S3だけフルアクセスできる

{
  "Statement": [
    {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "*"
    }
  ]
}

機能を絞る場合

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "*"
    }
  ]
} 

S3の特定のバケットのみフルアクセス(バケットとその中身のリストは表示される)

{
  "Statement": [
    {
      "Action": [
        "s3:ListAllMyBuckets"  #ここがないとmanagement consoleからバケット全体が見えなくなってしまう。
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::【バケット名】","arn:aws:s3:::【バケット名】/【ディレクトリ名】/*"]
    }
  ]
}

※マネジメントコンソールからはバケット自体は見えてしまう。これは仕様らしいのでFireFox Organizerなど別のツールで対応する必要がある。
https://forums.aws.amazon.com/thread.jspa?messageID=328828

S3の特定バケット特定フォルダのみフルアクセス(特定フォルダ以外は見えない)

{
 "Statement": [
   {
#マネジメントコンソールを使用しない場合やバケットの一覧を表示させたくない場合はここの "Effect"は必要ない
     "Effect": "Allow",
     "Action": "s3:ListAllMyBuckets", 
     "Resource": "arn:aws:s3:::*",
   },
   {
     "Effect": "Allow",
     "Action": [
       "s3:ListBucket",
       "s3:ListBucketVersions"
     ],
     "Resource": "arn:aws:s3:::【バケット名】",
     "Condition": {
       "StringLike": {
         "s3:prefix": "【ディレクトリ名】/*"
       }
     }
   },
   {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
   }
 ]
}

IPアドレス制御

{ 
  "Statement": [
    {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "*",
     "Condition": {
         "IpAddress":  {
             "aws:SourceIp": [”【接続元IPアドレス】”]
           }
        }
     }
   ]
}

httpsのみアクセスできるようにする

{
 "Statement": [
  {
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
    "Condition": {
       "Bool":  {
           "aws:SecureTransport": "false"
      }
    }
  }
 ]
}

組み合わせ

"Statement": [
 {
   "Effect": "Allow", 
   "Action": [
     "s3:ListBucket",
     "s3:ListBucketVersions"
   ],
   "Resource": "arn:aws:s3:::【バケット名】", ※取得するバケットを制限
   "Condition": {
     "StringLike": {
       "s3:prefix": "【ディレクトリ名】/*”
     }
   }
 },
 {
   "Effect": "Allow", #接続元IPアドレスによる制御
   "Action": "s3:*",
   "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
   "Condition": {
     "IpAddress":  {
            "aws:SourceIp": ["【接続元IP1】","【接続元IP2】"]
   }
 },
  {
    "Effect": "Deny", #https通信のみ許可
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
    "Condition": {
       "Bool":  {
           "aws:SecureTransport": "false"
      }
    }
  },
    {
    "Effect": "Deny", #ACL周りの操作と、バケットの作成、削除はさせない
    "Action": ["s3:*Acl","s3:CreateBucket","s3:DeleteBucket"],
    "Resource": "arn:aws:s3:::【バケット名】/【ディレクトリ名】/*",
  }
 ]
}

参考文献:
http://docs.amazonwebservices.com/AmazonS3/latest/dev/UsingIAMPolicies.html
http://docs.amazonwebservices.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html
http://www.techtricky.com/amazon-s3-how-to-restrict-user-access-to-specific-folder-or-bucket/