Slide 1

Slide 1 text

ここが嬉しいABAC ここが辛いよABAC AKIBA.AWS ONLINE #06 – AWS IAM 編 – #AKIBAAWS 2021/08/17 川原 征大

Slide 2

Slide 2 text

自己紹介 川原 征大 ● クラスメソッド ● AWS事業本部 コンサルティング部所属 ● 好きな AWSサービス ○ AWS Organizations ○ AWS IAM https://dev.classmethod.jp/author/kawahara-masahiro/

Slide 3

Slide 3 text

話の流れ IAMポリシーをざっくりと: 4min RBACをざっくりと: 4min ABAC: 4min AWS ABAC ポリシーの考慮点: 5min AWS ABAC 設計/運用の考慮点: 5min AWS ABAC 嬉しいのか辛いのか: 8min ABACがどのような場面で必要か AWSでABACをどうやって実装するか 思っていること書きます

Slide 4

Slide 4 text

IAMポリシーをざっくりと🐬

Slide 5

Slide 5 text

● 誰が [Principal] ● どのリソースに対して [Resource] ● どのアクションを [Action] ● (オプション) どの条件下で [Condition] ● 許可/拒否するか [Effect] を定めたもの IAMポリシー = 権限

Slide 6

Slide 6 text

IAMポリシー要素のイメージ

Slide 7

Slide 7 text

IAMポリシーの種類 (主要なもの) ● プリンシパルに付けるポリシー ➔ アイデンティティベースのポリシー (今回の話のメイン) ● リソースに付けるポリシー ➔ リソースベースのポリシー ● AWSアカウントに付けるポリシー ➔ Service Control Policy(SCP)

Slide 8

Slide 8 text

IAMポリシーの書き方(例) 引用: IAM でのポリシーとアクセス許可 - AWS Identity and Access Management (みなさん IAMポリシーどうやって書いていますか ...?) ・ビジュアルエディタ (便利らしい) ・JSON直書き ・YAML (CloudFormation) ・ほか (CDK, Terraform, …)

Slide 9

Slide 9 text

やってみよう、IAMポリシー設計

Slide 10

Slide 10 text

登場人物

Slide 11

Slide 11 text

設計してみた

Slide 12

Slide 12 text

・・・イケてない😨 ▶▶▶ [next] RBAC の話

Slide 13

Slide 13 text

RBACをざっくりと👺

Slide 14

Slide 14 text

先程のポリシー設計の問題点 ● ヒトが増えたときにどうするか ○ その都度、ヒトの権限を精査して IAMポリシーを作成する? (タイヘン) ● 共通して制限(or 追加)したい権限が出たときにどうするか ○ 人数分のIAMポリシーを編集する? (タイヘン) ➔ 解決策が RBAC

Slide 15

Slide 15 text

RBACとは ● Role Based Access Control (役割ベースのアクセス制御 ) ● プリンシパルの役割(ロール)に基づいてポリシー設計を行う

Slide 16

Slide 16 text

RBAC のイメージ

Slide 17

Slide 17 text

RBACの特徴 ● ヒトと権限(ポリシー) の間に 役割を挟む ● 権限(ポリシー) がヒトに左右されない ● IAMポリシー設計の最も基本 ● 設計/運用がシンプル、分かりやすい ○ 役割を洗い出す ○ 役割に対応するポリシーを設計する ○ 役割とユーザーを紐付ける

Slide 18

Slide 18 text

RBAC ポリシー設計Tips ● まずは『職務機能のAWS管理ポリシー』を見てみよう ○ 管理者: AdministratorAccess ○ パワーユーザー : PowerUserAccess ○ セキュリティ監査 : SecurityAudit ○ ...など ● より細かく、柔軟に制御したいときは『 カスタマー管理ポリシー』を活用 ✍ 『職務機能のAWS管理ポリシー』をベースに、不足 ( or 過剰) 権限を『カ スタマー管理ポリシー』で補おう

Slide 19

Slide 19 text

RBACが辛くなる場面?🤔

Slide 20

Slide 20 text

▲『プロジェクト/チーム』単位の役割でアクセス制御

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

RBAC辛い 😥 ▶▶▶ [next] ABACの話

Slide 23

Slide 23 text

ABAC 🔖

Slide 24

Slide 24 text

RBACの課題? ● スケールし続ける複数プロジェクト単位 で細かくアクセス制御を実現したいときに起きがち ● 「役割」が増えたときにどうするか ○ その都度、「役割」の権限を精査して IAMポリシーを作成する? (タイヘン) ➔ 解決策が ABAC

Slide 25

Slide 25 text

ABACとは ● Attribute Based Access Control (属性ベースのアクセス制御 ) ● プリンシパルの属性に基づいてポリシー設計を行う

Slide 26

Slide 26 text

ABAC のイメージ

Slide 27

Slide 27 text

▲比較

Slide 28

Slide 28 text

ABACの特徴 ● プリンシパル(+ アクセス先リソース) に属性を付与する ● 管理するポリシー数が少なくなる ● プロジェクトやチーム数の スケールに強い ○ RBACは「ヒト」に左右されない ➔ ABACは「役割」に左右されない ● きめ細かなアクセス制御を実現できる ○ 複数の属性を付与して、より柔軟 (複雑) な制御も可能

Slide 29

Slide 29 text

AWSのABAC AWSのABACは『タグ』を活用

Slide 30

Slide 30 text

AWS ABAC ポリシーの考慮点📚

Slide 31

Slide 31 text

ABACの範囲を決めよう ● まずは 範囲をしっかり定めましょう ○ どのサービス、どのリソース を制御対象とするか ○ どのタグキーをアクセス制御に用いるか ● 範囲に合わせたポリシーを設計していく

Slide 32

Slide 32 text

ABAC ポリシー設計 Tips ● Condition をフル活用します ● 主に以下情報(条件キー)を活用。それぞれの値を比較して許可 or 拒否を判断 ○ プリンシパルのタグ情報 ... aws:PrincipalTag/tag-key ○ リソースのタグ情報 … aws:ResourceTag/tag-key ✍ 初めは Condition の構文や仕様で悩みがち。サンプルポリシーを参考にしよう ● IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセス許可を定義する - AWS Identity and Access Management ● EC2インスタンスの作成や起動 /停止をタグベースの IAMポリシーで制御する例 | DevelopersIO ● リモートワークで Security Groupの変更をユーザーの所属するプロジェクトだけ許可する設定を ABACでやってみた | DevelopersIO

Slide 33

Slide 33 text

ABAC ポリシー例 引用: IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセ ス許可を定義する - AWS Identity and Access Management

Slide 34

Slide 34 text

ABAC ポリシー例 引用: IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセ ス許可を定義する - AWS Identity and Access Management

Slide 35

Slide 35 text

ABAC ポリシー例 引用: IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセ ス許可を定義する - AWS Identity and Access Management

Slide 36

Slide 36 text

ABAC ポリシー例 引用: IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセ ス許可を定義する - AWS Identity and Access Management

Slide 37

Slide 37 text

参考: Condition(特に条件キー) 周りの深堀り https://dev.classmethod.jp/articles/aws-iam-condition-key-availability/

Slide 38

Slide 38 text

AWS ABAC 設計/運用の考慮点🔍

Slide 39

Slide 39 text

属性(タグ)を「付与する人」「付与される人」 ● 付与する人(=管理者)がすべきこと ○ 開発者(IAMロール等)へのポリシー付与 (RBACでも同じ) ○ 開発者へのタグ付け ○ リソースへのタグ付け (開発者に任せるケースもある ) ● 付与される人(=開発者など) に「されてほしくないこと」 ○ 自身(もしくは他者) のポリシーを変更される (RBACでも同じ) ○ 自身(もしくは他者) のタグを変更される ○ リソースのタグを変更される

Slide 40

Slide 40 text

属性(タグ)を「付与する人」「付与される人」 ● 付与する人(=管理者)がすべきこと ○ 開発者(IAMロール等)へのポリシー付与 (RBACでも同じ) ○ 開発者へのタグ付け ○ リソースへのタグ付け (開発者に任せるケースもある ) ● 付与される人(=開発者など) に「されてほしくないこと」 ○ 自身(もしくは他者) のポリシーを変更される (RBACでも同じ) ○ 自身(もしくは他者) のタグを変更される ○ リソースの特定タグを変更される 『タグが付与されていること、タグが破壊されないこと』 を守り続ける必要がある!

Slide 41

Slide 41 text

予防的ガードレール(タグを破壊されないために) ● (必須) 開発者へのタグ編集権限を剥奪しておく ○ プリンシパル … “iam:TagRole” および “iam:UnTagRole” など ○ リソース … “ec2:CreateTags” および “ec2:DeleteTags” など ● (オプション) Organizations のタグポリシーで タグの値を強制 ○ 参考: [新機能] タグポリシー機能が Organizationsに追加されてタグの値を制御できるようになりました | DevelopersIO

Slide 42

Slide 42 text

発見的ガードレール(タグ欠落/不備を見つけるために) ● AWS Config Rule の required-tags が便利 ○ 「AWSリソースに特定タグが付いているか」検知するための AWS管理ルール ○ 自動化にも活用できる (Eventをトリガーに Lambda実行 等) https://dev.classmethod.jp/articles/config-rule-required-tags/

Slide 43

Slide 43 text

便利ツール: タグエディタ ● AWSリソースのタグ付与状況を検索するツール ● 検索結果から複数リソースへの一括タグ付与も可能 ● オンデマンドなタグ調査/整備のオトモ https://dev.classmethod.jp/articles/cleanup-with-tageditor/

Slide 44

Slide 44 text

まとめ ✍

Slide 45

Slide 45 text

まとめ ● Attribute Based Access Control (属性ベースのアクセス制御 ) ● プリンシパルやリソースに属性 (タグ) を付与してアクセス制御を実現 ● プロジェクトやチームのスケールに強い ● Condition をフル活用したポリシー設計 ● 属性(タグ)の適用状況を監視し続ける必要がある

Slide 46

Slide 46 text

...で、結局AWSでABACは 嬉しいの?辛いの?👀

Slide 47

Slide 47 text

嬉しいところ(ABACの特徴 再掲) ● プリンシパル(and アクセス先リソース) に属性を付与する ● 管理するポリシー数が少なくなる ● プロジェクトやチーム数の スケールに強い ○ RBACは「ヒト」に左右されない ➔ ABACは「役割」に左右されない ● きめ細かなアクセス制御を実現できる ○ 複数の属性を付与して、より柔軟 (複雑) な制御も...

Slide 48

Slide 48 text

辛いところ 目次 ● ポリシー設計 ○ IAM Actionの設計 ○ IAM Conditionの設計 ● タグの運用

Slide 49

Slide 49 text

ポリシー設計の辛み🌶

Slide 50

Slide 50 text

ABACポリシー設計でほぼほぼ読み込むページ AWS のサービスのアクション、リソース、および条件キー - サービス認証リファレンス

Slide 51

Slide 51 text

IAM Actionの設計 ● より一層、AWSドキュメントを読み込むことになる ○ アクション名 ○ アクションで指定するリソース (+そのARN形式) ○ アクションで指定できる条件キー ○ ...等 ● EC2系のアクション(ec2:xxx)が魔境 ● そもそも ABACが対応しているかどうか、要確認 https://dev.classmethod.jp/articles/iam-reference-map-abac-rbac/

Slide 52

Slide 52 text

ABACポリシー設計でまあまあ読み込むページ IAM JSON ポリシーの要素 : Condition - AWS Identity and Access Management AWS グローバル条件コンテキストキー - AWS Identity and Access Management

Slide 53

Slide 53 text

IAM Condition の設計 ● まずは Condition を理解するところから ○ 条件演算子(StringEquals, StringNotEquals, ...IfExists 等) ○ 条件キー(aws:PrincipalTag, aws:ResourceTag 等) ○ ポリシー変数 ○ ...など ● 意図通りの挙動にならなかったときのトラブルシューティングが難しい ● 『もし属性(タグ)が無かったときにどうなるか ...?』を考え出すと頭を抱える ○ 参考: 【AWS IAM】Condition の条件キーやポリシー変数は可用性を意識しよう!という話 | DevelopersIO

Slide 54

Slide 54 text

タグの運用の辛み🌶🌶🌶

Slide 55

Slide 55 text

タグの運用 ● 『ABACを維持する』ことの大変さ ● AWSのタグは様々な用途で使われている。 自由度が高すぎる ○ タグが編集されないためのガードレールは必ず敷きたい ○ 『属性以外のタグ』は編集可能とする制御もできるが、 Conditionが煩雑化 ○ 継続的なタグの監視が大変 ● 『どのタグをどう運用していくか』しっかりとドキュメント化することが大事

Slide 56

Slide 56 text

そもそも... ● プロジェクト単位でAWSアカウントを分けることができないか検討しよう ● AWSアカウント分割が一番簡単な「 API・リソースの分離」 ● 「特定AWSアカウントのリソースを複数プロジェクトで使用したい ...」➔ クロスアカウントアクセスできるか も ○ リソースベースのポリシーで解決できるかも ○ AWS Resource Access Manager(RAM) で解決できるかも

Slide 57

Slide 57 text

改めて まとめ ✍

Slide 58

Slide 58 text

改めて まとめ ● ABACは RBACの課題を解決する1手段 ○ プロジェクトやチーム数のスケールに強い ○ きめ細かなアクセス制御 ● でもAWS環境においては 辛いことが多い ○ ポリシー設計 ○ 属性(タグ)の運用 ● まずは AWSアカウント分離で対応できないか、検討したい!

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

参考 ● 属性ベースのアクセス制御( ABAC)とは? メリットと適切なアクセス制御モデル | okta ● AWS の ABAC とは - AWS Identity and Access Management ● IAM チュートリアル: タグに基づいて AWS リソースにアクセスするためのアクセス許可を定義する - AWS Identity and Access Management ● IAM でのポリシーとアクセス許可 - AWS Identity and Access Management ● SaaSテナント分離をAWS IAMとABACで実装する方法 | Amazon Web Services ● AWSのABAC(タグに基づいたアクセス制御 )の設計/運用のポイントを考える | DevelopersIO ● 【AWS IAM】Condition の条件キーやポリシー変数は可用性を意識しよう!という話 | DevelopersIO ● リモートワークでSecurity Groupの変更をユーザーの所属するプロジェクトだけ許可する設定を ABACでやってみた | DevelopersIO ● Configルールを使ってAWSリソースの特定タグ有無をチェックする | DevelopersIO ● 散らかったAWS環境の整理のためタグエディタを活用する | DevelopersIO ● このアクション、ABAC ないし RBAC に対応してる?難解な IAM リファレンスに立ち向かうための地図を描いてみた | DevelopersIO