# 運用・管理 / 2要素認証

2要素認証（2FA = Two Factor Authentication）は、2つの異なる認証要素を併用することでセキュリティーを高める仕組みです。

## 基本仕様

本製品がサポートする2FAの基本仕様は以下のとおりです。

- 対象機能
  - OpenVPN
- 認証要素
  - 第1要素 - ユーザー名、パスワード（RADIUSサーバーまたはLDAPサーバーを利用）
  - 第2要素 - 認証コード（「Google認証システム」などのモバイルアプリで生成、または電子メールで通知）
- 認証コードは、TOTP（Time-based One-Time Password）またはHOTP（HMAC-based One-Time Password）方式のワンタイムパスワード、電子メールによるワンタイムパスワードをサポート。
- 第1要素（RADIUS/LDAPサーバー）へのユーザー名、パスワード送信は、第2要素（認証コード）の処理後に行われる。
- 2FA有効時、2FA未設定のユーザーにログインを許可するかどうかは設定可能。初期設定ではログイン可（2FA未設定のユーザーは第1要素のみで認証する）
- TOTP/HOTP方式において、認証コード生成に必要な情報（2FAユーザーごとのシークレットキーなど）をモバイルアプリにインポートするためのQRコードをANSI/UTF-8端末画面に出力可能。また、QRコードを生成する外部Webサイトへのリンクを端末画面に表示可能。
- TOTP方式では、管理者があらかじめシークレットキー（パスワード）を生成して各ユーザーに通知するだけでなく、本製品上に用意される専用のWebページからユーザー自身が2FAの利用登録を行うことも可能。
- 2FAユーザー情報（ユーザー名、シークレットキー（TOTP/HOTP）、ワンタイムパスワード方式など）はコンフィグに含まれず、別に管理される。
- 2FAユーザー情報はAMFバックアップの対象となる。
  Note

  AMF機能を有効にしていない環境でも、2FAユーザー情報のバックアップ（エクスポート）は2fa export user-dataコマンドで、復元（インポート）は2fa import user-data sourceコマンドで行えます。詳しくは、「機器交換時のユーザー再登録手順」をご覧ください。
  また保管した2FAユーザー情報を消失した場合は、2fa create userコマンドで新規設定してください。

- 対象機能側で2FAの設定が行われているにもかかわらず、2FAが無効の場合は、第1要素のみで認証を行う。

## 基本設定

2FAを使用するための基本設定は次のとおりです。

### 共通設定

1. 2FA関連の設定は2要素認証サービスが有効になっていないと行えないため、最初に同サービスを有効化します。
   これには service 2faコマンドを使います。

       awplus(config)# service 2fa
       awplus(config)# exit

2. OpenVPNで2FAを使うよう設定します。これにはaaa authentication openvpnコマンドを使います。
   OpenVPNに関するその他の設定は2FAを使わないときと同じです。詳しくは「VPN」/「OpenVPN」をご覧ください。
   - 第1要素としてRADIUSサーバーを使う場合

         awplus# configure terminal
         awplus(config)# aaa authentication openvpn default group radius 2fa

   - 第1要素としてLDAPサーバーを使う場合

         awplus# configure terminal
         awplus(config)# aaa authentication openvpn default group ldap 2fa

   Note

   OpenVPNクライアントにおいて、ユーザー名・パスワードと2FA認証コードを別々に入力できるようにするには、クライアント設定ファイルに次のような設定行が必要です。必要な設定はクライアントの種類によって異なる可能性がありますので、ご使用のクライアントのマニュアルをご参照ください。

       static-challenge "Verification Code:" 1

   なお、使用するOpenVPNクライアントが2FA認証コードの入力に対応していない場合（認証コードの入力欄や入力画面がない場合など）は、aaa authentication openvpnコマンドの 2fa-in-password オプションを使用することで、通常のパスワードの一部として認証コードを受け取ることが可能です。
   この場合、OpenVPNクライアントのパスワード入力欄に `<パスワード><認証コード>` の形式でパスワードと認証コードをまとめて入力します。たとえばパスワードが「paSSxx__」で認証コードが「987654」だった場合、パスワード入力欄には「paSSxx__987654」と入力します。
   - RADIUSサーバーを使う場合

         awplus(config)# aaa authentication openvpn default group radius 2fa 2fa-in-password

   - LDAPサーバーを使う場合

         awplus(config)# aaa authentication openvpn default group ldap 2fa 2fa-in-password

3. 認証コードの生成・通知方式ごとに必要な設定を行います。詳しくは以下の各セクションをご覧ください。
   - TOTP/HOTPを使用する場合
   - 電子メールを使用する場合

2FAを利用するための基本設定は以上です。

### TOTP/HOTPを使用する場合

TOTP/HOTP方式を使用する場合は、ユーザーごとにシークレットキー（パスワード）を生成し、本製品とユーザー（のモバイルアプリ）の間で共有する必要があります。
なお、TOTP方式では2fa create userコマンドでシークレットキーを生成する代わりに、本製品上に用意される専用のWebページからユーザー自身が利用登録を行うこともできます。自己登録用Webページを有効にする方法については、「TOTP方式における自己登録用Webページ」をご覧ください。

1. 管理者によるシークレットキーの生成は特権EXECモードの2fa create userコマンドにより「2FAユーザーの追加」という形で行います。

       awplus# 2fa create user userA random-secret

   TOTP/HOTPでの2FAを利用するユーザーのそれぞれについて、2fa create userコマンドを実行してください。
   Note

   - 2fa create userコマンドで指定するユーザー名は、第1要素（RADIUSサーバーまたはLDAPサーバー）に登録されているOpenVPNユーザー名と同じである必要があります。
   - 2fa create userコマンドを実行すると、認証コードの生成に必要なシークレットキーのほかに、モバイルアプリが利用不可となった場合に備えたバックアップ用の認証コードが5個生成されます。これらの情報は同コマンド実行時に表示されますが、あとからshow 2fa userコマンドで何度でも確認可能です。
   - HOTP方式を使用する場合は、2fa create userコマンドで hotp オプションを指定してください。同オプションを指定しない場合はTOTP方式を使います。

         awplus# 2fa create user userB random-secret hotp

2. 各ユーザーにモバイルアプリ設定のための情報（シークレットキーなど）を提供します。
   - シークレットキーを受け渡すためのQRコードはshow 2fa userコマンドのqrオプションを使って出力します。
     端末画面に表示されたQRコードを安全な方法でユーザーに渡し、モバイルアプリで読み込んでもらってください。

         awplus# show 2fa user userA qr utf8

   - また、モバイル端末やモバイルアプリの障害で認証コードを取得できなくなった場合に備えて、バックアップコードを提供することもできます。
     その場合は、show 2fa userコマンドの「Scratch codes」欄に表示される5つのコードを安全な方法でユーザーに通知してください。

2FAユーザーのバックアップコードを再生成するには2fa reset scratch-codesコマンドにユーザー名を指定します。
同コマンドを実行すると、該当ユーザーの5つのバックアップコードがすべて新しいものに更新され、以前のコードは使用できなくなります。

    awplus# 2fa reset scratch-codes userA

### 電子メールを使用する場合

認証コードを電子メールで通知する場合は、電子メール送信機能の設定を行い、各ユーザーの電子メールアドレスを登録する必要があります。

1. 電子メール送信機能の設定をします。
   詳細は「運用・管理」/「メール送信」をご覧ください。

       awplus(config)# mail from noreply@example.jp
       awplus(config)# mail smtpserver 10.10.10.5
       awplus(config)# mail smtpserver tls starttls
       awplus(config)# mail smtpserver authentication plain username noreply password So0=HeMeTwo

2. 2fa email-otpコマンドを実行し、電子メールで認証コードを送信できるようにします。

       awplus(config)# 2fa email-otp

   Note

   メールサーバーとの暗号化通信（mail smtpserver tlsコマンド）を有効にしていない場合、2fa email-otpコマンドの実行時に警告のメッセージが表示されます。

       % Email OTP has been enabled but the configuration is not secure. Mail configuration is not using TLS

3. 電子メールアドレスの取得方法を設定します。
   - RADIUSサーバーから取得する場合は、2fa radius-email-attributeコマンドで電子メールアドレスが格納されているRADIUS属性を指定します。
     たとえばUser-Name属性に電子メールアドレスが格納されている場合、次のように設定します。
     本設定は第1要素（ユーザー名・パスワード）の認証にRADIUSサーバーを使用している場合のみ有効です。

         awplus(config)# 2fa radius-email-attribute email User-Name

   - LDAPサーバーから取得する場合は、ldap-serverコマンドでLDAPサーバーモードに移動し、email-attributeコマンドで電子メールアドレスが格納されているLDAP属性を指定します。
     たとえばUserCustomData属性に電子メールアドレスが格納されている場合、次のように設定します。
     本設定は第1要素（ユーザー名・パスワード）の認証にLDAPサーバーを使用している場合のみ有効です。

         awplus(config)# ldap-server Server1
         awplus(config-ldap-group)# email-attribute UserCustomData

   - 手動で登録する場合は、2fa create user emailコマンドでユーザーの電子メールアドレスを登録します。
     本設定は第1要素（ユーザー名・パスワード）の認証にRADIUSサーバー、LDAPサーバーのどちらを使用している場合でも有効ですが、同コマンドで指定したユーザーについては手動登録した電子メールアドレスが優先されるため、RADIUS/LDAPサーバーに登録された電子メールアドレスは使われません。

         awplus# 2fa create user sampleUser email sample@example.jp

認証コードを電子メールで送信するよう設定している場合、ユーザーが第1要素（ユーザー名・パスワード）の認証に成功すると、登録された電子メール宛てに次のようなメッセージが届きます。

Note

以下のユーザーには電子メールが送信されません。

- TOTP/HOTPユーザー（2fa create userコマンドで手動登録したユーザー、および、自己登録したTOTPユーザー）
  → モバイルアプリで生成した認証コードによる認証を行います。
- 2FA除外ユーザー（2fa create user skip-2faコマンドで除外登録したユーザー）
  → 第1要素（ユーザー名・パスワード）のみで認証が完了します。

通知メールの書式を変更したい場合は、フラッシュメモリー上にテンプレートのテキストファイルを作成し、そのファイルを2fa email-templateコマンドで指定します。
テンプレートの仕様については2fa email-templateコマンドのページをご参照ください。

    awplus(config)# 2fa email-template Email_TEMPLATE.txt

### その他

2FAサービスの設定はshow 2faコマンドで確認できます。
2FAユーザー情報の一覧はshow 2fa usersコマンドで確認できます。
個々の2FAユーザーの情報（シークレットキー、バックアップコード、手動登録した電子メールアドレス、2FA除外設定など）はshow 2fa userコマンドにユーザー名を指定することで確認できます。
2FAユーザー情報を削除するには2fa delete userコマンドを使います。

    awplus# 2fa delete user userA

## 応用設定

2FAの動作は以下のコマンドでカスタマイズ可能です。

### 2FA未設定ユーザーの拒否

認証コードの電子メール通知（2fa email-otpコマンド）が無効な場合、初期設定では、TOTP/HOTP未設定のユーザー（2fa create userコマンドまたは自己登録用Webページで登録していないユーザー）は2FAを使わずに第1要素（RADIUSかLDAP）の認証をパスすればログインが可能です。
認証コードの電子メール通知が無効な場合に2FA未設定ユーザーのログインを拒否するには、2fa reject-unconfigured-usersコマンドを設定してください。

    awplus(config)# 2fa reject-unconfigured-users

### 2FA除外ユーザーの設定

認証コードの電子メール通知（2fa email-otpコマンド）が有効な場合、初期設定では、TOTP/HOTP未設定のユーザー（2fa create userコマンドまたは自己登録用Webページで登録していないユーザー）は電子メール通知による2FAの対象となります。
特定のユーザーを2要素認証の対象から除外するには、2fa create user skip-2faコマンドを使います。
認証コードの電子メール通知が有効であっても、同コマンドで指定したユーザーは第1要素（RADIUSかLDAP）の認証をパスすればログインが可能です。
また、2FA未設定ユーザーのログインを拒否する設定（2fa reject-unconfigured-usersコマンド）が有効な場合でも、2fa create user skip-2faコマンドで指定したユーザーは第1要素（RADIUSかLDAP）の認証をパスすればログインが可能です。

    awplus(config)# 2fa create user userZ skip-2fa

### QRコード（OTP URL）に埋め込む情報の設定

シークレットキーを受け渡すためのQRコードは、OTP URLと呼ばれるURL文字列をQRコード化したものです。
このURLにはシークレットキーのほかに、参考情報としていくつかの文字列情報を付加することができます。
これは以下の各コマンドで設定します。
Note

- 以下のコマンドで設定した内容は、それ以降に2fa create userコマンドやshow 2fa userコマンドでQRコードを出力したときに反映されます。
- OTP URLのQRコードを読み込んだときに以下の参考情報をどのように利用するか（どのように表示するか）は認証アプリの仕様に依存します。
- これらの参考情報の有無や内容は2要素認証の動作には影響しません。

OTP URLに発行者情報（issuerパラメーター）を付加するには、2fa issuerコマンドを使います。初期状態は未設定で、その場合発行者情報は埋め込まれません。

    awplus(config)# 2fa issuer My Company

OTP URLに埋め込むラベル情報の後半部分を変更するには、2fa labelコマンドを使います。初期設定ではホスト名（hostname）が入ります。

    awplus(config)# 2fa label My VPN

### TOTP方式における認証コードの再利用

カウンターベースのHOTP方式では認証コードは使うたびに変更されますが、初期設定では時間ベースのTOTP方式でも認証コードは各々1回ずつしか使用できません。
たとえば、ユーザーが複数の装置からOpenVPN接続を行う場合、ある装置からログインした直後に別の装置からもログインしようとすると、最初の装置で使用した認証コードの有効期間内であっても、2つ目の装置で入力した認証コードは使用済みであるとして拒否されます。
TOTP方式で同じ認証コードを複数回使えるようにするには 2fa allow-reuseコマンドを使います。

    awplus(config)# 2fa allow-reuse

### TOTP方式における軽微な時刻ずれへの対応

時間ベースのTOTP方式では、認証を受ける側（ユーザー側）と認証する側（本製品）がそれぞれの時刻にもとづいてタイムステップ（30秒）ごとにワンタイムパスワード（認証コード）を計算するため、両者の時刻がずれていると正しく認証を行えません。
ただし、実際の運用ではシステム間で時刻がずれている可能性は十分考えられ、またユーザーが認証コードを確認して入力するまでのタイムラグもあるため、ある程度の時刻ずれを許容する設定が可能です。
初期設定では、ある時点において現在の時刻に対応した認証コードに加え、前後1個ずつの認証コードも受け入れる設定になっています。
現在時刻を中心に前後あわせて合計何個の認証コードを許容するかを示す設定値をTOTPウィンドウサイズと呼び、2fa totp-window-sizeコマンドで変更が可能です。
たとえば次の設定ではTOTPウィンドウサイズを5に設定しています。これは現在のコードに加えて、前2個、後2個の合計5個のコードを受け入れる設定です。

    awplus(config)# 2fa totp-window-size 5

一方、次の例ではTOTPウィンドウサイズを1、すなわち現在のコードしか受け入れない厳格な設定にしています。

    awplus(config)# 2fa totp-window-size 1

### TOTP方式における大幅な時刻ずれへの対応

時間ベースのTOTP方式では、前述のとおり、認証を受ける側（ユーザー側）と認証する側（本製品）がそれぞれの時刻にもとづいてワンタイムパスワード（認証コード）を計算するため、両者の時刻がウィンドウサイズ（2fa totp-window-sizeコマンド）よりも大きくずれていると正しく認証を行えません。
ウィンドウサイズよりも大きな時刻ずれの原因としてよく見られるものにタイムゾーン設定の不一致があります。
時刻ずれ補正機能は、このような状況に対応するために両者の時刻がずれていることを検出して自動補正する機能です。
時刻ずれ補正機能の有効時にユーザーが間違った認証コードを入力すると、本製品は現在時刻の前後 2fa max-skew個分の認証コードをチェックし、一致するコードが見つかった場合はユーザーがそのコードを入力した時刻と、実際のそのコードが使われるべき時刻の差（ずれ幅）を記憶しておきます。
該当ユーザーが同じずれ幅で間違ったコードを短期間に3回連続して入力した場合、本製品はこのずれ幅を該当ユーザーの時刻補正値として記憶し、それ以降該当ユーザーがログインしようとしてきた場合は現在時刻にこの補正値を適用して認証コードをチェックします。これにより、互いの時刻がずれたまま正しく認証が行えるようになります。
初期状態では、時刻ずれ補正機能は無効です。有効にするには2fa skew-adjustコマンドを実行します。

    awplus(config)# 2fa skew-adjust

補正可能な最大ずれ幅（前後どちらにも適用）は 2fa max-skewコマンドで設定します。
同コマンドの指定値の単位は「タイムステップ」です（1タイムステップ＝30秒）。
初期値は1500タイムステップ（45000秒＝750分＝12時間30分）です。
次の例では、最大補正幅を設定可能な最大値である3000タイムステップ（25時間）に設定しています。

    awplus(config)# 2fa max-skew 3000

時刻補正値が保存されているユーザーについては、show 2fa userコマンドの出力にその旨が表示されます。

    awplus# show 2fa user userA

ユーザーごとの時刻補正値をリセットするには2fa reset skewコマンドにユーザー名を指定します。

    awplus# 2fa reset skew userA

### HOTP方式におけるカウンターずれへの対応

カウンターベースのHOTP方式では、認証を受ける側（ユーザー側）と認証する側（本製品）がそれぞれ次が何個目の認証コードであるかを示すカウンターを保持しており、このカウンターの値にもとづいて認証コードを計算するため、両者のカウンターがずれていると正しく認証を行えません。
ただし、HOTPではユーザーが任意でカウンターを進める（認証アプリで認証コードを更新する＝次のカウンターのコードを取得する）ことができるため、カウンターの不一致は起こり得る前提で、認証する側（本製品）でユーザー側がいくつまでカウンターを進めていても許容するかを設定できるようになっています。
初期設定では、認証する側から見て、現在のカウンター値に対応した認証コードに加え、次とその次の認証コードを加えた合計3つの認証コードを受け入れる設定になっています。現在の認証コードを1つ目とした場合に何個目の認証コードまでを許容するかを示す設定値をHOTPウィンドウサイズと呼び、2fa hotp-window-sizeコマンドで変更が可能です。
たとえば次の設定ではHOTPウィンドウサイズを5に設定しています。これは現在のコードから4つ先のコードまで合計5個のコードを受け入れる設定です。

    awplus(config)# 2fa hotp-window-size 5

一方、次の例ではHOTPウィンドウサイズを1、すなわち現在のコードしか受け入れない（カウンターのずれを許容しない）厳格な設定にしています。

    awplus(config)# 2fa hotp-window-size 1

### TOTP方式における自己登録用Webページ

TOTP方式では、管理者があらかじめ手動でユーザー情報（シークレットキーなど）を登録して通知するだけでなく、本製品上に用意される専用のWebページからユーザー自身が2FAの利用登録を行うこともできます。以下、そのための手順を説明します。
手動登録については「基本設定」の手順3「TOTP/HOTPを使用する場合」をご覧ください。

1. 自己登録用Webページを有効にします。2fa self-registration portコマンドでWebページを公開するTCPポートを指定してください。
   たとえばポート10443を使う場合は次のように設定します。

       awplus(config)# 2fa self-registration port 10443

   Note

   Web GUI（http port、http secure-port）やPACファイル配布用Webサーバー（pac-file http-server portコマンド）とは別のポートを指定してください。

2. 自己登録用Webページの認証に使用するサーバーをaaa authentication 2fa-registrationコマンドで指定します。
   たとえばradius-server hostコマンドで登録したRADIUSサーバーを使用する場合は次のように設定します。

       awplus(config)# aaa authentication 2fa-registration default group radius

3. 自己登録を行うユーザーに対して、手順2の認証サーバーに登録したユーザー名、パスワードと自己登録用WebページのURLを通知してください。
   自己登録用WebページURLは次の形式です。

       https://<本製品のIPアドレスまたはホスト名>:<手順1で指定したポート番号>/2fa-registration

   たとえば、ユーザーからアクセス可能な本製品のFQDNが「gw.example.jp」で、自己登録用Webページのポート番号を10443に設定した場合、ユーザーに通知すべきURLは次のようになります。

       https://gw.example.jp:10443/2fa-registration

   また、ファイアウォールを使用している場合は、ユーザーが上記URLにアクセスできるようルールを適切に設定してください。
4. ユーザーは、管理者から通知されたURLをWebブラウザーに入力することで次の登録画面にアクセスできます。

5. ユーザーが Username と Password を入力して Login ボタンをクリック/タップすると、手順2のサーバーに登録されているユーザー情報にしたがって認証が行われ、成功するとモバイルアプリで読み込むためのQRコードが表示されます。
   また、QRコードの下には、モバイル端末やモバイルアプリの障害で認証コードを取得できなくなった場合に備えたバックアップコードが表示されます。
   バックアップコードは安全な方法で管理してください。

## 機器交換時のユーザー再登録手順

### 機器交換前の作業

2FAユーザー情報を2fa export user-dataコマンドを使用してエクスポートします。
本コマンドの実行後に、インポート時に必要なパスワードを指定します。
なお、エクスポートされるファイルのファイル名は（下記例の一番下に表示されている「atl2fausers-20230303-3272.dat」）自動で付与されます。インポート時に入力が必要になるため忘れないようメモする事をお勧めします。

    awplus# 2fa export user-data
    Enter security password: XXXXXXXXXXXX ↓（実際には表示されません）
    Re-enter password: XXXXXXXXXXXX ↓（実際には表示されません）
    Successfully exported 2FA user data (11 users) to file atl2fausers-20230303-3272.dat

### 機器交換後の作業

交換後の機器において2FAユーザー情報を2fa import user-data sourceコマンドを使用してインポートします。
インポートする際に、登録済みの2FAユーザー情報をすべて削除してインポートするデータに置き換える場合はreplaceパラメーターを指定します。
パラメーターを指定しない場合は、登録済み2FAユーザー情報と比較して変更・足りない情報をマージします。
Note

インポートを行う際は、service 2faコマンドをno形式で実行し2FAサービスを無効にしてください。
インポート完了後はservice 2faコマンドで2FAサービスを有効にしてください。

Note

インポート時には2FAユーザー情報がそのまま引き継がれるため、バックアップコード（Scratch codes）も再作成されることなく引き継がれます。そのためユーザーへの再通知は不要です。

    awplus# 2fa import user-data source tftp://192.168.1.1/atl2fausers-20230303-3272.dat
    Copying...
    Successful operation
    Enter security password: XXXXXXXXXXXX ↓（実際には表示されません）
    Successfully imported 2FA user data (11 users).