自分の組織で、あるユーザに、ある情報だけを共有したいとなった場合の方法です。
具体的には、s3 バケットを作成して、その中に情報を入れます。そのバケットを、IAM および s3 のポリシーにより制御します。
新しいユーザーを新しいグループに所属させ、そのグループに、新しいロールをアタッチします。
1 管理者権限ユーザで IAM を開きます。
IAM グループを作成します。
(一例)
custom-group
2 管理者権限ユーザで IAM を開きます。
以下の内容でポリシーを作成します。
ポリシー名(一例)
My-read-s3-custom-bucket
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBucketList1",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<BucketName>"
},
{
"Sid": "AllowBugetGet1",
"Effect": "Allow",
"Action": [
"s3:GetBucketVersioning",
"s3:GetObject*"
],
"Resource": [
"arn:aws:s3:::<BucketName>",
"arn:aws:s3:::<BucketName>/*"
]
}
]
}
上記ポリシーを、グループに紐付けます。
3 管理者権限ユーザで s3 を開きます。
BucketName の「アクセス許可」を開きます。
以下のバケットポリシーを作成します。
なお、複数のユーザーを追加する場合は、配列にします。
ユーザーグループは有効な Principal ではないため。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CustomBucketPolicy1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACCOUNT_ID>:user/user1"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BucketName>/*"
}
]
}
ユーザーを作成します。
ユーザを追加します。
(一例)
user1, user2(user2 を追加するために、上記バケットポリシーを修正してみてください)。
ユーザーに、以下のリンクを教えます。
ユーザーは s3 全体をリストできないので、リンクを教えておく必要があるためです。
https://s3.console.aws.amazon.com/s3/buckets/<BucketName>
端的に言えば、上記リンクを LMS ログイン後のページに書いてリンクさせます。
ここまででも、十分だとは思いますが、バケットの閲覧に、MFA を必須にしてみます。
user1 は、custom-group に所属しており、custom-group は、ある特定のバケットのみの閲覧ができるのみで、他はなにもできません。
ここで、MFA の設定のみが可能なようにしてあげましょう。
4 管理者権限ユーザで IAM を開きます。
以下の内容でポリシーを作成します。
ポリシー名(一例)
My-enable-MFA-setting
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ListUsers"
],
"Resource": [
"arn:aws:iam::<ACCOUNT_ID>:user/"
]
},
{
"Effect": "Allow",
"Action": [
"iam:ListVirtualMFADevices"
],
"Resource": [
"arn:aws:iam::<ACCOUNT_ID>:mfa/"
]
},
{
"Effect": "Allow",
"Action": [
"iam:EnableMFADevice",
"iam:DeactivateMFADevice",
"iam:ResyncMFADevice",
"iam:ListMFADevices"
],
"Resource": [
"arn:aws:iam::<ACCOUNT_ID>:user/${aws:username}"
]
},
{
"Effect": "Allow",
"Action": [
"iam:DeleteVirtualMFADevice",
"iam:CreateVirtualMFADevice"
],
"Resource": [
"arn:aws:iam::<ACCOUNT_ID>:mfa/${aws:username}"
]
}
]
}
custom-group に、このポリシーをアタッチします。
この段階で、custom-group には、My-read-s3-custom-bucketポリシーと、My-enable-MFA-setting ポリシーがアタッチされている状態となります・
5 バケットポリシーに、MFA を使っていれば閲覧できるような条件を追加します。
現在のバケットポリシーを編集して、以下のように Condition を追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CustomBucketPolicy1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACCOUNT_ID>:user/user1"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BucketName>/*"
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
user1 で、https://s3.console.aws.amazon.com/s3/buckets/<BucketName>
を叩き、バケットの中のファイルを「開く」で開いてみると、MFA を設定していない場合はエラーとなります。
IAM に行き、ページの真ん中に「MFA 設定」のボタンがあります。
それをクリックして設定すると、バケットの中のファイルを「開く」で開いた場合に、オブジェクトの中身が確認できました。
じ後のログインからは、user1 は MFA が求められるようになります。
これで、安全に、あるユーザー(user1)に情報を提供できるようになりました。
なお、上記の手順では、このユーザーから情報を提供してもらうことはできません。
(参考)
https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html
https://dev.classmethod.jp/articles/iam-mfa-policy/
https://aws.amazon.com/jp/premiumsupport/knowledge-center/enforce-mfa-other-account-access-bucket/