【AWS】ABAC を雑にやるハンズオン

#はじめに
クラスメソッドさんの8/17(火)リモート開催の [AKIBA.AWS ONLINE](https://dev.classmethod.jp/news/akiba-aws-210817/) で「ABAC」という言葉を初めて知りました。是非試してみたい！と思い、色々調べたりして自分なりに扱うことはできました。ということで、この記事では ABAC をやってみる一例を紹介します。

この記事は AWS 初心者が書いており、AWS を不適切なやり方、間違ったやり方で使用している可能性があります。ご指摘等がございましたら、コメント頂けると幸いです。

#ABAC とは

ABAC は「Attribute Based Access Control」の略称です。

> 属性ベースのアクセスコントロール (ABAC) は、属性に基づいてアクセス許可を定義する認証戦略です。
引用元：[AWS の ABAC とは - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)

AKIBA.AWS ONLINE の[登壇資料](https://dev.classmethod.jp/articles/akibaaws-06-iam-abac/)を見るとわかりやすいです。

#ゴール
赤チームの鈴木さんは、S3 バケット内の赤チームのオブジェクト（.txt ファイル）をダウンロードでき、青チームのオブジェクトをダウンロードできないようにします。

一方、青チームの田中さんは、青チームのオブジェクトをダウンロードでき、赤チームのオブジェクトをダウンロードできないようにします。
![絵_編集.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/f58e96bd-26a0-0f48-bfb9-abb98293fc17.jpeg)

#前提条件
- AWS アカウントを持っている。
[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)

- 作業用の IAM ユーザーを持っている。
AWSの全権限を持つ[ルートユーザー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html)の使用は非推奨です。代わりに IAM ユーザーを作成して使用しましょう。

- この記事は AWS 未経験者・初心者向けです。

#手順
1. ABAC ポリシー（ IAM ポリシー）の作成
1. IAM ユーザーの作成（鈴木さんと田中さん）
1. .txt ファイルの作成（赤チーム用と青チーム用）
1. S3 バケットの作成、オブジェクトのアップロード
1. ABAC できるかテスト 

###1. ABAC ポリシー（ IAM ポリシー）の作成
初めに、[AWS マネジメントコンソール](https://aws.amazon.com/jp/console/)にサインインします。
この記事では [東京リージョン] を選択して、進めていきます。
![WS204_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/422ea047-af84-fd7b-ed93-0d2e005c7bf3.jpeg)

上部の検索ボックスで`IAM`と検索して、サービス欄の [IAM] を選択し、[IAM コンソール](https://console.aws.amazon.com/iam/)を開きます。
![WS205_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/1bf2771d-33de-4d95-a815-ae2ccff3263b.jpeg)

左側のナビゲーションペインで、[ポリシー] を選択します。
![WS209_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/eb780c8e-00a6-a741-7786-e210bd4e60fc.jpeg)

[ポリシーを作成] を選択します。
![WS210_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/051db420-640e-bac5-2c09-c0949759ce1d.jpeg)

[JSON] タブを選択して、以下の JSON ポリシードキュメントを入力します。
エラー等がないことを確認して、[次のステップ: タグ] を選択します。
![WS211_4 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/14d29201-67a4-22b1-2043-20b7b06db5dd.jpeg)

前半部分（4～8行目）は
自分（ AWS アカウント）が持つバケットの一覧を表示すること（`s3:ListAllMyBuckets`）をを許可する（`Allow`）。

真ん中部分（9～13行目）は
全ての S3 バケット（`arn:aws:s3:::*`）に対して、オブジェクト等のバケットの中身を表示すること（`s3:ListBucket`）を許可する（`Allow`）。

後半部分（14～23行目）は
オブジェクトタグの`team`キーの値（`s3:ExistingObjectTag/team`）とリクエストを行うプリンシパルタグの`team`キーの値（`aws:PrincipalTag/team`）が完全一致（`StringEquals`）する条件で（`Condition`）、全ての S3 バケット（`arn:aws:s3:::*`）に対して、オブジェクトを取得すること（`s3:GetObject`）を許可する（`Allow`）。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/team": "${aws:PrincipalTag/team}"
                }
            }
        }
    ]
}
```

タグを追加せず、[次のステップ: 確認] を選択します。
![WS212 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/a8d9ea58-855d-6643-d91e-a3b94b0066d6.jpeg)

[名前] に`GetObjectSameTeam`と入力します。
[概要] を確認して、 [ポリシーの作成] を選択します。
![WS213 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/a2838afa-612a-0ec4-ec77-9763b0b1916b.jpeg)

IAMポリシー`GetObjectSameTeam`が作成できました。
これで、**1. ABAC ポリシー（ IAM ポリシー）の作成**は終了です。
![WS214 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/0e9b058b-2a51-0579-2737-43367fcef6aa.jpeg)

###2. IAM ユーザーの作成（鈴木さんと田中さん）

前述のとおり、[IAM コンソール](https://console.aws.amazon.com/iam/)を開きます。
左側のナビゲーションペインで、[ユーザー] を選択します。
[ユーザーを追加] を選択します。
![WS215 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/e06a2979-9588-2f2d-f2c7-1b2b5c7d7fc9.jpeg)

[ユーザー名] に`suzuki`と入力します。
[アクセスの種類] は [AWS マネジメントコンソールへのアクセス] を選択します。
[コンソールのパスワード] は [カスタムパスワード] を選択して、任意のパスワードを入力します。
[パスワードのリセットが必要] は選択しません。（チェックボックスをはずします）
![WS216 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/ecf8ebb6-7d9e-b377-3a7b-9296946bdbfb.jpeg)

[既存のポリシーを直接アタッチ] を選択します。
真ん中の検索ボックスで`GetObjectSameTeam`と検索して、先ほど作成した IAM ポリシー`GetObjectSameTeam`を選択します。
[次のステップ: タグ] を選択します。
![WS219 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/0c9e2d4c-50bb-b1cd-3530-7aa04eb86bdc.jpeg)

[キー] に`team`、[値 (オプション)] に`red`と入力します。
[次のステップ: 確認] を選択します。
![WS220 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/9a18cb9f-a2b2-4e82-e218-5a3e9084e553.jpeg)

作成する IAM ユーザーの選択内容を確認して、[ユーザーの作成] を選択します。
![WS221 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/202484b6-f5df-496a-03c1-3e68107ca49e.jpeg)

IAMユーザー`suzuki`の作成が成功したことを確認して、右下の [閉じる] を選択します。
![WS222 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/32cebe83-3cbc-25e2-65e4-1a4760252995.jpeg)

同様に IAMユーザー`tanaka`を作成します。
[タグの追加(オプション)] では、[キー] に`team`、[値 (オプション)] に`blue`と入力します。

IAMユーザー`suzuki`と`tanaka`が作成できました。
これで、**2. IAM ユーザーの作成（鈴木さんと田中さん）**は終了です。
![WS223 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/e1ce01a0-5020-2dba-3c82-fe3af94a87fe.jpeg)

###3. .txt ファイルの作成（赤チーム用と青チーム用）

この記事では、Microsoft Windows に付属するテキストエディタ「メモ帳」を使用して、`red-team.txt`と`blue-team.txt`を作成します。

これで、**3. .txt ファイルの作成（赤チーム用と青チーム用）**は終了です。
![WS225 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/8e11128b-95e3-de38-6025-45c554c7642c.jpeg)

###4. S3 バケットの作成、オブジェクトのアップロード
前述のとおり、上部の検索ボックスで`S3`と検索して、[S3 コンソール](https://console.aws.amazon.com/s3/)を開きます。
[バケットを作成する] を選択します。
![WS226 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/2d23ee92-d42e-7601-1310-9e60a04ed8f2.jpeg)

この記事では [バケット名] に`team-bucket-2`と入力します。
バケット名は一意である必要があり、世界で同じバケット名を複数作成することはできません。
`team-bucket-2`以外のバケット名で作成してください。
[AWS リージョン] は [アジアパシフィック (東京) ap-northeast-1] を選択します。
その他の設定はデフォルトのままです。
下にスクロールして、[バケットを作成する] を選択します。
![WS230 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/a726b28c-a380-28b5-2443-1cdb8c824197.jpeg)
![WS228 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/077c94e6-ca0e-5820-4fb7-f1b7099e955a.jpeg)

S3 バケット`team-bucket-2`が作成できました。
作成したバケットの名前`team-bucket-2`を選択します。
![WS231 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/1784c501-7707-b35d-de96-94bb9e9bda11.jpeg)

[アップロード] を選択します。
![WS232 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/1b762f14-301c-435b-c38a-765d73a4a71c.jpeg)

[ファイルを追加] を選択します。
先ほど作成した`red-team.txt`を選択します。
![WS233-2 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/f962cc79-5aad-f151-dfae-5273a22666ef.jpeg)

[プロパティ] を選択して、[タグの追加] を選択します。
![WS234 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/3b6b9b9b-15cf-841a-967b-f2ac1f5688ba.jpeg)

[キー] に`team`、[値 (オプション)] に`red`と入力します。
[アップロード] を選択します。
![WS235 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/97ef6f0d-2e5b-aad0-d1a5-aaa3e38430ef.jpeg)

オブジェクト`red-team.txt`のアップロードが成功したことを確認して、[閉じる] を選択します。
![WS237 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/17737af3-b5be-3527-ea64-372725160353.jpeg)

同様にオブジェクト`blue-team.txt`をアップロードします。
[タグ - オプション)] では、[キー] に`team`、[値 (オプション)] に`blue`と入力します。

オブジェクト`red-team.txt`と`blue-team.txt`がアップロードできました。
これで、**4. S3 バケットの作成、オブジェクトのアップロード**は終了です。
![WS236 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/d31a2eef-042d-5b17-b953-6b3a23115e9e.jpeg)

###5. ABAC できるかテスト 

ナビゲーションバーでアカウント名を選択します。
[サインアウト] を選択します。
![WS239 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/1149fdfa-bc69-5d78-2cca-805a8515a946.jpeg)

IAM ユーザー`suzuki`で [AWS マネジメントコンソール](https://aws.amazon.com/jp/console/)にサインインします。
前述のとおり、[S3 コンソール](https://console.aws.amazon.com/s3/)を開きます。
S3バケット`team-bucket-2`を選択します。
オブジェクト`red-team.txt`を選択します。
![WS240 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/05cfa073-09f8-c1a1-c9f3-70853955e72d.jpeg)

[ダウンロード] を選択します。
![WS241 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/b562f079-6de9-7b1a-124b-672b896378a9.jpeg)


オブジェクト`red-team.txt`がダウンロードできました！
![WS243 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/bbb68b5c-4d75-07d4-e460-e853e60718e7.jpeg)

同様にオブジェクト`blue-team.txt`をダウンロードしてみます。
「AccessDenied」と表示され、アクセス（ダウンロード）できないです。
![WS246 - コピー - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/d613bebb-bbf5-a957-2c02-15fd6c8ae18e.jpeg)

IAM ユーザー`tanaka`の場合も、ぜひお試しください。
これで、**5. ABAC できるかテスト**は終了です。

#おわりに
この記事では ABAC をやってみましたが、これからも色んな AWS サービスや機能に触れて紹介していきたいと思います。