Auth0でGWSアカウントとEmail/Passwordアカウントをセキュアに共存させる【後編】

 Email/PasswordユーザーにMFAを強制する


Googleアカウントを利用したソーシャルコネクションで、GWSユーザーに絞ったアクセスとすることで、GWSユーザーのセキュリティレベルは組織におけるGWSアカウントの運用ポリシーまで高まったと言えます。
一方でこのままだとAuth0のデータベース上のEmail/Passwordユーザーのセキュリティレベルが低いままとなってしまいます。アカウントの使い回しも容易となってしまい、インシデント発生時の原因究明にも時間がかかることが想定されます。
このAuth0のテナント全体でMFAを有効化することは簡単ですが、GWSユーザーにとっては煩雑な作業となってしまいます。

そこで今回はAuth0のActionsを用いて、Email/PasswordユーザーにのみMFAを有効化する方法を紹介します。
かつてはRuleとHooksを使う方法が多く使われていたようですが、これらは2024年にEOLを迎えるため現在は推奨されていません。

MFAの設定

Phone Messageの設定

MFAの方法にはAuth0のプランによって様々なオプションが提供されていますが、今回はSMSによる認証の設定例を紹介します。
Auth0の管理画面で「Security」→「Multi-factor Auth」→「Phone Message」を選択し、SMSの設定画面に入ります。

Choose a delivery providerは今回はSMSのメッセージの送信にAWSのSNSを利用しますのでCustomを選択します。

続いて②のDefine policiesはNeverにしておきます。
これをAlwaysにすると問答無用でMFAが行われてしまい、GWSユーザーにもMFAが必須となってしまいます。

Phone Message Actionのカスタムプロバイダの設定

続いて、メッセージを送信するためのカスタムプロバイダの設定を行います。
様々なプロバイダに対応していますが、今回はAWSのAmazon SNSを利用します。
事前にAWS側ではSNSの送信設定や、SNSへのアクセスロールを与えられたIAMユーザーを作成しておく必要があります。今回はその手順については割愛します。

Auth0で「Actions」→「Library」と進み、Add Actionをクリックします。
画面の指示に従って進み、
AWS Region, AWS Access Key ID, AWS Secret Access Key
を入力するだけで設定は完了します。簡単で感動します。

Send Phone Message Flowの設定

続いて、このLibraryをFlowに組み込みます。
「Actions」→「Flows」→「Send Phone Message」
と進みます。Phone Messageの送信だけで1つのFlowが作られています。

先ほど設定したActionが右側に現れていますので、これをドラッグアンドドロップでStartとCompleteの間に持っていくだけです。こちらも簡単です。

これでAmazon SNSを使ってPhone Messageを送信する準備は整いました。

ログイン時にMFAを実行する

それではGWSアカウントを用いたログインの場合はそのままログイン、Email/Passwordユーザーの場合はMFAを実行する、という場合分けを伴う挙動をActionsを用いて実現します。

Custom Actionの作成

ユーザーの属性によってMFAを行うActionを作成する
先ほどと同様に「Actions」→「Library」と進み、今回は「Build Custom」を選択します。
Nameは適当に、Triggerは「Login/Post Login」、Runtimeは推奨されているようなので「Node18」にしておきましょう。

ログインイベントのevent.connection.nameを使って場合分けします。
サンプルのコードを以下のように編集してみます。
exports.onExecutePostLogin = async (event, api) => {
    if(event.connection.name==='google-oauth2'){
    	return;
    }
    api.multifactor.enable("any", {"allowRememberBrowser": false});
    return;
};


event.connection.nameがgoogle-oauth2の場合は、GWSアカウントを使ってのログインなので、そのままログインプロセスを続行させます。
一方で、Auth0のDBにあるユーザー(Username-Password-Authentication)の場合は、MFAを必要とします。
このユーザーに対しては、api.multifactor.enableを用いてMFAを実行します。
allowRememberBrowser: false
はオプションですが、これによって常にMFAを求めます。ブラウザのCookieなどに認証情報が保存されることを防ぎますので、特に共用PCなどの使用が考えられる放送局の制作現場には必要な設定だと思われます。

Login Flowの設定
それではこれをログイン時に実行されるようにしましょう。
先ほどと同様に、このLibraryをFlowに組み込みます。
「Actions」→「Flows」→「Login」と進み、今度は自分で作ったActionがCustomタブの中にあるので、それをStartとCompleteの間に入れましょう。


これによってログイン時にユーザーによってMFAの実行を場合分けする設定が完成しました!
一方でPhone Messageを利用したMFAはコスト面でなかなか負担は大きく、できればGoogle Authenticatorなどのワンタイムパスワードを用いたMFAにシフトしたいところ。
これらの設定についても機会があれば記事にしてみようと思います!


Next Post Previous Post