Google Authenticator
関連記事
Google Authenticator は、ワンタイムパスコード (OTP) を使用した二段階認証手続きを提供します。この認証方式は、オープン認証イニシアチブ(OATH) によって最初に標準化されました。認証メカニズムは Linux の PAM システムに統合されています。本ガイドでは、このメカニズムのインストールと設定方法を紹介します。
逆の操作(Linux 上で Google Authenticator 互換のコードを生成する方法)については、以下のコード生成を参照してください。
目次
インストール
クライアントプログラム google-authenticator(1) と PAM モジュール pam_google_authenticator.so
を提供する libpam-google-authenticator パッケージをインストールします。開発版は google-authenticator-libpam-gitAUR で利用可能です。
設定
このセクションでは、システムの PAM を設定して、SSH およびオプションでデスクトップログインに対して Google Authenticator の OTP 認証を要求する方法を説明します。
SSH
通常、リモートログインに対してのみ 2 パス認証を要求します。対応する PAM 設定ファイルは /etc/pam.d/sshd
です。Google Authenticator を全体に適用したい場合は、/etc/pam.d/system-auth
を変更する必要がありますが、この場合は非常に慎重に進め、ログインできなくなることを避けてください。
このガイドでは、最も安全な(必ずしも必要ではありませんが)ローカルセッションで /etc/pam.d/sshd
を編集します。
UNIX パスワードと OTP の両方を入力するには、pam_google_authenticator.so
を /etc/pam.d/sshd
内の system-remote-login 行の上に追加します。
auth required pam_google_authenticator.so auth include system-remote-login account include system-remote-login password include system-remote-login session include system-remote-login
これにより、OTP が要求された後に UNIX パスワードの入力が求められます。これらのモジュールの順序を変更すると、順序が逆になります。
OTP または UNIX パスワードのいずれかでログインを許可するには、次のようにします。
auth sufficient pam_google_authenticator.so
/etc/ssh/sshd_config.d/99-archlinux.conf
でキーボード対話型認証を有効にします。
KbdInteractiveAuthentication yes
最後に、sshd.service
をリロードします。
ローカルネットワーク外から接続したときのみ OTP を要求する
場合によっては、ローカルネットワーク外から接続するときにのみ 2FA 機能を有効にしたいことがあります。
これを実現するには、ファイル(例: /etc/security/access-local.conf
)を作成し、2FA をバイパスできるネットワークを追加します。
# ローカル IP 範囲のみ許可 + : ALL : 192.168.20.0/24 # 追加ネットワーク: VPN トンネル IP 範囲(ある場合) + : ALL : 10.8.0.0/24 + : ALL : LOCAL - : ALL : ALL
次に、/etc/pam.d/sshd
を編集し、以下の行を追加します。
#%PAM-1.0 auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf auth required pam_google_authenticator.so auth include system-remote-login account include system-remote-login password include system-remote-login session include system-remote-login
デスクトップログイン
Google Authenticator の PAM プラグインは、コンソールログインや GDM にも使用できます。/etc/pam.d/login
または /etc/pam.d/gdm-password
ファイルに次の行を追加するだけです。
auth required pam_google_authenticator.so
使用方法
2 パス認証を使用したいユーザーは、それぞれ
- ホームフォルダにシークレットキーのファイルを生成し、
- 対応する OTP ジェネレーターを設定する必要があります。
シークレットキーのファイル生成
google-authenticator は以下のように TOTP シークレットキーのファイルを生成します。
$ google-authenticator
Do you want authentication tokens to be time-based (y/n) y generated_QR_code_here Your new secret key is: ZVZG5UZU4D7MY4DH Your verification code is 269371 Your emergency scratch codes are: 70058954 97277505 99684896 56514332 82717798 Do you want me to update your "/home/username/.google_authenticator" file (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n) n If the computer that you are logging into is not hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y
緊急スクラッチコードを安全に保管することをお勧めします(印刷して安全な場所に保管してください)。これらは、携帯電話(OTP ジェネレーター)を紛失した場合、SSH を介してログインする唯一の方法です。また、~/.google_authenticator
にも保存されているため、ログインしている限りいつでも確認できます。
保存場所
シークレットキーのファイル保存パスを変更したい場合は、--secret
フラグを使用します。
$ google-authenticator --secret="/path_folder/username"
その後、PAM の場所パスを /etc/pam.d/sshd
で忘れずに変更します。
/etc/pam.d/sshd
auth required pam_google_authenticator.so user=root secret=/path_folder/${USER}
user=root
は、PAM に root ユーザーを使用してファイルを検索させるために使用されます。
また、シークレットキーのファイルのパーミッションに注意してください。ファイルは所有者のみ読み取り可能でなければなりません(chmod: 400
)。ここでは、所有者は root です。
$ chown root:root /path_file/secret_key_files $ chmod 400 /path_file/secret_key_files
コード生成
最終設定ステップでは、各ユーザーがホームディレクトリに生成されたシークレットキーのファイルを選択した OTP ジェネレーターに関連付けて認証コードを生成する必要があります。冗長性のために、モバイル端末の OTP アプリケーションや別のパスワードマネージャーなど、複数のデバイスでジェネレーターを設定したり、以前に生成した緊急スクラッチコードをバックアップとして利用することもできます。
モバイル端末ジェネレーター
携帯電話にジェネレーターアプリケーションをインストールします(例):
- Android 用 FreeOTP(F-Droid、Google Play)または iOS 用(App Store)。
- Android 用 FreeOTP+(F-Droid、Google Play)。
- Android 用 Aegis(F-Droid、Google Play)。
- Android 用 Bitwarden(F-Droid、Google Play)または iOS 用(App Store)。
- Android 用 Google Authenticator(Google Play)または iOS 用(App Store)。
モバイルアプリケーションで新しいアカウントを作成し、シークレットキーのファイル生成時に表示された URL から QR コードをスキャンするか、シークレットキー(上記の例では「ZVZG5UZU4D7MY4DH」)を手動で入力します。
これで、携帯電話に 30 秒ごとに新しいパスコードトークンが生成されるはずです。
Google Authenticator を他のシステムでも設定している場合、デバイスを紛失するとそれらのシステムにログインできなくなることがあります。コードを生成する追加の方法を持つことが役立ちます。
コードマネージャー
Google Authenticator コードの表示、生成、保存、管理を可能にするスクリプトは gashellAUR によって提供されています。代替オプションとして auther-gitAUR もあります。
KeePassXC
GUI パスワードマネージャー keepassxc では、Google Authenticator コードをエントリに関連付け、その後 OTP コードを生成して QR コード経由でキーをエクスポートすることができます。
コマンドライン
最も簡単なコード生成方法は oathtool(1) です。これは oath-toolkit パッケージに含まれており、次のように使用できます。
$ oathtool --totp --base32 secret_key
ほとんどの Android システムでは、Google Authenticator データベースをデバイスからコピーして直接アクセスできます。このデータベースは SQLite データベースです。ただし、2022年7月のある時点 で、アカウントテーブルのシークレット列で暗号化が使用され始めました。データベースバックアップでこの暗号化が使用されていない場合、このシェルスクリプトを使用して Google Authenticator データベースを読み取り、見つかった各キーのライブコードを生成できます。
google-authenticator.sh
#!/bin/sh # これは Google Authenticator アプリファイルへのパスです。通常は # Android の /data にあります。PC にコピーして安全な場所に保管し、 # ここにそのパスを指定します。 DB="/path/to/com.google.android.apps.authenticator/databases/databases" sqlite3 "$DB" 'SELECT email,secret FROM accounts;' | while read A do NAME=`echo "$A" | cut -d '|' -f 1` KEY=`echo "$A" | cut -d '|' -f 2` CODE=`oathtool --totp -b "$KEY"` echo -e "\e[1;32m$CODE\e[0m - \e[1;33m$NAME\e[0m" done
テスト
別のマシンや別のターミナルウィンドウからホストに SSH 接続します。
$ ssh hostname login as: username Verification code: generated/backup_code Password: password $