はじめに
クラスメソッドさんの8/17(火)リモート開催の AKIBA.AWS ONLINE で「ABAC」という言葉を初めて知りました。是非試してみたい!と思い、色々調べたりして自分なりに扱うことはできました。ということで、この記事では ABAC をやってみる一例を紹介します。
この記事は AWS 初心者が書いており、AWS を不適切なやり方、間違ったやり方で使用している可能性があります。ご指摘等がございましたら、コメント頂けると幸いです。
ABAC とは
ABAC は「Attribute Based Access Control」の略称です。
属性ベースのアクセスコントロール (ABAC) は、属性に基づいてアクセス許可を定義する認証戦略です。
引用元:AWS の ABAC とは - AWS Identity and Access Management
AKIBA.AWS ONLINE の登壇資料を見るとわかりやすいです。
ゴール
赤チームの鈴木さんは、S3 バケット内の赤チームのオブジェクト(.txt ファイル)をダウンロードでき、青チームのオブジェクトをダウンロードできないようにします。
一方、青チームの田中さんは、青チームのオブジェクトをダウンロードでき、赤チームのオブジェクトをダウンロードできないようにします。
前提条件
-
AWS アカウントを持っている。
AWS アカウント作成の流れ -
作業用の IAM ユーザーを持っている。
AWSの全権限を持つルートユーザーの使用は非推奨です。代わりに IAM ユーザーを作成して使用しましょう。 -
この記事は AWS 未経験者・初心者向けです。
手順
- ABAC ポリシー( IAM ポリシー)の作成
- IAM ユーザーの作成(鈴木さんと田中さん)
- .txt ファイルの作成(赤チーム用と青チーム用)
- S3 バケットの作成、オブジェクトのアップロード
- ABAC できるかテスト
1. ABAC ポリシー( IAM ポリシー)の作成
初めに、AWS マネジメントコンソールにサインインします。
この記事では [東京リージョン] を選択して、進めていきます。
上部の検索ボックスでIAM
と検索して、サービス欄の [IAM] を選択し、IAM コンソールを開きます。
[JSON] タブを選択して、以下の JSON ポリシードキュメントを入力します。
エラー等がないことを確認して、[次のステップ: タグ] を選択します。
前半部分(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}"
}
}
}
]
}
[名前] にGetObjectSameTeam
と入力します。
[概要] を確認して、 [ポリシーの作成] を選択します。
IAMポリシーGetObjectSameTeam
が作成できました。
これで、1. ABAC ポリシー( IAM ポリシー)の作成は終了です。
2. IAM ユーザーの作成(鈴木さんと田中さん)
前述のとおり、IAM コンソールを開きます。
左側のナビゲーションペインで、[ユーザー] を選択します。
[ユーザーを追加] を選択します。
[ユーザー名] にsuzuki
と入力します。
[アクセスの種類] は [AWS マネジメントコンソールへのアクセス] を選択します。
[コンソールのパスワード] は [カスタムパスワード] を選択して、任意のパスワードを入力します。
[パスワードのリセットが必要] は選択しません。(チェックボックスをはずします)
[既存のポリシーを直接アタッチ] を選択します。
真ん中の検索ボックスでGetObjectSameTeam
と検索して、先ほど作成した IAM ポリシーGetObjectSameTeam
を選択します。
[次のステップ: タグ] を選択します。
[キー] にteam
、[値 (オプション)] にred
と入力します。
[次のステップ: 確認] を選択します。
作成する IAM ユーザーの選択内容を確認して、[ユーザーの作成] を選択します。
IAMユーザーsuzuki
の作成が成功したことを確認して、右下の [閉じる] を選択します。
同様に IAMユーザーtanaka
を作成します。
[タグの追加(オプション)] では、[キー] にteam
、[値 (オプション)] にblue
と入力します。
IAMユーザーsuzuki
とtanaka
が作成できました。
これで、**2. IAM ユーザーの作成(鈴木さんと田中さん)**は終了です。
3. .txt ファイルの作成(赤チーム用と青チーム用)
この記事では、Microsoft Windows に付属するテキストエディタ「メモ帳」を使用して、red-team.txt
とblue-team.txt
を作成します。
これで、**3. .txt ファイルの作成(赤チーム用と青チーム用)**は終了です。
4. S3 バケットの作成、オブジェクトのアップロード
前述のとおり、上部の検索ボックスでS3
と検索して、S3 コンソールを開きます。
[バケットを作成する] を選択します。
この記事では [バケット名] にteam-bucket-2
と入力します。
バケット名は一意である必要があり、世界で同じバケット名を複数作成することはできません。
team-bucket-2
以外のバケット名で作成してください。
[AWS リージョン] は [アジアパシフィック (東京) ap-northeast-1] を選択します。
その他の設定はデフォルトのままです。
下にスクロールして、[バケットを作成する] を選択します。
S3 バケットteam-bucket-2
が作成できました。
作成したバケットの名前team-bucket-2
を選択します。
[ファイルを追加] を選択します。
先ほど作成したred-team.txt
を選択します。
[キー] にteam
、[値 (オプション)] にred
と入力します。
[アップロード] を選択します。
オブジェクトred-team.txt
のアップロードが成功したことを確認して、[閉じる] を選択します。
同様にオブジェクトblue-team.txt
をアップロードします。
[タグ - オプション)] では、[キー] にteam
、[値 (オプション)] にblue
と入力します。
オブジェクトred-team.txt
とblue-team.txt
がアップロードできました。
これで、4. S3 バケットの作成、オブジェクトのアップロードは終了です。
5. ABAC できるかテスト
ナビゲーションバーでアカウント名を選択します。
[サインアウト] を選択します。
IAM ユーザーsuzuki
で AWS マネジメントコンソールにサインインします。
前述のとおり、S3 コンソールを開きます。
S3バケットteam-bucket-2
を選択します。
オブジェクトred-team.txt
を選択します。
オブジェクトred-team.txt
がダウンロードできました!
同様にオブジェクトblue-team.txt
をダウンロードしてみます。
「AccessDenied」と表示され、アクセス(ダウンロード)できないです。
IAM ユーザーtanaka
の場合も、ぜひお試しください。
これで、5. ABAC できるかテストは終了です。
おわりに
この記事では ABAC をやってみましたが、これからも色んな AWS サービスや機能に触れて紹介していきたいと思います。