はじめに
2024年、3/12 リリース(ver.1.4.2.0)にて、当社でTOTP(Time-based One-Time Password)認証機能を実装いたしました。今更ではありますが、簡単に機能のご紹介をさせていただこうと思います。
TOTPとは?
TOTPはワンタイムパスワードの一種で、最初にサービス側とユーザ側の専用のアプリなどで暗号生成用のコードを共有しておき、そのコードを元に時間から共通のコードを生成し、認証します。
代表的なアプリにはGoole Authenticatorや、Microsoft. Authenticatorがあります。
何のために追加したか
プリザンター旧来の2段階認証では、メール認証しか使えませんでした。
これはネットワークに繋がっていないローカル環境などでは使用できません。対してTOTPでは、認証に別のアプリかデバイスが必要になりますが、性質上通信を必要としないため、多くの環境で利用することができます。
また、TOTPではワンタイムパスワードの発行に通信が発生しないため、(生成用のコードが漏洩しない限り)通信の傍受などで盗み取られる危険性は低くなります。
最近ではTOTP認証を採用しているサービスも多いので、ユーザーにとってもなじみがあり、導入もしやすいのではないかと思います。
実装について
Totpが有効化されている場合は既存の2段階認証と分岐する形で、MIT Licenseで公開されているOtp.NETプラグインを利用して認証するように実装いたしました。
使い方と各種パラメータ
有効化手順
- Security.jsonのSecondaryAuthenticationパラメータを以下の通り変更
- ModeをDefaultEnableに設定
- NotificationTypeをTotpに設定
"SecondaryAuthentication": {
"Mode": "DefaultEnable",
"NotificationType": "Totp",
"CountTolerances": 1,
"NotificationMailBcc": false,
"AuthenticationCodeCharacterType": "Number",
"AuthenticationCodeLength": 8,
"AuthenticationCodeExpirationPeriod": 300
},
初回登録
- TOTP有効化後の初回ログイン時に表示されるQRコードを読み取り、認証アプリに登録する
- 表示されるコードを入力してログインする
- 初回は認証アプリに登録後、ログインするとコードが登録されます
- ログインせずアプリに登録だけ行った場合、暗号コードが保存されないため再度登録し直す必要があります
登録解除(コードリセット)
- ユーザ管理から、解除したいユーザの「秘密鍵有効」チェックを外す
- 現在登録されている暗号コードが無効化され、再度初回登録画面が表示されるようになります
変更できるオプション
- 上記パラメータのCountTolerancesを変更すると、指定した回数分古いコードで認証できるようになります
- デフォルトの1では、現在表示されているパスワードと1つ前のパスワードでログインができます
- たとえば2に設定すると、現在表示されているパスワードから2つ前までのパスワードログインできるようになります
- 0に設定した場合、現在表示されているパスワードのみでログインできます
まとめ
2段階認証にTotpを追加したことで、手軽にセキュリティの強化ができるようになりました。
Githubなどにも採用されている認証方法なので、普段から利用されている方は特に始めやすく、ローカルでご利用の方や個人など、どのような環境でも使いやすくなっていると思いますので、ぜひ使ってみて頂きたいと思います。