あるユーザに、ある情報だけを共有

自分の組織で、あるユーザに、ある情報だけを共有したいとなった場合の方法です。

具体的には、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/
```