Amazon Connectは顧客との通話を取り扱う機能です。
通話記録には顧客の電話番号や入力内容が含まれますし、CRM等とデータ統合している場合は企業名・氏名等の情報も問い合わせ属性やログに含まれるケースもありますね。
これらは機密レベルの高い情報であり、同じ企業内であっても、特定部門や担当メンバーのみアクセスできるよう権限分離できるよう要求されることも多いのではないでしょうか。
Amazon Connect管理者がAWSマネジメントコンソールへアクセスする、というケースに適したポリシーを検討してみたいと思います。
準備
許可・制限するためのリソース情報を収集します。
Amazon Connect インスタンスARN
arn:aws:connect:ap-northeast-1:123456789012:instance/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
といった書式の文字列です。
対象となるAmazon Connectインスタンスの概要ページに表示されますのでコピーしておきます。
CloudWatch Logs ロググループ名
Amazon Connectでは、問い合わせフローの動作ログをCloudWatch Logへ出力することができます。
(フローの挙動調査などにとても役立ちますので、ログ出力をおすすめします)
管理者であればログアクセスは必要となりますので、ロググループ名を確認しておきます。
通常はインスタンス作成時に指定したインスタンスエイリアス名を含む、 aws/connect/<instance-alias>
といった書式の文字列になります。
対象となるAmazon Connectインスタンスの問い合わせフローページ→問い合わせフローログセクションを確認します。
通話記録などを保存するS3バケット名
通話記録(音声ファイル)、Contact Lensの分析結果ファイルを参照する場合はS3バケット名もコピーしておきます。
対象となるAmazon Connectインスタンスのデータストレージ→通話記録セクションを確認します。
サービスロール名
Amazon Connectインスタンスの設定変更をするために必要です。
対象となるAmazon Connectインスタンスの概要ページ→Distribution settings→Service-linked role のコピー機能を使用してコピーしておきます。
ポリシーテンプレート
環境によって各要素を書き換えて使用します。
書き換える要素 | 内容 | 例 |
---|---|---|
region | Connnectインスタンスリージョン | ap-northeast-1 |
aws_account_id | AWSアカウントID | 123456789012 |
connect_instance_id | ConnectインスタンスID | aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee |
instance_alias | Connectインスタンスエイリアス(CloudWatch Logsのロググループ名の一部) | |
bucket_name | 通話記録などを保存しているS3バケット名 | |
service_link_role_name | Connectサービスリンクロール名 | AWSServiceRoleForAmazonConnect_abcdefg |
※ region
, aws_account id
, connect_instance_id
は準備セクションでコピーしたConnectインスタンスARNに含まれる値です
※ instance_alias
は同様にCloudWatch Logs ロググループ名に含まれる値です
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Connect", "Effect": "Allow", "Action": [ "connect:*" ], "Resource": [ "arn:aws:connect:<region>:<aws_account_id>:instance/<connect_instance_id>", "arn:aws:connect:<region>:<aws_account_id>:instance/<connect_instance_id>/*" ] }, { "Sid": "CloudWatchLogs", "Effect": "Allow", "Action": [ "logs:Describe*", "logs:Get*", "logs:CreateLogGroup" ], "Resource": [ "arn:aws:logs:*:*:log-group:/aws/connect/<instance_alias>:*" ] }, { "Sid": "S3", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::<bucket_name>", "arn:aws:s3:::<bucket_name>/*" ] }, { "Sid": "Iam", "Effect": "Allow", "Action": "iam:PutRolePolicy", "Resource": "arn:aws:iam::<aws_account_id>:role/aws-service-role/connect.amazonaws.com/<service_link_role_name>" }, { "Sid": "LambdaAssociate", "Effect": "Allow", "Action": "lambda:AddPermission", "Resource": "arn:aws:lambda:<region>:<aws_account_id>:function:*" }, { "Sid": "LexBotAssociate", "Effect": "Allow", "Action": [ "lex:DescribeBotAlias", "lex:CreateResourcePolicy", "lex:UpdateResourcePolicy" ], "Resource": "arn:aws:lex:<region>:<aws_account_id>:bot-alias/*/*" }, { "Sid": "Profile", "Effect": "Allow", "Action": [ "profile:AddProfileKey", "profile:CreateDomain", "profile:CreateProfile", "profile:DeleteDomain", "profile:DeleteIntegration", "profile:DeleteProfile", "profile:DeleteProfileKey", "profile:DeleteProfileObject", "profile:DeleteProfileObjectType", "profile:GetIntegration", "profile:GetMatches", "profile:GetProfileObjectType", "profile:ListIntegrations", "profile:ListProfileObjects", "profile:ListProfileObjectTypes", "profile:ListTagsForResource", "profile:MergeProfiles", "profile:PutIntegration", "profile:PutProfileObject", "profile:PutProfileObjectType", "profile:SearchProfiles", "profile:TagResource", "profile:UntagResource", "profile:UpdateDomain", "profile:UpdateProfile" ], "Resource": "arn:aws:profile:*:*:domains/amazon-connect-*" }, { "Sid": "AllowAnyResource", "Effect": "Allow", "Action": [ "connect:ListInstances", "profile:ListAccountIntegrations", "profile:GetDomain", "profile:ListDomains", "profile:GetProfileObjectType", "profile:ListProfileObjectTypeTemplates", "ds:CreateAlias", "ds:AuthorizeApplication", "ds:CreateIdentityPoolDirectory", "ds:DeleteDirectory", "ds:DescribeDirectories", "ds:UnauthorizeApplication", "ds:CheckAlias", "firehose:DescribeDeliveryStream", "firehose:ListDeliveryStreams", "kinesis:DescribeStream", "kinesis:ListStreams", "kms:Describe*", "kms:List*", "kms:Get*", "kms:Decrypt", "lex:GetBots", "lex:ListBots", "lex:ListBotAliases", "s3:GetBucketLocation", "s3:ListAllMyBuckets", "lambda:ListFunctions", "voiceid:Describe*", "voiceid:List*", "logs:DescribeLogGroups" ], "Resource": "*" }, { "Sid": "ReadServiceQuotas", "Effect": "Allow", "Action": [ "servicequotas:List*", "servicequotas:Get*", "cloudwatch:GetMetricData" ], "Resource": "*" }, { "Sid": "ServiceQuotas", "Effect": "Allow", "Action": [ "servicequotas:RequestServiceQuotaIncrease" ], "Resource": "arn:aws:servicequotas:*:*:connect/*" } ] }
※ gist でも公開しています
IAMユーザー
上記で用意したポリシーにてIAMポリシーを作成し、IAMユーザーへアタッチします。
IAMユーザーはAWSマネジメントコンソールへパスワードでログインできるよう設定しました。
確認
AWSマネジメントコンソールへアクセスし、操作確認してみます。
Amazon Connect操作の確認
全てのインスタンスのリスト・概要ページを参照することができます。
Amazon Connect: 対象インスタンス
アクセスを許可したインスタンスについては、各設定の参照、および、設定・変更操作が許可されます。
- データストレージ
- データストリーミング
- 問い合わせフロー
- 分析ツール
- 承認済みオリジン
- タスク
- Wisdom
- Voice ID
また、緊急アクセスリンクからConnect管理画面へアクセス可能です。
Amazon Connect: 対象外インスタンス
アクセスを許可していないインスタンスの設定ページへアクセスすると、情報確認できません。
各種設定・変更操作も禁止されます。
また、緊急アクセスリンクからのConnect管理画面アクセスも不可となります。
(エラーページ表示となります)
CloudWatch Logs操作の確認
全てのロググループリストを参照することができます。
対象インスタンスのフローログ
対象インスタンスのロググループについては、ログイベント内容まで参照可能です。
対象インスタンス以外のログ
対象インスタンスのロググループ以外については、ログイベントのリスト・内容ともに参照できません。
S3バケット操作の確認
全てのバケットリストを参照することができます。
許可バケット内のオブジェクト
許可したバケット内の通話記録音声ファイルへアクセスすることができます。
許可バケット以外のオブジェクト
許可していないバケットについてはアクセスできません。
サービスクオータ操作の確認
全てのサービスクオータリスト参照が可能です。
緩和リクエスト操作については、Amazon Connectについてのみ、可能です。
最後に
利用するAWSサービスやシステム構成、役割によってポリシーによる制限は変わってくると思います。
実際の現場では追加・削除が必要になると思いますが、IAMポリシー作成時の参考になれば幸いです。