Principal がワイルドカード指定または未指定の SNS トピックポリシー

SNS トピックのアクセス主体、許可する操作、サービス連携の条件を確認し、意図しないメッセージの発行を制限します。

説明

SNS トピックのポリシーでは、アクセスできるアカウント、ロール、サービスプリンシパルと、許可する操作を指定します。許可するステートメントの Principal にワイルドカードを使う場合は、条件を含めたポリシー全体でアクセス範囲が十分に制限されているか確認してください。Principal を省略した不完全なポリシーが、既定ですべてのアクセスを許可するわけではありません。

実際の権限は、Action、Resource、条件、ほかのポリシーによる制限で決まります。条件キーは、その意味とリクエストで利用できるかどうかを確認して選んでください。たとえば、aws:ResourceAccount はリソース所有者のアカウントを表します。aws:SourceAccount は、該当する AWS サービス間のリクエストで、元のリソースを所有するアカウントを制限します。一般の IAM リクエスト元のアカウントを制限する条件ではありません。

想定される影響

  • メッセージを発行する必要のないアクセス主体に、実際には sns:Publish が許可されている場合、望まないメッセージがトピックやサブスクライバーに届く可能性があります。
  • サブスクライバーが受信メッセージに応じて自動処理を実行する場合、意図しない操作や誤った通知につながる可能性があります。
  • 条件の意味を誤解すると、想定より広いアクセスを許可したり、必要なサービス連携を遮断したりするおそれがあります。

対処方法

  • アクセスが必要なアカウント、ロール、サービスプリンシパルを特定し、Principal、操作、実際のトピック ARN を用途に合わせて限定してください。
  • 条件はキー名だけでなく、演算子、値、そのキーがリクエストで提供されるかも確認してください。aws:SourceAccount を一般の IAM リクエスト元のアカウントを制限する条件として使用しないでください。
  • AWS サービスとの連携では、そのサービスの手順に従い、サービスプリンシパルと適切な aws:SourceArn または aws:SourceAccount 条件を使用してください。新しい連携には非推奨の aws:SourceOwner を使わず、変更後は必要なメッセージの発行と配信が引き続き動作することをテストしてください。

例

以下は、ワイルドカードのプリンシパルと元のリソースを所有するアカウントの条件を比較する抜粋です。そのままデプロイできる完全なポリシーではありません。最初の例の Version: "2022-05-02" はサポートされていないポリシー言語バージョンです。Publish にはサービスの接頭辞がなく、Resource もありません。実際のポリシーでは 2012-10-17、sns:Publish、対象トピックの ARN を指定してください。2 番目の例の ARN とアカウント番号も、実際の環境に合わせて確認する必要があります。

変更前

yaml
- name: Create alarm SNS topic community
  community.aws.sns_topic:
    name: "alarms"
    state: present
    display_name: "alarm SNS topic"
    policy:
      Version: "2022-05-02"
      Statement:
        - Action: Publish
          Effect: Allow
          Principal:
            AWS: "*"

変更後

yaml
- name: Create SNS topic with safe policy
  community.aws.sns_topic:
    name: secure-topic
    display_name: "Secure SNS Topic"
    state: present
    policy:
      Id: secure-topic-policy
      Version: "2012-10-17"
      Statement:
        - Sid: AllowPublishFromSpecificAccount
          Effect: Allow
          Resource: "arn:aws:sns:*:*:secure-topic"
          Principal: "*"
          Action: sns:Publish
          Condition:
            StringEquals:
              aws:SourceAccount: "123456789012"

説明:

  • 最初の例: Principal.AWS: "*" はアクセス主体を特定のアカウントやロールに限定しません。上記の構文の問題を修正し、アクセスが必要な主体と許可する範囲を明示してください。
  • 2 番目の例: aws:SourceAccount のアカウント番号は、該当する AWS サービスリクエストの元となるリソースを所有するアカウントを指定する必要があります。実際の連携に合うプリンシパルと条件を選び、ARN のリージョンとアカウントのワイルドカードを対象トピックの値に置き換えてください。この条件だけでは、すべての IAM リクエスト元を特定のアカウントに限定できません。

参考資料