1

コンソールログインとAPIログインの間に認証エラーが発生する理由を誰かが明らかにできることを願っています。バケットへの完全な CRUD アクセス権を持つ特定の S3 バケットにアクセスできるクライアントがあり、コンソールを介してダウンロード、作成、削除を実行できますが、API を介してアクセスする場合、事前にキーを知っていればビューをダウンロードすることもできますバケット内のオブジェクトのキーを読み取ろうとすると、不正なエラーが発生します。

次のポリシーは、そのユーザーを単一の S3 バケットのみに分離するために、ユーザー アカウントに関連付けられています。

 {
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::*",
      "Condition": {}
    },
    {
      "Sid": "AllowRootLevelListingOfCompanyBucket",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::mybucket",
      "Condition": {
        "StringEquals": {
          "s3:prefix": "",
          "s3:delimiter": "/"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersionAcl",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
      ],
      "Resource": "arn:aws:s3:::mybucket/*",
      "Condition": {}
    }
  ]
}

以下は、無許可で失敗している API 呼び出しです。

-=-=-=-
import boto, boto.s3

s3conn = boto.s3.connection.S3Connection(aws_access_key_id=ACCESS_KEY,
                                         aws_secret_access_key=SECRET_KEY,
                                         is_secure=True,
                                         debug=0)

# This line fails with "403 Forbidden" b/c it tries to read the keys in # the bucket:
#s3bucket = s3conn.get_bucket('mybucket')

# This line does NOT try to read the keys and therefore succeeds:
s3bucket = s3conn.get_bucket('mybucket', validate=False)

# This loop fails with "403 Forbidden" on the very first iteration:
#for k in s3bucket.list():
#    print k

# This line works, but I had to use the webpage to learn the name of the # key first.
k = s3bucket.get_key('specificfilename.csv')
print k

# This line works.
print k.generate_url(expires_in=10) + '\n'
4

1 に答える 1

3

Bob Kinney が述べたように、この問題は次の条件によって引き起こされます。

  "Condition": {
    "StringEquals": {
      "s3:prefix": "",
      "s3:delimiter": "/"
    }
  }

基本的に、ListBucketアクションをその条件に一致する呼び出しに制限していますが、実行しようとすると:

s3bucket = s3conn.get_bucket('mybucket')

boto は、バケットが存在し、ユーザーがそれにアクセスできることを検証するために、接頭辞も区切り文字もなしでリスト バケット呼び出しを実行しようとします。その呼び出しは条件に一致しないため、失敗します。

以下は機能します:

s3bucket = s3conn.get_bucket('mybucket', validate=False)

この場合、boto は上記で説明した検証を単純にスキップするためです。この検証をスキップして実行すると、次のようになります。

for k in s3bucket.list():

list()実行しようとしている呼び出しが条件と一致しないため、同じ問題が発生します (プレフィックスと区切り文字はデフォルトで空です)。

IAM ポリシーを修正するには、ListBucketアクションの条件を削除するだけです。

于 2013-09-16T12:05:13.443 に答える