Upgrade to Pro — share decks privately, control downloads, hide ads and more …

閉域要件におけるS3周辺ポリシーの組み合わせ方

 閉域要件におけるS3周辺ポリシーの組み合わせ方

Security-JAWS第23回での登壇資料です。
イベントURL:https://s-jaws.doorkeeper.jp/events/127684
登壇動画URL:https://youtu.be/Q-dKRmVgpRA?t=5860

More Decks by みずほリサーチ&テクノロジーズ株式会社 先端技術研究部

Other Decks in Technology

Transcript

  1. 閉域要件における
    S3周辺ポリシーの組み合わせ方
    2021.11.11
    Security-JAWS 第23回
    Copyright (c) Mizuho Research & Technologies, Ltd. All Rights Reserved.
    (免責事項)
    当資料は情報提供のみを目的として作成されたものであり、商品の勧誘を目的としたものではありません。
    本資料は、当社が信頼できると判断した各種データに基づき作成されておりますが、その正確性、確実性を
    保証するものではありません。また、本資料に記載された内容は予告なしに変更されることもあります。

    View Slide

  2. 自己紹介
     氏名:松尾 優成(まつお ゆうせい)
     所属:先端技術研究部 兼 プロジェクト推進部
     役割:
     AWS社内案件の設計・構築サポート
     みずほコミュニティ ERG ”コクリエ” の運営

    View Slide

  3. みずほのAWS利用経緯
     2018年:AWS上にグループ共通基盤を構築、CCoE設立
     2019年:AWS人材育成施策開始
     2020年:みずほ内でAWS開発案件数が拡大
    https://www.nikkeibp.co.jp/atclpubmkt/book/21/S70150/

    View Slide

  4. 本日話すこと
     閉域要件で、S3のデータ流出を防ぐための予防的統制観点
     各ポリシーをどのように組み合わせてS3のデータ流出を防ぐか
     IAMポリシー
     VPCエンドポイントポリシー
     S3バケットポリシー

    View Slide

  5. 本日話さないこと
     データが流出した場合の発見的統制観点
     S3 ACLやKMS周りの詳細な設定
     S3以外のデータを保有するサービスに対する対策
     オンプレミス側のデータ流出対策

    View Slide

  6. みずほのAWS利用状況
     重要情報を扱うシステムの場合、閉域網とすることが主流
     AWS と自社設備のハイブリッド・クラウド構成となることが多い
     重要情報を扱う閉域用端末と、マネコン用のインターネット端末2種で運用
     ベストプラクティスに沿って、マルチアカウント構成が主流

    View Slide

  7. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者

    View Slide

  8. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者
    ①オンプレミスにある
    ユーザー情報を・・・

    View Slide

  9. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者
    ②S3にアップロード

    View Slide

  10. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者
    ③S3のデータをEC2でETL処理

    View Slide

  11. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者
    ④EC2から再度S3に
    アップロードし・・・

    View Slide

  12. アカウントA
    構成概要
     オンプレミスからS3に格納したユーザー情報を、EC2 で分析して還元するシステム。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者
    ⑤オンプレミスに処理済みの
    ユーザー情報を還元

    View Slide

  13. アカウントA
    構成概要(補足)
     ユーザーごとに専用のS3バケットがあり、ユーザー増加に応じてS3バケットも増加。
     バッチ処理のみで、インターネットアクセスなし。
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    運用者

    View Slide

  14. 閉域網だからといって、きちんと対策しないと・・・
    VPC
    Corporate
    data center
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    運用者
    アカウントA
    bucket-a
    bucket-b
    S3



    View Slide

  15. 閉域網だからといって、きちんと対策しないと・・・
    VPC
    Corporate
    data center
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    流出!
    C
    C
    データ流出リスクがある!→
    C

    View Slide

  16. データ流出観点で着目するポリシーは3つ
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    Ⅰ. IAMポリシー Ⅱ. VPCエンドポイントポリシー Ⅲ. バケットポリシー




    View Slide

  17. データを保有するコンポーネントから
    データ流出の対策を考えてみる

    View Slide

  18. アカウントA
    重要データを保持するのは3箇所
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    閉域用
    bucket-b
    S3



    EC2
    ① 閉域用端末
    ② EC2
    ③ S3バケット
    運用者
    ←これらに置かれたデータが流出するのを防ぎたい・・・!



    View Slide

  19. VPCエンドポイントを利用するアクセス者側で考えてみる

    View Slide

  20. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA



    View Slide

  21. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ① 閉域用端末
    ② EC2
    ③ S3バケット
    ←①と②に焦点を絞ってみる



    View Slide

  22. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }

    View Slide

  23. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }
    IAMポリシーのAction句は最小権限を前提。

    View Slide

  24. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }
    最小権限を厳密にするならば、Resource句で
    bucket-a, bucket-b のように書くべきだが・・・

    View Slide

  25. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }
    S3バケット増加に伴うポリシー更新体力を
    抑えるため、ワイルドカードを使いたい

    View Slide

  26. もし、ワイルドカードを使わなかったら・・・?

    View Slide

  27. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    11/1(月)

    View Slide

  28. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    5営業日で対応します!
    11/1(月)

    View Slide

  29. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    5営業日で対応します!
    S3バケットのArnを間違えたので、依頼内容を
    修正したいのですが・・・
    11/1(月)
    11/4(木)

    View Slide

  30. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    5営業日で対応します!
    別途、5営業日で対応します!
    11/1(月)
    11/4(木)
    S3バケットのArnを間違えたので、依頼内容を
    修正したいのですが・・・

    View Slide

  31. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    5営業日で対応します!
    別途、5営業日で対応します!
    S3バケットが更に増加し・・・(ry
    11/1(月)
    11/4(木)
    11/8(月)
    S3バケットのArnを間違えたので、依頼内容を
    修正したいのですが・・・

    View Slide

  32. 開発者 権限管理者
    S3バケットが増加したので、IAMロールに
    権限を追加してもらえますか?
    5営業日で対応します!
    別途、5営業日で対応します!
    S3バケットが更に増加し・・・(ry
    11/1(月)
    11/4(木)
    11/8(月)
    S3バケットのArnを間違えたので、依頼内容を
    修正したいのですが・・・
    ※Permissions Boundaryは
    本題から逸れるので考慮外

    View Slide

  33. VPCe利用者のアクセス権限
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }
    というわけで、やはりワイルドカードを使いたい!

    View Slide

  34. 社外アカウントに同様の命名規則で
    S3バケットを作られたら・・・?
    "arn:aws:s3:::bucket-a“
    "arn:aws:s3:::bucket-b“
    "arn:aws:s3:::bucket-*“

    View Slide

  35. VPCe利用者:不正経路
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    bucket-zをアカウントCに作成

    View Slide

  36. VPCe利用者:不正経路
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    IAMポリシーにワイルドカードを利用
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }

    View Slide

  37. VPCe利用者:不正経路
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    社外のS3バケットポリシーに以下を設定
    {
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::{アカウントA-ID}:root"
    },
    "Action": "s3:*",
    "Resource”: "arn:aws:s3:::bucket-z/*"
    }
    IAMポリシーにワイルドカードを利用
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }

    View Slide

  38. VPCe利用者:不正経路
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    IAMポリシーにワイルドカードを利用
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*“
    }
    社外のS3バケットポリシーに以下を設定
    {
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::{アカウントA-ID}:root"
    },
    "Action": "s3:*",
    "Resource”: "arn:aws:s3:::bucket-z/*"
    }
    流出!

    View Slide

  39. IAMポリシーでワイルドカードを使いつつ、
    アクセス先のS3バケットを自社アカウントに制限したい

    View Slide

  40. 2020年末にこんなアップデートが・・・

    View Slide

  41. https://aws.amazon.com/jp/about-aws/whats-new/2020/12/

    View Slide

  42. https://aws.amazon.com/jp/about-aws/whats-new/2020/12/

    View Slide

  43. https://aws.amazon.com/jp/about-aws/whats-new/2020/12/

    View Slide

  44. 条件キー s3:ResourceAccount で解決できそう!
    https://aws.amazon.com/jp/about-aws/whats-new/2020/12/

    View Slide

  45. ここでは、IAM側で記述してみる
    https://aws.amazon.com/jp/about-aws/whats-new/2020/12/

    View Slide

  46. VPCe利用者:不正経路
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    流出!
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*"
    }

    View Slide

  47. IAMロール:S3アカウント制限を追加
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*"
    }
    ・追加IAMポリシー例
    {
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "*",
    "Condition": {
    "StringNotEquals": {
    "s3:ResourceAccount": "アカウントA-ID"
    }
    }
    参考) https://dev.classmethod.jp/articles/iam-condition-keys-amazon-s3-resource-account/

    View Slide

  48. IAMロール:S3アカウント制限を追加
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    ・追加IAMポリシー例
    {
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "*",
    "Condition": {
    "StringNotEquals": {
    "s3:ResourceAccount": "アカウントA-ID"
    }
    }
    制限可能!
    参考) https://dev.classmethod.jp/articles/iam-condition-keys-amazon-s3-resource-account/
    ・IAMポリシー例
    {
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:GetObject",
    "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::bucket-*"
    }

    View Slide

  49. でも、社外アカウントのクレデンシャルを持ち込まれたら・・・?

    View Slide

  50. クレデンシャル持ち込みパターン
    Corporate
    data center
    アカウントC(社外)
    アカウントA
    bucket-z
    アカウントC で bucket-zに
    アクセスできるロールを追加
    C

    View Slide

  51. クレデンシャル持ち込みパターン
    VPC
    Corporate
    data center
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    アクセス者側で
    アカウントCの
    クレデンシャルを利用
    C
    C
    C

    View Slide

  52. クレデンシャル持ち込みパターン
    VPC
    Corporate
    data center
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    流出!
    C
    C
    C

    View Slide

  53. クレデンシャル持ち込みパターン
    VPC
    Corporate
    data center
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    運用者
    アカウントC(社外)
    アカウントA
    bucket-z
    流出!
    C
    C
    社外のクレデンシャルを持ち込まれると、
    S3 データイベントの CloudTrail ログが
    アカウントAで記録されないため、要注意。
    C

    View Slide

  54. クレデンシャル持ち込みによる他アカウントへの流出対策も
    s3:ResourceAccount ※ を
    VPCエンドポイントポリシーで使用すれば大丈夫
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    ※アクセスポイントを使っている場合、
    s3:DataAccessPointArnも有用。
    アカウントC(社外)
    bucket-z

    View Slide

  55. せっかくなので、VPCエンドポイントポリシーで
    持ち込まれたクレデンシャルを拒否する手法も紹介
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    アカウントC(社外)
    C
    C
    C

    View Slide

  56. KMS開発者ガイド:https://docs.aws.amazon.com/ja_jp/kms/latest/
    developerguide/kms-vpc-endpoint.html#vpce-policy
    左記はKMS開発者ガイドの
    VPCエンドポイントポリシー例

    View Slide

  57. KMS開発者ガイド:https://docs.aws.amazon.com/ja_jp/kms/latest/
    developerguide/kms-vpc-endpoint.html#vpce-policy
    aws:PrincipalAccount で
    クレデンシャル持ち込みの対策可能。
    S3 でも同様の考えで制限できるはず・・・

    View Slide

  58. KMS開発者ガイド:https://docs.aws.amazon.com/ja_jp/kms/latest/
    developerguide/kms-vpc-endpoint.html#vpce-policy
    しかし、この記載をそのまま使うと、
    全ての Principal でアクセス不可・・・。
    以下 Statement も追加で必要。
    {
    "Action": "*",
    "Effect": "Allow",
    "Resource": "*“,
    “Principal": "*“
    }

    View Slide

  59. {
    "Statement": [
    {
    "Effect": "Deny",
    "Principal": {"AWS": "*"},
    "Action": "*",
    "Resource": "*",
    "Condition": {
    "StringNotEquals": {
    "aws:PrincipalAccount": "アカウントA-ID"
    }
    }
    },
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "*",
    "Resource": "*"
    }
    ]
    }
    本ポリシーでクレデンシャルの持ち込み
    利用を制限可能。
    ※s3:ResourceAccountの記載は割愛。
    VPCエンドポイントポリシー例
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    アカウントA

    View Slide

  60. {
    "Statement": [
    {
    "Effect": "Deny",
    "Principal": {"AWS": "*"},
    "Action": "*",
    "Resource": "*",
    "Condition": {
    "StringNotEquals": {
    "aws:PrincipalAccount": "アカウントA-ID"
    }
    }
    },
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "*",
    "Resource": "*"
    }
    ]
    }
    ただし、EC2でAmazon Linuxの
    リポジトリを利用している場合は要注意。
    VPCエンドポイントポリシー例
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    アカウントA

    View Slide

  61. {
    "Statement": [
    {
    "Effect": "Deny",
    "Principal": {"AWS": "*"},
    "Action": "*",
    "Resource": "*",
    "Condition": {
    "StringNotEquals": {
    "aws:PrincipalAccount": "アカウントA-ID"
    }
    }
    },
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "*",
    "Resource": "*"
    }
    ]
    }
    yum updateのリクエストでは
    アカウントAのprincipal情報をもたないため、
    アクセス拒否されてしまう。
    VPCエンドポイントポリシー例
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    アカウントA AWS管理
    amazonlinux
    リポジトリ

    View Slide

  62. {
    "Statement": [
    {
    "Effect": "Deny",
    "Principal": {"AWS": "*"},
    "Action": "*",
    “NotResource": "arn:aws:s3:::amazonlinux.{region}.amazonaws.com/*",
    "Condition": {
    "StringNotEquals": {
    "aws:PrincipalAccount": "アカウントA-ID"
    }
    }
    },
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "*",
    "Resource": "*"
    }
    ]
    }
    アカウントA
    EC2が使用するVPCeのエンドポイントポリシーでは
    NotResource句 を使って以下を指定すれば、
    AmazonLinuxリポジトリにアクセス可。
    VPCエンドポイントポリシー例
    VPC
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    AWS管理
    amazonlinux
    リポジトリ

    View Slide

  63. 重要データを保持するのは3箇所
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ① 閉域用端末
    ② EC2
    ③ S3バケット
    ←①と②は前述の対策で大丈夫そう



    View Slide

  64. 重要データを保持するのは3箇所
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    ① 閉域用端末
    ② EC2
    ③ S3バケット
    ←次に③S3バケットへの正常・不正経路を考えてみる



    View Slide

  65. アカウントA
    S3バケット:正常経路の洗い出し
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    Management
    Console
    アカウントB(ユーザー管理)
    IAM User
    閉域用
    インターネット用
    Read Only Role
    bucket-b
    S3



    CloudFormation
    S3 Replication
    運用者





    IP制限

    View Slide

  66. S3バケット:不正経路の洗い出し
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    インターネット用
    bucket-b
    S3



    AWS Services
    運用者



    アカウントC(社外)
    アカウントA
    Public Access
    AWS Services

    View Slide

  67. 不正経路は色々あるので
    正常経路以外を全て拒否したい
    アカウントA
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    S3
    CloudFormation
    S3 Replication





    bucket-a

    View Slide

  68. バケットポリシー・アクセスポイントポリシーで
    前述の経路を制限できそう

    View Slide

  69. バケットポリシーだけで制御する例を考えてみる

    View Slide

  70. "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    ①~⑤のいずれかに一致しない場合
    Denyする例。
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    bucket-a
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    S3
    CloudFormation
    S3 Replication










    View Slide

  71. S3
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    逆に言うと、①~⑤のいずれかに
    一致すればアクセス可能。
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    CloudFormation
    S3 Replication










    bucket-a

    View Slide

  72. "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    リクエスト元のVPCエンドポイントIDを検査。
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    VPCe (I/F型)
    VPCe (G/W型)




    bucket-a
    S3

    View Slide

  73. S3
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    Read Only Role
    CloudFormation
    S3 Replication






    bucket-a
    リクエスト元の IAM ロールIDを検査。

    View Slide

  74. "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    (注意点)
    ③のスイッチロール時はランダムにセッション名が発行
    されるが、Principal 句でワイルドカード利用不可。
    aws:userId を使用して制御する。
    参考) https://dev.classmethod.jp/articles/s3-bucket-acces-to-a-specific-role/
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    Read Only Role


    bucket-a
    アカウントB
    (ユーザー管理)
    IAM User AWS STS
    S3

    View Slide

  75. S3
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    CloudFormation
    S3 Replication





    bucket-a
    AWSサービスの場合は、Principal句や
    aws:PrincipalServiceName でも記述可。

    View Slide

  76. S3
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
    "arn:aws:s3:::bucket-a",
    "arn:aws:s3:::bucket-a/*"
    ],
    "Condition": {
    "StringNotEquals": {
    "aws:sourceVpce": [
    “S3VPCe(I/F型)のID",
    “S3VPCe(G/W型)のID"
    ]
    },
    "StringNotLike": {
    "aws:userId": [
    "{ReadOnlyRoleID}:*",
    "{CFnRoleID}:*",
    "{S3ReplicationRoleID}:*"
    ]
    }
    S3バケットポリシー例 ※色々書き方はあるのでご参考程度に・・・
    アカウントA
    bucket-a
    バケット自体のArnをResource句に指定すると
    Condition句の設定ミス時にrootユーザー以外で
    バケットを全く触れなくなるので要注意。

    View Slide

  77. バケットポリシーだけだと、煩雑になりがち・・・

    View Slide

  78. アクセスポイントも利用する方が
    バケットポリシーの内容を分割できておすすめ!
    アカウントA
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    S3
    CloudFormation
    S3 Replication
    bucket-a
    Access point
    Access point
    VPC access
    point

    View Slide

  79. アカウントA
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    S3
    CloudFormation
    S3 Replication
    bucket-a
    Access point
    Access point
    VPC access
    point
    S3アクセスポイントポリシーのざっくり説明 ※詳細は割愛
    バケットポリシー:
    特定のアクセスポイントからのリクエスト以外をDeny。

    View Slide

  80. アカウントA
    VPCe (I/F型)
    VPCe (G/W型)
    Read Only Role
    S3
    CloudFormation
    S3 Replication
    Access point
    Access point
    VPC access
    point
    S3アクセスポイントポリシーのざっくり説明 ※詳細は割愛
    アクセスポイントポリシー:
    各アクセスポイントで設定。特定経路以外をDeny。

    View Slide

  81. (余談)S3アクセスポイントを使いたかったけど
    使えなかった話のご紹介

    View Slide

  82. アクセスポイントの利用はArn形式のみ(だった)
    → アプリケーション・ミドルウェアで未対応のケースあり・・・
    arn:aws:s3:{リージョン名}:{アカウントID}:accesspoint/
    {S3アクセスポイント名}/{オブジェクト名}

    View Slide

  83. アップデートでバケット名と同様のエイリアスに対応したので、
    今なら心置きなく使えそう?
    https://aws.amazon.com/jp/about-aws/whats-new/2021/07

    View Slide

  84. 脱線しましたが、S3バケットもバケットポリシーで
    特定経路以外をDenyすれば、大丈夫そう
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA



    ① 閉域用端末
    ② EC2
    ③ S3バケット

    View Slide

  85. ポリシー関連をまとめてみる
    VPC
    Corporate
    data center
    bucket-a
    Direct
    Connect
    VPCe (I/F型)
    VPCe (G/W型)
    EC2
    閉域用
    bucket-b
    S3



    運用者
    アカウントA
    Ⅰ. IAMポリシー:
    s3:ResourceAccountで
    社外バケットへのアクセスをDeny
    ※S3に触れる全IAMロールに適用推奨
    Ⅱ.VPCeポリシー:
    aws:PrincipalAccount で
    クレデンシャルの持込をDeny
    ※ResourceAccountの併用もあり
    Ⅲ.バケットポリシー:
    aws:sourceVpceなどで
    特定経路以外をDeny
    ※アクセスポイント利用がおすすめ




    View Slide

  86. S3バケット周りの設定補足
     パブリックアクセスブロック
    → アカウント単位で有効化
     S3バケット・オブジェクトのACL
    → 不要なアクセス許可を付与しない
     カスタマー管理CMK
    → 重要データをもつS3バケットは、カスタマー管理CMKで暗号化

    View Slide

  87. (余談)発見的統制も相応の体力・・・
     CSPM(Cloud Security Posture Management)の製品を導入
    →多数の様々なルールから、適用対象・カスタマイズ対象を制定
     Security HubのCISベンチマークを順守
    →ConfigやCloudWatchアラーム周りの通知をポチポチ実装

    View Slide

  88. まとめ
     N/W的に閉域構成だとしても、データ流出のリスクはあり、安心できない
     閉域要件のS3周りで気を付けたい点は・・・
    • 社外バケットへのアクセスを防いでいるか
    • クレデンシャルの持込を対策できているか
    • 機微情報を扱うバケットはアクセス経路を限定しているか
     (課題?)境界防御からの脱却を夢見る

    View Slide