Amazon SNSでABACできるようになったのでためしてみた

2022.01.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日、Amazon SNSでABAC(属性・タグベースのアクセス制御)が利用できるようになりました。

SNSでのABACは今まで試したことが無かったので今日は試してみたいと思います。
アップデート直後の日本語公式ドキュメントでは以下のようになっていたので出来なかったという仮定でこの記事は書いています。

ABACとは

ABACとは何か、使ったほうが良いのか、あわせて考慮すべきことなどは川原征大さんがまとめられていますのでそちらをご参照ください。
ABACやるなら必読だと思っています。

川原さんによるABAC動画もあります。

AWSにおけるABACの嬉しさ、辛さを語りました #AKIBAAWS | DevelopersIO

設定方法・試してみる

この記事では実際にAmazon SNSでABACを使ってコントロールをしてみたいと思います。
以下の2つを行う必要があります。

  • SNSトピックにタグを付与
  • IAMポリシーでリソースタグによるアクセス許可を設定

SNSトピックへのタグを設定

ここでは開発用と本番用の2つのSNSトピックを作成し、environmentタグにproductiondevelopmentを設定しておきます。
冒頭の川原さんの記事に詳しく記載されていますが、タグ運用を行うためにガードレールやタグエディタもあわせてご利用頂くのが良さそうです。

IAMポリシーを設定

IAMポリシーのConditionでリソースタグに関する条件を設定します。
ここでは、対象IAMユーザーは本番環境用SNSトピックの操作は許可せずに、開発環境用SNSトピックの操作のみを許可することを想定しています。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Deny",
    "Action": [
    "sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:*:*",
    "Condition": {
      "StringEquals": {
        "aws:ResourceTag/environment": "production"
      }
    }
  },
  {
    "Effect": "Allow",
    "Action": [
      "sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:*:*",
    "Condition": {
      "StringEquals": {
        "aws:ResourceTag/environment": "development"
      }
    }
  }]
}

上記のポリシーではsns:Publishを許可・拒否していますが、先日機能追加されたバッチ送信(PublishBatch)もsns:Publishで制御されてますのでその点ご注意ください。

メッセージ発行してみる

設定はここまでで完了です。
それぞれのトピックへメッセージを発行してみます。

iwasa.takahito@hoge ~ % aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:550669467088:prod-topic --message test --profile hoge

An error occurred (AuthorizationError) when calling the Publish operation: User: arn:aws:iam::123456789012:user/hoge is not authorized to perform: SNS:Publish on resource: arn:aws:sns:ap-northeast-1:123456789012:prod-topic with an explicit deny in an identity-based policy
iwasa.takahito@hoge ~ % aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:123456789012:dev-topic --message test --profile hoge
{
    "MessageId": "b10e3f3c-f466-57b1-8e31-656b025d9887"
}

本番用のトピックは拒否され、開発用のトピックはメッセージ送信が出来ました。期待どおりですね。

さいごに

本日はAmazon SNSでABACが使えるようになったので試してみました。
同一アカウント内に複数の環境が混在している場合に環境を分離する際にうまく使えそうです。

一方、今回SNSがサポートされたように、ABACに対応しているサービスとしていないサービスがあるので、ABACだけでどこまでカバーできるかはよく確認が必要ですね。そのあたりも全て川原さんの記事に書かれていますので、ABACを行うのであれば必読です。