Amazon SNS 訪問控制的示例案例 - Amazon Simple Notification Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon SNS 訪問控制的示例案例

本節提供幾個存取控制的一般使用案例的範例。

授與主題的 AWS 帳戶 存取權

假設您在 Amazon 中有一個主題SNS,並且希望允許一個或多個 AWS 帳戶 對該主題執行特定操作,例如發布消息。您可以通過使用 Amazon SNS API 行動來完成此操作AddPermission

AddPermission動作可讓您指定主題、清單 AWS 帳戶 IDs、動作清單和標籤。SNS然後,Amazon 會自動產生新的政策聲明,並將其新增至主題的存取控制政策。您不需要自己撰寫政策聲明 — Amazon 會為您SNS處理這個問題。如果您稍後需要移除原則,可以透過呼叫RemovePermission並提供新增權限時使用的標籤來執行此動作。

例如,如果您呼叫AddPermission主題 arn: aw: sn: US-東-2:444455556666:MyTopic,指定 AWS 帳戶 ID 1111-2222-3333、動作和標籤,Amazon 將產生下列政策陳述式並插入到主題的存Publish取控制政策中:grant-1234-publishSNS

{ "Statement": [{ "Sid": "grant-1234-publish", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Publish"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic" }] }

新增此陳述式之後, AWS 帳戶 1111-2222-3333 就會有將訊息發佈到主題的權限。

其他資訊:

  • 自訂原則管理:雖然授與權限AddPermission很方便,但在更複雜的情況下,手動管理主題的存取控制原則通常很有用,例如新增條件或授與特定IAM角色或服務的權限。您可以使用直接更新策略屬性SetTopicAttributesAPI來執行此操作。

  • 安全最佳實務:授予許可時請務必小心,以確保只有受信任 AWS 帳戶 或實體可以存取您的 Amazon SNS 主題。定期檢閱及稽核主題所附的政策,以維護安全性。

  • 政策限制:請記住,Amazon 政SNS策的大小和複雜性有限制。如果您需要新增許多權限或複雜條件,請確保您的政策保持在這些限制範圍內。

將訂閱限制為 HTTPS

若要將 Amazon SNS 主題的通知交付協定限制為HTTPS,您必須建立自訂政策。Amazon 中的AddPermission動作SNS不允許您在授予主題存取權時指定通訊協定限制。因此,您必須手動撰寫強制執行此限制的原則,然後使用SetTopicAttributes動作將原則套用至您的主題。

以下說明如何建立將訂閱限制為HTTPS:

  1. 撰寫原則。原則必須指定您要授與存取權的 AWS 帳戶 ID,並強制執行僅允許HTTPS訂閱的條件。以下是授與 AWS 帳戶 ID 1111-2222-3333 權限訂閱主題的範例政策,但前提是使用的通訊協定為。HTTPS

    { "Statement": [{ "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Subscribe"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "sns:Protocol": "https" } } }] }
  2. 套用策略。使用 Amazon 中的SetTopicAttributes動作SNSAPI將此政策套用至您的主題。將主題的Policy屬性設定為您建立的JSON策略。

    snsClient.setTopicAttributes(SetTopicAttributesRequest.builder() .topicArn("arn:aws:sns:us-east-2:444455556666:MyTopic") .attributeName("Policy") .attributeValue(jsonPolicyString) // The JSON policy as a string .build());

其他資訊:

  • 自訂存取控制。此方法可讓您強制執行更精細的存取控制,例如限制訂閱通訊協定,這是無法透過AddPermission動作執行的。自訂原則可為需要特定條件 (例如通訊協定強制執行或 IP 位址限制) 的案例提供彈性。

  • 安全性最佳做法。限制訂閱以確保傳輸中的資料已加密,以HTTPS增強通知的安全性。定期檢閱您的主題政策,以確保它們符合您的安全性和合規性要求。

  • 政策測試。在生產環境中套用原則之前,請先在開發環境中進行測試,以確保其行為如預期。這有助於防止意外存取問題或意外限制。

將訊息發佈到 Amazon SQS 佇列

要將 Amazon SNS 主題中的消息發佈到 Amazon SQS 隊列,您需要在 Amazon 隊SQS列上配置正確的許可。雖然 Amazon SNS 和 Amazon 都SQS使用 AWS存取控制政策語言,但您必須在 Amazon SQS 佇列上明確設定政策,以允許從 Amazon SNS 主題傳送訊息。

您可以使用SetQueueAttributes動作將自訂政策套用至 Amazon SQS 佇列來達成此目的。與 Amazon 不同SNS,Amazon SQS 不支持創建具有條件的政策聲明的AddPermission操作。因此,您必須手動撰寫原則。

以下是授予 Amazon SNS 權限將訊息傳送到佇列的 Amazon SQS 政策範例。請注意,此政策與 Amazon SQS 隊列相關聯,而不是 Amazon SNS 主題。指定的動作是 Amazon SQS 動作,資源是隊列的 Amazon 資源名稱(ARN)。您可以使用GetQueueAttributes動作擷取佇列。ARN

{ "Statement": [{ "Sid": "Allow-SNS-SendMessage", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": ["sqs:SendMessage"], "Resource": "arn:aws:sqs:us-east-2:444455556666:MyQueue", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-2:444455556666:MyTopic" } } }] }

此原則會根據要傳送的訊息來源,使用aws:SourceArn條件來限制SQS佇列的存取。這可確保只有來自指定SNS主題的訊息 (在本例中為 arn: aw: sn: us: 東-2:444455556666:) 才能傳遞至佇列。MyTopic

其他資訊:

  • 佇列ARN。確保您使用動作擷取 Amazon SQS 佇列的正ARN確GetQueueAttributes性。這對ARN於設置正確的權限至關重要。

  • 安全性最佳做法。設定原則時,請務必遵循最低權限原則。僅向 Amazon SNS 主題授予必要的許可以與 Amazon SQS 佇列互動,並定期檢閱政策以確保它們 up-to-date 安全無虞

  • Amazon 中的默認政策SNS。與某些誤解相反,Amazon SNS 不會自動授予允許其他 AWS 服務 訪問新創建主題的默認策略。您必須明確定義並附加政策,以控制對 Amazon SNS 主題的存取。

  • 測試和驗證。設定政策後,透過將訊息發佈到 Amazon SNS 主題並確認訊息是否已成功傳遞至 Amazon SQS 佇列來測試整合。這有助於確認原則已正確設定。

允許 Amazon S3 事件通知發佈至主題

若要允許來自另一個 AWS 帳戶 儲存貯體的 Amazon S3 儲存貯體向您的 Amazon SNS 主題發佈事件通知,您需要相應地設定主題的存取政策。這涉及編寫一個自訂政策,該政策授予來自特定 Amazon S3 服務的許可, AWS 帳戶 然後將此政策應用於您的 Amazon SNS 主題。

以下是您可以設置它的方法:

  1. 撰寫原則。該政策應授予 Amazon S3 服務 (s3.amazonaws.com) 發佈到 Amazon SNS 主題的必要許可。您將使用此SourceAccount條件來確保只有擁有 Amazon S3 儲存貯體的指定 AWS 帳戶人員可以向您的主題發佈通知。

    以下為政策的範例:

    { "Statement": [{ "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic", "Condition": { "StringEquals": { "AWS:SourceAccount": "444455556666" } } }] }
    • 主題擁有者 — 111122223333 是擁有 Amazon 主題的 AWS 帳戶 ID。SNS

    • Amazon S3 儲存貯體擁有者 — 444455556666 是擁有 Amazon S3 儲存貯體傳送通知的 AWS 帳戶 ID。

  2. 套用策略。使用此SetTopicAttributes動作針對您的 Amazon SNS 主題設定此政策。這會更新主題的存取控制,以包含您自訂原則中指定的權限。

    snsClient.setTopicAttributes(SetTopicAttributesRequest.builder() .topicArn("arn:aws:sns:us-east-2:111122223333:MyTopic") .attributeName("Policy") .attributeValue(jsonPolicyString) // The JSON policy as a string .build());

其他資訊:

  • 使用SourceAccount條件。SourceAccount條件可確保只有來自指定的事件 AWS 帳戶 (在本例中為 444455556666) 才能觸發 Amazon 主題。SNS這是一項安全措施,可防止未經授權的帳戶向您的主題傳送通知。

  • 其他支持服務SourceAccount以下服務支持該SourceAccount條件。當您想根據原始帳戶限制對 Amazon SNS 主題的訪問時,使用此條件至關重要。

    • Amazon API 网关

    • Amazon CloudWatch

    • Amazon DevOps 大師

    • Amazon ElastiCache

    • Amazon EventBridge

    • Amazon GameLift

    • Amazon Pinpoint SMS 和語音 API

    • Amazon RDS

    • Amazon Redshift

    • Amazon S3 Glacier

    • Amazon SES

    • Amazon Simple Storage Service

    • AWS CodeCommit

    • AWS Directory Service

    • AWS Lambda

    • AWS Systems Manager Incident Manager

  • 測試和驗證。套用政策後,透過觸發 Amazon S3 儲存貯體中的事件並確認事件已成功發佈到 Amazon SNS 主題來測試設定。這有助於確保您的原則設定正確。

  • 安全性最佳做法。定期檢閱和稽核您的 Amazon SNS 主題政策,以確保它們符合您的安全要求。限制只存取受信任的帳戶和服務對於維護安全的作業至關重要。

允許 Amazon 發布SES到另一個帳戶擁有的主題

您可以允許其他人發佈 AWS 服務 至另一個主題所擁有的主題 AWS 帳戶。假設您登錄了 111122223333 帳戶,開設了 AmazonSES,並創建了一封電子郵件。若要將有關此電子郵件的通知發佈到 444455556666 帳戶擁有的 Amazon SNS 主題,您需要建立類似下列的政策。若要這麼做,您需要提供有關主體 (其他服務) 和每個資源擁有權的資訊。該Resource聲明提供主題ARN,其中包括主題擁有者的帳戶識別碼 444455556666。"aws:SourceOwner": "111122223333" 陳述式會指定您的帳戶擁有該電子郵件。

{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:SourceOwner": "111122223333" } } } ] }

將事件發佈到 Amazon 時SNS,支援下列服務aws:SourceOwner

  • Amazon API 网关

  • Amazon CloudWatch

  • Amazon DevOps 大師

  • Amazon ElastiCache

  • Amazon GameLift

  • Amazon Pinpoint SMS 和語音 API

  • Amazon RDS

  • Amazon Redshift

  • Amazon SES

  • AWS CodeCommit

  • AWS Directory Service

  • AWS Lambda

  • AWS Systems Manager Incident Manager

aws:SourceAccountaws:SourceOwner 的比較

重要

aws:SourceOwner已淘汰,新服務SNS只能透過aws:SourceArn和與 Amazon 整合aws:SourceAccount。對於目前支援的現有服務,Amazon SNS 仍維持向後相容性aws:SourceOwner

aws:SourceAccountaws:SourceOwner條件密鑰發布到 Amazon SNS 主題 AWS 服務 時,每個密鑰都由某些密鑰設置。受支援時,此值將是代表服務發佈資料的 12 位數 AWS 帳戶 ID。有些服務支持一個,有些支持另一個。

允許中組織中的帳號發佈 AWS Organizations 至不同帳戶中的主題

此 AWS Organizations 服務可協助您集中管理帳單、控制存取和安全性,以及共用您的 AWS 帳戶.

您可以在組織主控台中找到您的組織 ID。如需詳細資訊,請參閱從管理帳戶檢視組織的詳細資訊

在此示例中,組織 AWS 帳戶 中的任何人都myOrgId可以在帳戶MyTopic中發布到 Amazon SNS 主題444455556666。政策會使用 aws:PrincipalOrgID 全域條件金鑰來檢查組織 ID 值。

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "myOrgId" } } } ] }

允許任何 CloudWatch 警示發佈至不同帳戶中的主題

在這種情況下,帳戶中的任何 CloudWatch 警報111122223333都可以發佈到帳戶中的 Amazon SNS 主題444455556666

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:*" } } } ] }

限制僅從特定VPC端點發佈到 Amazon SNS 主題

在此情況下,帳戶 444455556666 中的主題只能從具有識別碼的端點發佈。VPC vpce-1ab2c34d

{ "Statement": [{ "Effect": "Deny", "Principal": "*", "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1ab2c34d" } } }] }