【Amazon Connect】特定インスタンス管理者用のポリシーを作成

記事タイトルとURLをコピーする

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ポリシー作成時の参考になれば幸いです。