説明
SNS トピックポリシーの Principal: "*" は、アクセス主体を特定のアカウントやロールに限定しません。適切な条件なしに必要以上の操作を許可すると、信頼していない主体にもメッセージの発行や、その他の許可された操作を認めるおそれがあります。実際のアクセス権限は、操作、トピック、条件、ほかに適用されるポリシーによって決まります。
トピックポリシーでアクセスを許可するステートメントには、有効な Principal と Effect: Allow が必要です。許可ステートメントでアクセス主体を省略することは有効なアクセス制限ではなく、省略しただけでアクセスが許可されるわけでもありません。
アカウントに関する条件は、それぞれ意味が異なります。aws:ResourceAccount は対象リソースの所有アカウントを示し、呼び出し元アカウントを制限しません。aws:SourceAccount は、対応する AWS サービス間のリクエストで送信元リソースのアカウントを制限するためのキーであり、すべての呼び出し元アカウントを一律に制限する条件ではありません。
想定される影響
- 発行権限が不要なアクセス主体に
sns:Publishが実際に許可されている場合、意図しないメッセージがトピックに発行されるおそれがあります。 - そのメッセージが購読者や自動化処理に届くと、誤った通知、処理エラー、追加費用につながる可能性があります。
- 必要以上に広いクロスアカウント権限が有効なら、想定した信頼範囲を超えたアクセスにつながる場合があります。影響は、実際の操作、リソース、リクエスト条件によって異なります。
対処方法
- 必要な AWS アカウント、ロール、サービスを有効な
Principalの形式で指定し、不要な許可ステートメントを取り除いてください。 sns:Publishなどの必要な操作と正確なトピック ARN を指定してください。サービス連携では、そのサービスが対応するaws:SourceArnやaws:SourceAccountなどの条件を使い、演算子と実際の値を確認してください。- ポリシー全体と関連付けられた
Topicsを確認し、許可すべきリクエストと拒否すべきリクエストの両方を検証してください。必要な発行元やサービス連携が引き続き動作することも確認してください。
トピックポリシーの構成例
以下はアクセス主体の指定を比較する抜粋です。どちらも必須の Topics がなく、arn:aws:sns:MyTopic もリージョンとアカウント ID を欠く不完全な ARN なので、そのままデプロイできるテンプレートではありません。
ワイルドカードのプリンシパルに発行を許可
AWSTemplateFormatVersion: '2010-09-09'
Description: ''
Resources:
snsPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Statement:
- Sid: MyTopicPolicy
Effect: Allow
Principal: "*"
Action:
- sns:Publish
Resource: arn:aws:sns:MyTopic
このステートメントは、特定のアクセス主体や条件に限定せず sns:Publish を許可する意図の指定です。不足しているデプロイ用のプロパティを補う際も、必要な発行元とトピックに権限を限定してください。
不完全なアクセス主体の指定
AWSTemplateFormatVersion: '2010-09-09'
Description: ''
Resources:
snsPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Statement:
- Sid: MyTopicPolicy
Effect: Allow
Principal: "otherPrincipal"
Action:
- sns:Publish
Resource: arn:aws:sns:MyTopic
otherPrincipal は有効な AWS アカウントやロールの指定ではありません。意図したアカウント、ロール、サービスを示す有効な指定に置き換え、トピック ARN と Topics を補ったうえで、ポリシー全体を検証してください。