S3のimages.mysite.com
のようなシンプルなバケットと、バックアップなどを含む他のバケットがあります。
特定のユーザーがimages.mysite.com
バケットにアクセスして画像をアップロードできるようにします。しかし、私は彼に他のバケツを見させたくない。それらが存在することすらありません。
これを行うポリシーを作成できませんでした。制限的なことを試みるたびに、バケットのリストがブロックされます。
私はこれをしばらく試してきましたが、ついに実用的なソリューションを思いつきました。実行するアクションの種類に応じて、異なる「リソース」を使用する必要があります。また、前の回答に欠落しているアクション(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が必要です。
ユースケース:一般的な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の処理に役立つことを願っています。
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 /
このポリシーを試してください。また、ユーザーに選択したバケットのみをリストさせる方法がないことも考慮してください。すべてのバケットをリストすることも、まったくリストしないこともできます。
{
"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": {}
}
]
}
私はこの質問を「他のバケットにアクセスできず、したがって見えない1つのバケットへのアクセスを許可できますか」と解釈しています。なぜなら、アクセスが許可されなかったバケットの名前を表示することは、依然として情報漏えいに等しいからです。
そして、正しい答えはノーです。必要な権限はListAllMyBucketsです。これにより、ユーザーはすべてのバケットを表示できます。この許可を省略すると、コンソールは使用できなくなります。
他のバケットの知識がなくても、ユーザーが特定のバケットにアクセスできるようにする優れた方法があります。以下のようなグループポリシーでは、ユーザーは「バケット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上のCyberduckとs3cmdパッケージを使用してテストされました
./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
回答が確認されなかった理由について混乱していますか?
上記のソリューションから各ポリシーステートメントを分類しましょう。
このポリシーステートメント 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ストアを参照するクライアントを使用する場合、上記は非常に便利です。クライアントがバケットではなくストアに直接アクセスする場合、ルートにあるバケットのリストにアクセスする必要があります。
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 /
おそらく最も簡単な使用例:
{
"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/*"]
}
]
}
私はこの解決策を見つけました:
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
追伸バケットポリシーに注意してください
上記で十分に説明したように、コンソールにバケットを1つだけリストすることはできません。ただし、S3バケットのアクセスがIAMにアタッチされている場合、バケットへのURLが使用可能であれば、IAMはバケットに直接アクセスできます。 S3バケットのURLは次のようになります。
https://s3.console.aws.Amazon.com/s3/buckets/BucketName
BucketNameはIAMがアクセスできるバケットの名前です
s3:ListAllMyBuckets
アクションを特定のバケットに制限することはできませんが、回避策として、特定のバケットのコンソールURLを送信できます。
https://s3.console.aws.Amazon.com/s3/buckets/BUCKET_NAME/
そのためには、特定のユーザーまたはグループに次のポリシードキュメントを指定する必要があります。
{
"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
は、読み取りおよび書き込みアクセスを許可するバケットです。
関連する:
私は次のように動作するようになりました。他のバケットのリストがアクセス拒否メッセージを受信したことを意味します。しかし、パスとして設定されたバケット名で接続した場合、必要なバケットを表示できました。
{
"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/*"]
}
]
}
この接続をテストするためにCyberduckを使用していました。
このポリシーを試してください。ユーザーはバケットをリストできません。許可されたバケットへの直接リンクを使用する必要があります。
例: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"
}
バケットのコンテンツを他のユーザーから隠すために、次のものを使用します。これは、他のバケット(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"
]
}
]
}
いいえ、現在、ルートまたはその他の場所で選択的なバケットを表示するようにユーザーを制限することはできません。現在、これらの3つのオプションのみがあります。
クライアントにバケット名を明示的に使用するように依頼することにしました。
以下のソリューションは私のために働いた。特定のユーザーにアクセスを許可するポリシーが必要でした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/*"
}
]
}
私はこれで解決された同様のニーズを追加するだけです:
{
"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/*"
]
}
]
}
思いついた簡単な解決策は、ユーザーがルートディレクトリにログインするのをブロックすることです。そのため、リモートパスを目的のフォルダーに設定してログインする必要があります。
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::folder-name*",
"Condition": {}
}
]
}
これは私にとって完璧に働いた。ユーザーはファイルのリストをアップロード、ダウンロード、取得できますが、他のバケットのファイルは表示できません。
{
"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": {}
}
]
}