web-dev-qa-db-ja.com

1つのバケットのみを表示/アクセスするようにアクセスを制限するS3ポリシーはありますか?

S3のimages.mysite.comのようなシンプルなバケットと、バックアップなどを含む他のバケットがあります。

特定のユーザーがimages.mysite.comバケットにアクセスして画像をアップロードできるようにします。しかし、私は彼に他のバケツを見させたくない。それらが存在することすらありません。

これを行うポリシーを作成できませんでした。制限的なことを試みるたびに、バケットのリストがブロックされます。

111
Alex

私はこれをしばらく試してきましたが、ついに実用的なソリューションを思いつきました。実行するアクションの種類に応じて、異なる「リソース」を使用する必要があります。また、前の回答に欠落しているアクション(DeleteObjectなど)を含め、さらにいくつかのアクション(PutBucketAclなど)を制限しました。

現在、次のIAMポリシーが機能しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::itnighq",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::itnighq/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

バケットに関するアクションとオブジェクトに関するアクションには、異なるarnが必要です。

117
rogercampos

ユースケース:一般的なS3ツールを使用してクライアントが直接アクセスできるクラウドアプリケーションのクライアントにバックアップスペースを提供します。もちろん、クライアントは他のクライアントが持っているものを見るべきではありません。

Cloudberrymanが説明したように、「すべてのバケットを一覧表示することも、まったく表示しないこともできます。」ので、回避策を考え出す必要があります。バックグラウンド:

AWS S3コンソールまたはS3Foxがエラーメッセージなしで接続するには、ユーザーにListAllMyBuckets権限を付与する必要があります。ただし、ListAllMyBucketsは、割り当てられたリソースに関係なく、すべてのバケットをリストします(実際には、arn:... ::: *のみが機能します)。あなたが私に尋ねると、それは深刻なバグです。ところでListBucketはバケットのコンテンツをリストする権限を付与するため、すべてのバケットのListBucketを拒否してもリストに表示されるのを防ぐことはできません。

回避策として考えた3つの可能性があります。最後のものを選びました。

(1)暗号化されたバケット名を使用します。 GUID

利点:セットアップが簡単

欠点:特にクライアントにとって管理が難しい。 (他の何千もの特定のGUIDを見つけることを想像してください。)また、バケットの数=バックアップサービスを使用しているクライアントの数のショー。

(2)クライアント固有のフォルダーで1つのバケットを使用する

これは、特定のユーザーまたはユーザーグループのみがアクセスできるスペースを提供するためにAmazonがS3/IAMの例で提案している方法です。参照: AWS IAMポリシーの例

利点:セットアップがかなり簡単で、AWSのアイデアに適合

欠点:すべてのバケットの存在を強制的に公開するため、クライアントは「ホーム」バケットを見つけることができます。 AWSアカウンティングでは、バケット使用量の統計情報が提供されますが、フォルダー使用量の統計情報は提供されないため、クライアントによるコストの計算が困難になります。

(3)ListAllMyBucketsのアクセス権を付与しない

利点:あなたが欲しいものを手に入れます:クライアントは他のクライアントのバケットを見ることができません

欠点:クライアントは自分のバケットを見ることができません。 S3Browserには、「できません」という素敵なメッセージが付属しており、入力するバケット名を要求します。 S3Foxはルートに接続するときにエラーメッセージをスローしますが、バケット名がわかっている場合はクライアントのバケットに直接移動できます。 Amazon S3コンソールはまったく機能しません。

これが、必要に応じてS3 IAMの処理に役立つことを願っています。

31

ListAllMyBucketsパーミッションを付与せずにS3コンソールへのアクセスを提供することはできません。

私の場合(そしておそらくあなたも、将来の読者)、受け入れ可能な代替手段は、サインイン時にユーザーに直接表示したいバケットにリダイレクトすることです。

これを実現するには、IAMサインインURLに以下を追加します:/s3/?bucket=bucket-name

完全なサインインURL(your-aliasおよびbucket-nameを置き換えます) ):

https://your-alias.signin.aws.Amazon.com/console/s3/?bucket=bucket-name

IAMポリシー(replacebucket-name):

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

ユーザーにバケット固有のアクセス許可を作成する方法の詳細については、次のブログを参照してください: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using -Amazon-iam /

24
BFar

このポリシーを試してください。また、ユーザーに選択したバケットのみをリストさせる方法がないことも考慮してください。すべてのバケットをリストすることも、まったくリストしないこともできます。

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:PutBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your_bucket_here/*",
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {}
        }
    ]
}
20
cloudberryman

私はこの質問を「他のバケットにアクセスできず、したがって見えない1つのバケットへのアクセスを許可できますか」と解釈しています。なぜなら、アクセスが許可されなかったバケットの名前を表示することは、依然として情報漏えいに等しいからです。

そして、正しい答えはノーです。必要な権限はListAllMyBucketsです。これにより、ユーザーはすべてのバケットを表示できます。この許可を省略すると、コンソールは使用できなくなります。

8
user6133521

他のバケットの知識がなくても、ユーザーが特定のバケットにアクセスできるようにする優れた方法があります。以下のようなグループポリシーでは、ユーザーは「バケットa」のみを表示できます。唯一の難点は、ユーザーが特定のバケットエンドポイントに接続した場合にのみバケットにアクセスできることです。以下の例では、bucket-a.s3.amazonaws.comになります。バケットには、これを発生させるために「認証済みユーザー」を許可する必要があります。

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_SID>",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucket-a/*"
      ]
     }
   ]
}

この方法は、Mac OS/X上のCyber​​duckとs3cmdパッケージを使用してテストされました

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
6
joevartuli

回答が確認されなかった理由について混乱していますか?

上記のソリューションから各ポリシーステートメントを分類しましょう。

このポリシーステートメント from は、バケット自体には適用されませんが、バケットのコンテンツに適用されます。これはおそらくnotです。これは、バケットに何が入っているかを見ることができないため、質問が求めたものです。

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

この2つのステートメントポリシー から派生 は、(arn:aws:s3:::your_bucket_here/)でバケットへの読み取り専用アクセスを与えますreadonly、ただし、バケットのコンテンツに対してCRUD操作を許可します(arn:aws:s3:::your_bucket_here/*)。

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:ListBucketMultipartUploads"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here",
  "Condition": {}
},
{
  "Effect": "Allow",
  "Action": [
    "s3:AbortMultipartUpload",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:GetObject",
    "s3:GetObjectAcl",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionAcl",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectAclVersion"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here/*",
  "Condition": {}
}

ただし、ポリシーには以下のステートメントが含まれており、ユーザーはエンドポイントのすべてのバケットを見ることができます。これはおそらくないが質問したものです。

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

ただし、S3ストアを参照するクライアントを使用する場合、上記は非常に便利です。クライアントがバケットではなくストアに直接アクセスする場合、ルートにあるバケットのリストにアクセスする必要があります。

5
Donal Lafferty

AWS Organizationsを使用してこれを行う簡単な方法または回避策があります。 AWS組織では、複数のユーザーアカウントを持つことができます。メインアカウントには複数のAWSアカウント(サブ)があり、これらのリソースのみが表示されるAWSアカウントにサービス(s3/EC2/*)が追加されます。

参照してください https://aws.Amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/https:// aws .Amazon.com/organizations /

[アカウント]ページの組織

3
Shaik Ismail

おそらく最も簡単な使用例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::bucket-name"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::bucket-name/*"]
    }
  ]
}
3
jjanczyszyn

私はこの解決策を見つけました:
AWS FLOW:
AWS FLOW

バケットポリシー:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

IAMポリシー:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",  #Role ID
            "AIDAEXAMPLEID",  #UserID
            "111111111111"  #AccountID
          ]
        }
      }
    }
  ]
}

aws iam get-user -–user-name USER-NAME --profile = ExampleProfile

aws iam get-role --role-name ROLE-NAME --profile = ExampleProfile

ソース: https://aws.Amazon.com/blogs/security/how-to-restrict-Amazon-s3-bucket-access-to-a-specific-iam-role/

追伸バケットポリシーに注意してください

2

上記で十分に説明したように、コンソールにバケットを1つだけリストすることはできません。ただし、S3バケットのアクセスがIAMにアタッチされている場合、バケットへのURLが使用可能であれば、IAMはバケットに直接アクセスできます。 S3バケットのURLは次のようになります。

https://s3.console.aws.Amazon.com/s3/buckets/BucketName

BucketNameはIAMがアクセスできるバケットの名前です

2
Ishan Tomar

s3:ListAllMyBuckets アクションを特定のバケットに制限することはできませんが、回避策として、特定のバケットのコンソールURLを送信できます。

  • https://s3.console.aws.Amazon.com/s3/buckets/BUCKET_NAME/

ソース: S3コンソールからのS3バケットの制限リスト

そのためには、特定のユーザーまたはグループに次のポリシードキュメントを指定する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1",
                "arn:aws:s3:::my-bucket-2"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1/*",
                "arn:aws:s3:::my-bucket-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

my-bucket-1およびmy-bucket-2は、読み取りおよび書き込みアクセスを許可するバケットです。

関連する:

1
kenorb

私は次のように動作するようになりました。他のバケットのリストがアクセス拒否メッセージを受信したことを意味します。しかし、パスとして設定されたバケット名で接続した場合、必要なバケットを表示できました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::test"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test/*"]
    }
  ]
}

この接続をテストするためにCyber​​duckを使用していました。

1
codeplay

このポリシーを試してください。ユーザーはバケットをリストできません。許可されたバケットへの直接リンクを使用する必要があります。

例:s3.console.aws.Amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}
1
Lam

バケットのコンテンツを他のユーザーから隠すために、次のものを使用します。これは、他のバケット(ListAllMyBucketsを使用しないでください)だけでなく、1つのバケットを作成するときに同じバケット内のフォルダーを非表示にするだけでなく、IAMユーザー/サブフォルダーに適切なアクセス許可を割り当てるサブフォルダーが必要な場合に役立ちます。

次のポリシーがIAMグループに適用され、すべてのユーザーがこのグループに属します。 aws:useridを取得し、バケット内に同じ名前のサブフォルダーを作成する必要があります。

UserIDを取得できます:aws iam get-user --user-name "user_name_for_folder_access":

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name/${aws:userid}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name"
            ]
        }
    ]
}
0
Andrii Starikov

いいえ、現在、ルートまたはその他の場所で選択的なバケットを表示するようにユーザーを制限することはできません。現在、これらの3つのオプションのみがあります。

クライアントにバケット名を明示的に使用するように依頼することにしました。

0
foggy_glasses

以下のソリューションは私のために働いた。特定のユーザーにアクセスを許可するポリシーが必要でしたmy_iam_user特定のバケットmy-s3-bucket

このポリシーにより、ユーザーは特定のs3バケットにファイルをリスト、削除、取得することができます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket"
        },
        {
            "Sid": "AddDeleteFiles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*"
        }
    ]
}
0
Carlos Coelho
0

私はこれで解決された同様のニーズを追加するだけです:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:Put*",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }
  ]
}
0
Xavinsky

思いついた簡単な解決策は、ユーザーがルートディレクトリにログインするのをブロックすることです。そのため、リモートパスを目的のフォルダーに設定してログインする必要があります。

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}
0
THRIVE

これは私にとって完璧に働いた。ユーザーはファイルのリストをアップロード、ダウンロード、取得できますが、他のバケットのファイルは表示できません。

 {    

"Statement": [    

{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:PutBucketAcl",
        "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",
    "Condition": {}
},
{
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*",
    "Condition": {}
},
{
    "Effect": "Deny",
    "Action": [
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",    

    "Condition": {}    

}
]
}      
0
s. tait