つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

最適な認証基盤を構築する (市場調査編)

   

仕事で認証を刷新する必要が出たため、色々と調査しました。この記事ではその結果を共有しようと思います。

TL;DR

  • 必要とする機能が多く、高額利用料を支払える場合、Auth0, OneLogin, GMOトラストログインなどのIDaaS
  • 必要とする機能が少なく、多少の利用料が払える場合、Firebase Authentication, Amazon CognitoなどのIDaaS
  • 上記以外、自前実装
  • 何を選択するかはケースバイケース

IDaaS

IDaaSは認証やID管理をサービスとして提供するものです。SaaS登場前の時代は各社認証の何かしらのライブラリやFWを利用して、自前で実装を行い認証を提供してきました。

認証周りは難しいため、独自実装を行うと事故に繋がりやすいです。例えばパスワードをDBに生の状態で保存してしまうことで、パスワードの漏洩が発生してしまったり、hashアルゴリズムやストレッチの有無の問題で簡単に認証を突破されてしまい、不正ログインが発生するなど。

ID/PASSのログインに加えて多要素認証やソーシャルログインなども加わってきた場合、バグや脆弱性防いで実装することはさらに困難になります。

そのため、認証をサービス化したものが出てきており、近年流行ってきています。

IDaaSについては以下の記事を参考にすると良いかもしれません。

https://trustlogin.com/idaas/

https://www.okta.com/jp/identity-101/idaas/

IDaaS最大手のAuth0

IDaaSの最大手はAuth0です。

https://auth0.com/jp

Oktaが買収しており、現在はOkta内の1製品として売り出されています。

そのOktaが出しているレポートですが、

https://www.okta.com/jp/resources/analyst-research-the-forrester-wave-identity-as-a-service-for-enterprise-q3-2021

業界的にはTopのプレイヤーとなっています。実際に知り合いなど私の観測範囲で評判も良いです。

が、残念ながらかなりの高額なので、導入できる企業はごく一部です。

https://auth0.com/jp/pricing

例えばB2C Essentials 5000MAUプランの場合、$114/moです。MAUあたり$0.0288です。

ただ、これにはProMFAという機能(ソーシャルアカウントでのログイン)が含まれていないです。例えば自分がB2Cサービスを展開していた場合はかなりの高確率でGoogleやAppleのアカウントでのログインをサポートすることになります。

その場合は、B2C Professional 5000MAUプランで、$1000/moです。MAUあたり$0.2です。

サービスによってはこれでも良いかもしれませんが、Google AuthenticatorやSMSなどによる多要素認証(MFA)を導入したい場合などはまた話が変わってきます。

その場合はEnterpriseプランが必要で、Enterprise MFAという機能が必要なようでした。他にもSAML連携などいろいろな機能がありますが、必要なものだけを選んだ独自のプラン・料金体系となるようです。機能を盛れば盛るほど高くなります。

Oktaの営業いわく、安くても月あたり100万円からの契約となるそうです。実際にどの程度の金額になるかは見積もっていませんし、NDA締結後しか見積もりできないようなので、おそらく価格については世の中には情報が出回っていませんが、とにかく高いことは分かりました。

日本製のIDaaS GMOトラストログイン

https://trustlogin.com/price/

GMOのIDaaSですが、こちらは全機能プランがMAUあたり300円/moです。

おそらくAuth0のEnterpriseプランより安いのでしょうが、それでも300円は高い印象がありますね。

自社サービスの特性次第ではありますが・・・。

例えばMoneyforward MEという家計簿アプリがありますが、これは月額500円のサブスクです。1月以内にログインしない人なども居るでしょうし、仮に全体ユーザのうち20%がアクティブユーザーだと仮定し、そのアクティブユーザーは全員サブスク加入しているとします。その場合、一人あたり0.2MAUと考えることができるため、300(円) * 0.2 (MAU) = 60 (円)となり、加入者一人あたりのIDaaSの料金は60円となります。

500円の売上のうち60円のコストをIDaaSに支払うことになります。これは売上のうち12%です。

これが許容できる場合はIDaaSを使えばよいし、許容できない場合は別の選択肢を探す必要が出ます。

少し安いIDaaS Firebase Authentication, Amazon Cognito

https://cloud.google.com/identity-platform/pricing?hl=ja

https://aws.amazon.com/jp/cognito/pricing/

Firebase AuthenticationとAmazon Cognitoは前述のIDaaSと同じくIDaaSではありますが、大幅に価格が安くなっています。

ただし、その分機能が少なかったり、実装量が多くなります。例えばAuth0ではFIDO2による生体認証を簡単に追加することができますが、これら2つのサービスでは簡単には追加できません。カスタム認証フローというような仕組みを使った独自の実装が求められます。

他にもFirebase AuthenticationはMFA機能はあるが、現時点ではSMSのみで、OTPは対応していない、などの制約もあります。

金額ですが、例えばFirebaseで5000MAUでMFAを必要としている場合、基本的には無料枠で済みますが、SMSの1認証あたり$0.06の追加コストが発生します。仮に5000MAU全てがMFAを有効にしており、セッション時間を30日として、1ヶ月あたり5000回のSMS認証が発生すると仮定します。その場合、5000 * 0.06 = $300/mo となります。

Cognitoの場合MFAでの追加コストは発生しないようですし、無料枠もありますが、高度なセキュリティオプションを有効化する場合は追加コストが発生します。例えばパスワードリスト攻撃などを防ぐためにこのオプションを有効化し、5000MAUの場合、$250/moとなります。

自前実装

私は仕事ではRuby on Railsを利用していますが、Ruby界隈では例えば

https://github.com/mdp/rotp

このようなTOTPを可能にするライブラリが存在します。TOTPは今日では一般的ですし、おそらくほとんどの言語でこのようなライブラリは存在するかと思います。

場合によっては自前で実装することがベストであると結論付けるチームもあるかもしれません。そのような場合はIDaaSよりも高リスクであり開発コストもかさむ一方、自由度が高くランニングコストが安いというメリットを受けられるかもしれません。

コスト比較

共通の前提条件

  • 5年間(60ヶ月)サービスが継続し、同じ認証基盤を使い続けるものとする
  • エンジニアの1人月を80万円とする
  • ボリュームディスカウントが存在することを想定した予想される金額を利用する
  • $1あたり130円とする
  • Cognitoはアドバンスドセキュリティを有効化する。またフェデーレーションログインの割合は50%とする

B2Cサービスの場合

前提条件

  • 高度な機能を必要としない。ID/PASSによる認証とソーシャルアカウントによる認証のみ必要
  • ユーザー数 500,000
  • MAU 50,000 (ユーザー数の10%)
  • 有料プラン加入者数 10,000 (MAUの20%)
サービスIDaaS料金/月 (a)初期開発人月 (b)合計 (a * 60ヶ月 + b * 80万円)
Auth0 (B2C Professional)$45001¥35,900,000
GMOトラストログイン¥10,000,0001¥600,800,000
Firebase Authentication02¥1,600,000
Amazon Cognito$28742¥24,017,200
自前実装02 + 2¥3,200,000

※FirebaseとCognitoはIDaaSとはいえ、Auth0などと比較して実装量は多くなる傾向にあるようなので2人月とする
※自前実装は初期開発以外に保守がそれなりに発生するため2を上乗せ

B2Bサービスの場合

前提条件

  • 高度な機能を必要とする。ID/PASSによる認証、ソーシャルアカウントによる認証、MFA
  • ユーザー数 20,000
  • MAU 5,000 (ユーザー数の25%)
  • 有料プラン加入者数 2,500 (MAUの50%)
サービスIDaaS料金/月 (a)初期開発人月 (b)合計 (a * 60ヶ月 + b * 80万円)
Auth0 (Enterprise)$75001¥59,300,000
GMOトラストログイン¥1,500,0001¥600,800,000
Firebase Authentication$3002¥3,940,000
Amazon Cognito$2862¥3,830,800
自前実装03 + 2¥4,000,000

※FirebaseとCognitoはIDaaSとはいえ、Auth0などと比較して実装量は多くなる傾向にあるようなので2人月とする
※自前実装は初期開発以外に保守がそれなりに発生するため2を上乗せ

その他

上記のコストの試算では実際に問題が発生した場合の考慮がなされていません。何らかのセキュリティ事故が発生する確率は自前実装よりもIDaaSの方が低いと予想できます。その確率も実装量が多いFirebaseやCognitoよりもAuth0の方が低いと予想できます。

実際に事故が起きたときの損失はサービスの特性やユーザ数や上場の有無などいろいろな要因によって変わってくるため、試算が難しいです。

結局全てはケースバイケースなので、認証基盤の導入時には自社サービスの特性や要件をよく確認する必要があると思います。また、どのサービスを利用しようが結局は導入するエンジニアの知識が足りていなければセキュリティホールができやすいため、何らかの対策が必要です。例えば、コンサルティングに依頼する、第三者による脆弱性診断を十分に実施する、認証に詳しいエンジニアを確保し、アサインするなど。

私の選択

私はまだ現時点で仕事で利用する認証基盤を決定していませんが、おそらくAmazon Cognitoにする可能性が高いです。

本当はAuth0を利用したいところですが、絶対にペイしないと断言できるし、おそらく社長の稟議も通りません。

Firebaseも良いのですが、MFAはSMSしか無く、ここが致命的だと思いました。メールやTOTP方式もほしいところです。おそらくこれは後1, 2年もすれば追加されるとは思いますが。

CognitoであればTOTPは可能ですし、アドバンスドセキュリティのおかげで自前で実装する機能をいくつか省けます。これらはFirebaseにはありません。

既にある認証基盤をCognitoやFirebaseに移行させる場合、既存のユーザーテーブルの情報をユーザープールにまとめてimportする必要があります。この時、パスワードはimportすることができません。Cognito側でサポートされていないし、パスワードは生の状態でテーブルに保存されていないためです。そのため、全てのユーザにパスワードの再設定を求めることになります。

自前実装の認証基盤にMFAを足す、などの場合、Cognito移行などと比較してパスワードのリセットは発生しないため、この点は良いですね。既存の認証で既にTOTPを実装している場合でCognitoに移行する場合も同様にTOTPの設定は移行できません。

このような移行の痛みもあるため、自前実装もありではありますが、脆弱性を防ぎつつ実装する自信はありませんし、そのあたりのリスクも考慮するとIDaaSを利用したいところです。

いまのところ、仕事ではAWSを利用していますし、同じAWS製品に乗っかりたいという考えなどもあり、Cognitoで行こうかと考えています。

 - 未分類