Slide 1

Slide 1 text

S3のアクセス管理を シンプルに考えるためのTips コンサルティング部 茶⾕ 和弥(ちゃだいん)

Slide 2

Slide 2 text

2 アジェンダ • ⾃⼰紹介 • なぜS3のアクセス管理はややこしいのか • 概念を整理 • Tips(これがメイン)

Slide 3

Slide 3 text

3 基本これだけ︕ このセッションで覚えて帰っていただきたいこと • バケット/オブジェクトACLは、⼀旦忘れる • 原則︓最⼩権限から始めよ • クロスアカウントはIAMロールが無難 • ⼀般公開しないなら、ブロックパブリックアクセス

Slide 4

Slide 4 text

4 ⾃⼰紹介 茶⾕ 和弥 (ちゃだいん) - AWS事業本部コンサルティング部 - ロール︓ソリューションアーキテクト - 2019年1⽉ジョイン - 出⾝︓⽯川県⾦沢市 - 好きなもの︓クラフトビール

Slide 5

Slide 5 text

5 なぜS3のアクセス管理は ややこしいのか︖

Slide 6

Slide 6 text

6 なぜS3のアクセス管理はややこしいのか︖ 1. ポリシーの種類が多くて 使い分けがわからない

Slide 7

Slide 7 text

7 なぜS3のアクセス管理はややこしいのか︖ 1. ポリシーの種類が多くて使い分けがわからない • 例︓バケットの中にある特定のオブジェクトの読み取りを 制限したい。どうする︖ • 使えるもの︓ユーザーポリシー, バケットポリシー, バケットACL • 使い⽅︓1つでもOK、組み合わせてもOK • →結局どの⽅法が⼀番ベストなんだろう...

Slide 8

Slide 8 text

8 なぜS3のアクセス管理はややこしいのか︖ 2. ポリシーの優先順位が どうなるのかわからない

Slide 9

Slide 9 text

9 なぜS3のアクセス管理はややこしいのか︖ 2. ポリシーの優先順位がどうなるのかわからない • ポリシーが全くない状態だとどうなる︖ • 「無し」と「許可」では許可が勝つ︖ • 「許可」と「拒否」ではどっちが勝つ︖

Slide 10

Slide 10 text

10 概念の整理

Slide 11

Slide 11 text

11 S3アクセス管理における概念の整理 • アクセスポリシー • 誰が(Principal) • 何に対して(Resource) • 何を許可/拒否する(Action)

Slide 12

Slide 12 text

12 アクセスポリシー ユーザーポリシー • IAMユーザー・グループ・ロールに適⽤ • アクセスをユーザー単位で制御するのに◎ バケットポリシー • バケットに適⽤ • アクセスをバケット単位で制御するのに◎ ACL(バケット/オブジェクト) • バケット/オブジェクト適⽤ • アクセスをオブジェクト単位で制御するのに◎

Slide 13

Slide 13 text

13 誰が(Principal) AWSアカウント ユーザー サービス パブリック(⼀般公開)

Slide 14

Slide 14 text

14 何に対して(Resource)・何を許可する(Action) バケット オブジェクト • バケットオペレーション • バケットの作成 • バケットの削除 • バケット⼀覧の取得 etc • オブジェクトオペレーション • オブジェクトの作成 • オブジェクトの参照 • オブジェクトの更新etc

Slide 15

Slide 15 text

15 S3アクセス管理における概念の整理(再掲) • アクセスポリシー • ユーザーポリシー(ユーザー/グループ/ロール) • バケットポリシー • ACL(バケット/オブジェクト) • 誰が(Principal) • AWSアカウント • ユーザー • サービス • パブリック etc • 何に対して(Resource) • バケット • オブジェクト • 何を許可/拒否する(Action) • バケット オペレーション • オブジェクト オペレーション

Slide 16

Slide 16 text

16 権限の勝ち負け 暗黙的拒否 < 明⽰的許可 < 明⽰的拒否 デフォルトDeny < Allow < Deny 許可してない < 許可している < 拒否している

Slide 17

Slide 17 text

17 いきなり ここで問題です。

Slide 18

Slide 18 text

18 いきなり 次の場合、 どちらの権限が優先されるでしょう︖

Slide 19

Slide 19 text

19 権限の勝ち負けの問題 ユーザーポリシー • アカウント内の全バケットに 対するフルアクセスを許可す る バケットポリシー • ヤマダさんを除く⼀部のユー ザーにのみフルアクセスを許可 する ヤマダさん SampleBucket アクセスできる︖ できない︖

Slide 20

Slide 20 text

20 権限の勝ち負けの問題 ユーザーポリシー • アカウント内の全バケットに 対するフルアクセスを許可す る バケットポリシー • ヤマダさんを除く⼀部のユー ザーにのみフルアクセスを許可 する ヤマダさん SampleBucket

Slide 21

Slide 21 text

21 Tips紹介 (個⼈的な⾒解です) (わかりやすさ優先で⼀部極端な表現を使います)

Slide 22

Slide 22 text

22 Tips1 バケット/オブジェクトACLは、⼀旦忘れる

Slide 23

Slide 23 text

23 バケット/オブジェクトACLは、⼀旦忘れる 主たる理由︓ほとんどのケースが、 ユーザーポリシーとバケットポリシーで対応可能だから。 その他の理由︓ • ACLでは、制御できる範囲が限られている • ACLよりもユーザーポリシーとバケットポリシーが優先される → 存在は知っているが、現段階では⼀旦忘れてOK

Slide 24

Slide 24 text

24 Tips2 原則︓最⼩権限から始めよ

Slide 25

Slide 25 text

25 原則︓最⼩権限から始めよ S3に限らず、IAMのベストプラクティスでもある。 “最⼩限のアクセス権限から開始し、必要に応じて追加のアクセス権限を 付与します。この⽅法は、ゆるいアクセス権限で始めて後でそれらをし ぼろうとするよりも安全です。” 出来るだけ最⼩限にしぼってから始める⽅がより安全なのです。 したがって、ユーザーポリシーだけ︖バケットポリシーだけ︖ それとも両⽅が良いの︖議論については、 「できれば両⽅でしぼる。無理なら⽚⽅でしぼる。」と考えます。

Slide 26

Slide 26 text

26 次に浮かぶ疑問 では、 ユーザーポリシーとバケットポリシー、 まずはどっちを考えたら良いのだろう︖

Slide 27

Slide 27 text

27 アクセスポリシー(再掲) ユーザーポリシー • IAMユーザー・グループ・ロールに適⽤ • ユーザー単位でアクセスを制御するのに◎ バケットポリシー • バケットに適⽤ • バケット単位でアクセスを制御するのに◎ ACL(バケット/オブジェクト) • バケット/オブジェクト適⽤ • オブジェクト単位でアクセスを制御するのに◎

Slide 28

Slide 28 text

28 その疑問を解決すべく 超簡単なフローチャート 作ってみました。

Slide 29

Slide 29 text

29 質問はたった3つだけ 1. パブリックアクセスさせたい︖ 2. 複数のAWSアカウントから アクセスさせたい︖ 3. 単⼀のAWSアカウント内から アクセスさせたい︖

Slide 30

Slide 30 text

30 ポリシーを考える順番 1. パブリックアクセスさせたい︖ 2. 複数のAWSアカウントから アクセスさせたい︖ NO YES Main:バケットポリシー YES NO Main:ユーザーポリシー(IAMロール) Sub:バケットポリシー Main:ユーザーポリシー Sub:バケットポリシー 3. 単⼀のAWSアカウント内から アクセスさせたい︖ YES

Slide 31

Slide 31 text

31 ポリシーを考える順番 1. パブリックアクセスさせたい︖ Main:バケットポリシー YES 理由︓ユーザーポリシーで、パブリックアクセス を管理するのは無理だから。→必然的にバケット ポリシー⼀択。

Slide 32

Slide 32 text

32 ポリシーを考える順番 2. 複数のAWSアカウントから アクセスさせたい︖ YES Main:ユーザーポリシー(IAMロール) Sub:バケットポリシー 理由︓他のAWSアカウントからのアクセスは IAMロールが無難(詳細は次のTips)

Slide 33

Slide 33 text

33 ポリシーを考える順番 Main:ユーザーポリシー Sub:バケットポリシー 3. 単⼀のAWSアカウント内から アクセスさせたい︖ YES 理由1︓S3に限らずすべての権限は、 できるだけIAMで⼀元管理できる⽅がよい。 理由2︓S3は、デフォルトDeny。 下⼿に触るよりデフォルトが安全。 (追加・補⾜的にバケットポリシーを使⽤する)

Slide 34

Slide 34 text

34 権限の勝ち負けの問題(再掲) ユーザーポリシー • アカウント内の全バケットに 対するフルアクセスを許可す る バケットポリシー • ヤマダさんを除く⼀部のユー ザーにのみフルアクセスを許可 する ヤマダさん SampleBucket OK

Slide 35

Slide 35 text

35 権限の勝ち負けの問題(再掲) ユーザーポリシー • アカウント内の全バケットに 対する読み取りを許可する バケットポリシー • ヤマダさんを除く⼀部のユー ザーにのみフルアクセスを許可 する ヤマダさん SampleBucket OK ユーザーポリシー を修正すべき

Slide 36

Slide 36 text

36 ポリシーを考える順番 1. パブリックアクセスさせたい︖ 2. 複数のAWSアカウントから アクセスさせたい︖ NO YES Main:バケットポリシー • 理由︓ユーザーポリシーで、パブリックアクセスを管 理するのは無理だから。→必然的にバケットポリシー ⼀択。 YES NO Main:ユーザーポリシー (IAMロール) Sub:バケットポリシー • クロスアカウントアクセスはIAMロールが有⽤ (詳細は次のTipsにて解説) Main:ユーザーポリシー Sub:バケットポリシー • できるだけ権限周りは、IAMで⼀元管理する⽅がシ ンプルになるので、ユーザーポリシーでまず考える • それだと難しい場合にバケットポリシーを使う 3. 単⼀のAWSアカウント内から アクセスさせたい︖ YES

Slide 37

Slide 37 text

37 Tips3 クロスアカウントはIAMロールが無難

Slide 38

Slide 38 text

38 クロスアカウントはIAMロールが無難 クロスアカウントアクセスとは、 複数のAWSアカウントが登場すること。 クロスアカウントがややこしくなる要因はただ1つ。 ※アカウントが異なる場合、 バケット所有者とオブジェクト所有者を考慮する必要が出てくるから。 (同⼀アカウント内ではこの考慮は不要です)

Slide 39

Slide 39 text

39 バケット所有者とオブジェクト所有者 OK NG バケットとオブジェクトの所有者のAWSアカウントが異なる場合、 オブジェクト所有者がバケット所有者にオブジェクトACLで権限を与えない限り、 バケット所有者は、そのオブジェクトを触ることができない。

Slide 40

Slide 40 text

40 クロスアカウントの例 アカウントA アカウントB アカウントC アカウントAのバケットに、 アカウントBのユーザーがオブジェクトをputして、 アカウントAとアカウントCのユーザーがgetするパターン

Slide 41

Slide 41 text

41 クロスアカウントの例(IAMロール使わないver) アカウントA アカウントB アカウントC バケットポリシー ユーザーポリシー ユーザーポリシー オブジェクトACL ユーザーポリシー

Slide 42

Slide 42 text

42 クロスアカウントの例(IAMロール使わないver) 【アカウントA】 - バケットポリシー - バケットに対してアカウントB/Cのアクセスを許可する - ただし、アカウントBがオブジェクトACLのフルコントロールを許可 してないとNG - ユーザーポリシー - ユーザーに対してバケット・オブジェクトのアクセスを許可する 【アカウントB】 - ユーザーポリシー - ユーザーに対してバケット・オブジェクトのアクセスを許可する - オブジェクトACL - アカウントA/Cにオブジェクトのフルコントロールを許可する 【アカウントC】 - ユーザーポリシー - ユーザーに対してバケット・オブジェクトのアクセスを許可する

Slide 43

Slide 43 text

43 クロスアカウントの例(IAMロール使わないver) アカウントA アカウントB アカウントC バケットポリシー ユーザーポリシー ユーザーポリシー オブジェクトACL ユーザーポリシー バケット所有者と オブジェクト所有者が 違うので、 オブジェクトACLが必要に… さらにアカウントが増えた 時の対応範囲が広い… ・オブジェクトACLの修正 ・バケットポリシーの修正

Slide 44

Slide 44 text

44 クロスアカウントの例(IAMロール使うver) アカウントA アカウントB アカウントC ユーザーポリシー ユーザーポリシー ユーザーポリシー ロールポリシー (B) ロールポリシー (C)

Slide 45

Slide 45 text

45 クロスアカウントの例(IAMロール使うver) 【アカウントA】 - ユーザーポリシー - ユーザーに対してバケット・オブジェクトのアクセスを許可する - ロールポリシー(アカウントB⽤) - 対象のバケットへのアクセスを許可する - ロールポリシー(アカウントC⽤) - 対象のバケットへのアクセスを許可する 【アカウントB】 - ユーザーポリシー - アカウントAのロール使⽤を許可する 【アカウントC】 - ユーザーポリシー - アカウントAのロール使⽤を許可する

Slide 46

Slide 46 text

46 クロスアカウントの例(IAMロール使うver) アカウントA アカウントB アカウントC ユーザーポリシー ユーザーポリシー ユーザーポリシー ロールポリシー (B) ロールポリシー (C) バケット所有者=オブジェ クト所有者なので、オブ ジェクトACLが不要 アカウント追加時も アカウントAで 集中管理が可能

Slide 47

Slide 47 text

47 クロスアカウントの例(IAMロール使うver) アカウントA アカウントB アカウントC ユーザーポリシー ユーザーポリシー ユーザーポリシー ロールポリシー (B) ロールポリシー (C) 1.オブジェクト所有者を意識しないで済む⽅が シンプルでわかりやすい 2.別アカウントのことは、 全てロールに払い出す⽅が管理しやすい

Slide 48

Slide 48 text

48 Tips4 ⼀般公開しないなら、 ブロックパブリックアクセス

Slide 49

Slide 49 text

49 ⼀般公開しないなら、ブロックパブリックアクセス What is ブロックパブリックアクセス ? • Re:invent2018発表の新機能 • ポリシー全無視でパブリックアクセスをブロックする最強 なやつ • いわば「安全装置」 → パブリックに公開する予定のないバケットは とりあえず有効化するのが安全。

Slide 50

Slide 50 text

50 最後にもう⼀度

Slide 51

Slide 51 text

51 基本これだけ︕(再掲) このセッションで覚えて帰っていただきたいこと • バケット/オブジェクトACLは、⼀旦忘れる • 原則︓最⼩権限から始めよ • クロスアカウントはIAMロールが無難 • ⼀般公開しないなら、ブロックパブリックアクセス

Slide 52

Slide 52 text

52