[アップデート] RCP が Cognito と CloudWatch Logs もサポートするようになりました
いわさです。
AWS Organizations を使うとき、ポリシーを適用して組織全体に様々な制限を適用することができます。
よく使われるのは SCP(サービスコントロールポリシー)だと思いますが、RCP(リソースコントロールポリシー)というものもあります。
組織内の IAM 権限にガードレールを設定したい時は SCP が有効ですが、組織外の ID や認証情報を必要としないパブリックな API の場合は SCP だとコントロールすることが出来ません。
そういった時は RCP が有効なのですが、この RCP はサポートされているリソースタイプがまだ少なく、主にリソースベースポリシーでパブリックアクセスやクロスアカウントアクセスを許可できる S3 や SQS などを中心にサポートされていました。
RCPs apply to actions for the following AWS services:[1]
- Amazon S3
- AWS Security Token Service
- AWS Key Management Service
- Amazon SQS
- AWS Secrets Manager
- Amazon Elastic Container Registry
- Amazon OpenSearch Serverless
先日のアップデートでここに CloudWatch Logs と Congito が追加されました。
あまり RCP をしっかり触ったことがなかったので、試してみることにしました。
ユースケースを考える
たしか Cognito はクロスアカウントアクセスがそもそもなくてリソースベースポリシーの設定機能もないんですよね。
また、CloudWatch Logs はリソースベースポリシーが API 経由で設定できるのですが、直接クロスアカウントで PutLogEvents で送信するためのものでもありません。
ちょっと思いついたのは Cognito はクライアントから認証を行う関係で IAM トークンを必要としないパブリックな API がいくつかあります。
ユーザープールによってはそれらの API 利用を禁止して Admin API のみ使わせたいとかはあり得るかもしれません。(いや、ないか?)
まぁとりあえずそれを実現してみましょう。
まずは SCP でそれが出来るのか試してみます。
次のように SCP を作成して OU にアタッチしました。InitiateAuthを禁止してみるか。

しかし、試してみると次のように API の実行は出来ていそうですね。パラメータが正しくなくてエラーにはなっていますが。この API は認証情報不要で叩けるので SCP を適用する対象(IAM ユーザーとか)がスコープ内にないんですよね。
% aws cognito-idp initiate-auth --cli-input-json file://hoge.json
An error occurred (InvalidParameterException) when calling the InitiateAuth operation: Request does not contain valid parameters
RCP(リソースコントロールポリシー)で制御してみる
今度はこれを RCP でコントロールしてみます。
RCP のポリシー作成画面を見てみると、Cognito と CloudWatch Logs がビルダー上選択できるようになっていますね。Cognito は IDプールとユーザープールどちらもサポートされているみたいです。

次のように RCP を作成して OU にアタッチしましょう。

先程と同じようにパブリック API を使おうとすると今度は次のように権限的なエラーを確認することが出来ました。
% aws cognito-idp initiate-auth --cli-input-json file://hoge.json
An error occurred (AccessDeniedException) when calling the InitiateAuth operation: User: anonymous is not authorized to perform: cognito-idp:InitiateAuth on resource: arn:aws:cognito-idp:ap-northeast-1:123456789012:userpool/ap-northeast-1_xZnXXuBoj with an explicit deny in a resource control policy
うまく RCP を使ってアカウント内の IAM 権限にとどまらず制限することが出来ていますね。
さいごに
本日は RCP が Cognito と CloudWatch Logs もサポートするようになったので、Cognito で使ってみました。
正直このアップデートで私がこれをやりたかったーみたいなケースが思いつかないのですが、CloudWatch Logs は利用を組織内アカウントのリソースに連携を制限するとかは出来るのかもしれないです。
Cognito はやはりパブリックアクセスくらいだろうか?
Cognito があまり複雑な条件キーをサポートしていないので、単純な検証になりましたが、AUTH_FLOW でポリシー制御するとか出来ると、特定条件の時は組織内でのみ API を実行させるとか出来るのでおもしろいかもしれません。






