Amazon SNS存取控制的範例案例 - Amazon Simple Notification Service

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

Amazon SNS存取控制的範例案例

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

授予對主題的 AWS 帳戶 存取權

假設您在 Amazon 中有一個主題SNS,而且您想要允許一或多個 AWS 帳戶 對該主題執行特定動作,例如發佈訊息。您可以使用 Amazon SNSAPI動作 來完成此操作AddPermission

AddPermission動作可讓您指定主題、 清單 AWS 帳戶 IDs、動作清單和標籤。SNS 然後,Amazon 會自動產生新的政策陳述式,並將其新增至主題的存取控制政策。您不需要自行撰寫政策陳述式,Amazon 會為您SNS處理。如果您稍後需要移除政策,您可以呼叫RemovePermission並提供您在新增許可時使用的標籤來移除政策。

例如,如果您AddPermission呼叫 arn:aws:sns:us-east-2:444455556666:MyTopic,請指定 AWS 帳戶 ID 1111-2222-3333、 Publish 動作和標籤 grant-1234-publish,Amazon SNS將產生下列政策陳述式,並將其插入主題的存取控制政策:

{ "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 SQS政策的範例,該政策授予 Amazon 將訊息傳送至佇列的SNS許可。請注意,此政策與 Amazon SQS佇列相關聯,而不是與 Amazon SNS主題相關聯。指定的動作是 Amazon SQS動作,資源是佇列的 Amazon Resource Name (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:aws:sns:us-east-2:444455556666:MyTopic) 傳送至佇列。

其他資訊:

  • 佇列 ARN。請確定您使用 GetQueueAttributes動作擷取ARN正確的 Amazon SQS佇列。這對於設定正確的許可ARN至關重要。

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

  • Amazon 中的預設政策SNS。與某些誤解相反,Amazon SNS不會自動授予允許其他 AWS 服務 存取新建立主題的預設政策。您必須明確定義和連接政策,以控制對 Amazon SNS主題的存取。

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

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

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

以下是您可以設定的方式:

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

    以下為政策的範例:

    { "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 SNS主題的 AWS 帳戶 ID。

    • 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 Gateway

    • Amazon CloudWatch

    • Amazon DevOpsGuru

    • Amazon EventBridge

    • Amazon GameLift

    • Amazon Pinpoint SMS和 Voice 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 帳戶、開啟 Amazon SES並建立電子郵件。若要將有關此電子郵件的通知發佈到 444455556666 帳戶擁有的 Amazon SNS主題,您需要建立如下所示的政策。若要這麼做,您需要提供有關主體 (其他服務) 和每個資源擁有權的資訊。Resource 陳述式提供主題 ARN,其中包含主題擁有者的帳戶 ID,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 Gateway

  • Amazon CloudWatch

  • Amazon DevOpsGuru

  • Amazon GameLift

  • Amazon Pinpoint SMS和 Voice 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 中的主題只允許從 ID 為 的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" } } }] }