Ateam Finergy Inc.× Ateam CommerceTech Inc.× Ateam Wellness Inc. Advent Calendar 2022の23日目はエイチームコマーステック(以下コマーステック)の@shimura_atsushiが担当します。
最初に
本稿はAmazon Connect導入に必要な手続き(電話番号取得 etc)についての紹介はいたしません.
コマーステックの展開する自転車ECサービスであるcymaでは資格を持った整備士が整備した自転車を購入でき自宅まで配送してくれるサービスです。
cymaではお客様が訪問して自転車を選ぶサイトの他にバックヤード業務を行う管理画面がありcymaのエンジニアが保守運用をしています。
この管理画面はcymaのスタッフの他に取引先企業の担当者の方へ機能を開放しています、今回は取引先向けに実装したAmazon Connect
を利用した多要素認証導入への取り組みを紹介します。
なぜAmazon Connect?
多要素認証というとEmailやSMSなどでワンタイムパスワードを発行する仕組みが一般的だと思います。
認証にcymaが認めた固定電話番号を必須とし、オフィスの外から管理画面へのアクセスを遮断し、セキュリティを向上させるため、Amazon Connectを用いることにしました。
Emailの環境などITインフラがなくても大抵の企業に固定電話はあるためコンタクトセンターのサービスであるAamazon Connectへコールすることで電話口からワンタイムパスワードを通知するようにします。
ワンタイムパスワードの発行
Amazon Connectはインスタンスを作成して起動するとコンタクトフローが組めるようになります。
以下のイメージはその様子ですが各処理を表す図を組み合わせることで架電後のフローを設定することができます。
静的な文言を自動音声で喋らせることができますが架電毎に動的にしたいワンタイムパスワードは架電直後に稼働するAWS Lambdaで生成しています。
音声の調整
生成したワンタイムパスワードは自動音声で通知することができますが例えば4桁の数字をそのままワンタイムパスワードに使うとそれぞれの桁の発生の間隔が狭く聞き取りにくいなってしまいます。
Amazon Pollyを用いて音声の調整しています、下記AWSのドキュメントを参照して試してみてください。
ワンタイムパスワードの確保と有効期限の設定
ユーザへAmazon Connectを介してワンタイムパスワードを通知するのと同時にどんなワンタイムパスワードを発行したかを確保して置く必要があります、そのためにDynamoDBを用います。
Amazon Connectは架電番号を取得することができるのでワンタイムパスワードと紐付けて架電番号を保存しておくことでどのユーザにどのワンタイムパスワードを発行したかを関連付けすることができます。
また各レコードへTTLを設定することでワンタイムパスワードの寿命を設定することができます、UNIX時間のカラムを作成してTTLに指定することでDynamoDBがその時間にレコードを削除してくれます、これで簡単にワンタイムパスワードの有効期限を設定することが可能です。
最後に
Amazon Connectを用いて電話を用いて多要素認証の実装を紹介しました。
アプリケーション側で発行されたワンタイムパスワードを用いたログイン認証を構築する時、アカウントに電話番号を関連付けて固定電話番号の制約をつけることでその固定電話番号がある場所にアプリケーションを利用する位置的な制限を設けることも可能です。
Amazon Connectで用いる電話番号の取得は少し手続きが面倒ですがコンタクトフローの作成は簡単でAWS Lambdaなどと連携されることでより複雑な処理もできると思います。
ただAmazon Connectのコンタクトフローはコード化やコンタクトフローのコピーができないので本番/開発で環境分けたい時は目視によるコピー&ペーストが必要な点が大きなデメリットです。
もしEmailなどを用いた多要素認証が導入できないような環境に直面しましたらAmazon Connectを用いたワンタイムパスワード発行を試してみてはいかがでしょう、本稿がそういった方々の助けになれば嬉しい限りです。