メインコンテンツへスキップ
  1. ブログ/

AlmaLinuxのSSHにGoogle Authenticatorで二段階認証(TOTP)を導入する方法

·
SSH セキュリティ AlmaLinux 二要素認証
目次

AlmaLinuxのSSHにGoogle Authenticatorで二段階認証(TOTP)を導入する方法
AlmaLinuxのSSHにGoogle Authenticatorで二段階認証(TOTP)を導入する方法

初めに
#

SSH では「公開鍵認証を使えば安全」と思われがちですが、実際には秘密鍵を紛失してしまう、端末が盗まれるといったリスクがあります。

そのため、公開鍵認証だけに頼っていると、思わぬトラブルでログインできなくなったり、不正アクセスにつながる可能性もゼロではありません。

そこで役立つのが 二段階認証(二要素認証) です。

SSH の公開鍵認証に Google Authenticator が生成するワンタイムパスワード(TOTP)を組み合わせることで、ログイン時に「公開鍵 + 時間制限付きコード」の両方を求める形となり、セキュリティを大幅に強化できます。

本記事では、AlmaLinux 9 環境において、SSHD に Google Authenticator を導入し、SSH ログインに TOTP 認証を追加する手順をわかりやすく解説します。

Google Authenticatorのインストール
#

初めに Google Authenticator の PAM モジュールをインストールします。

EPELリポジトリが未導入の場合は、以下のコマンドにて有効化してください。

dnf install epel-release

次に以下のコマンドにて、Google Authenticator パッケージをインストールしてください。

dnf install google-authenticator

実行すると以下のように確認画面が表示されます。

y を入力しインストールを行ってください。

============================================================================================================================================
 Package                                    Architecture                 Version                           Repository                  Size
============================================================================================================================================
Installing:
 google-authenticator                       x86_64                       1.09-5.el9                        epel                        55 k

Transaction Summary
============================================================================================================================================
Install  1 Package

Total download size: 55 k
Installed size: 119 k
Is this ok [y/N]:

インストールが完了したら以下のメッセージが表示されます。

Complete!

以下のコマンドを実行する事で導入を確認できます。

rpm -qa |grep "google-authenticator"
google-authenticator-1.09-5.el9.x86_64

qrencodeのインストール
#

次に qrencode をインストールします。

これは、Google Authenticator の設定時にターミナル上へ登録用の QR コードを表示するために利用するツールとなります。

dnf install qrencode

実行すると以下のように確認画面が表示されます。

先ほどと同様に y を入力しインストールを行ってください。

============================================================================================================================================
 Package                              Architecture                  Version                               Repository                   Size
============================================================================================================================================
Installing:
 qrencode                             x86_64                        4.1.1-1.el9                           epel                         25 k
Installing dependencies:
 qrencode-libs                        x86_64                        4.1.1-1.el9                           epel                         61 k

Transaction Summary
============================================================================================================================================
Install  2 Packages

Total download size: 85 k
Installed size: 207 k
Is this ok [y/N]:

インストールが完了したら以下のメッセージが表示されます。

Complete!

ユーザー設定
#

インストールが完了したら、SSH でログインを行う各ユーザーごとにTOTP用の秘密鍵を生成し、認証アプリへ登録する必要があります。

まずは対象となるユーザーでログインし、以下のコマンドを実行してください。

google-authenticator

コマンドを実行すると、対話形式で初期設定が開始されます。

以下は、初期設定時に表示される質問内容と、その回答例となります。

質問内容(日本語) 推奨回答
時間ベースの認証コードを使いますか? y
設定内容をファイルに保存しますか? y
同じ認証コードの再利用を禁止しますか? y
時刻のズレを大きく許容しますか? n
認証試行回数の制限(レート制限)を有効にしますか? y

最初に表示される質問は次のとおりです。

Do you want authentication tokens to be time-based (y/n)

この設定は、ワンタイムパスワードを 時間ベース(TOTP)で生成するかどうかを確認するものです。

ここでは y を入力してください。

y を入力すると、続いて以下のようなメッセージが表示されます。

Warning: pasting the following URL into your browser exposes the OTP secret to Google:
  https:***************************
(ここに QR コードが表示されます)
Your new secret key is: IDBZAEI65UXNFQXMCXH4KOVS4I

この出力には、Google Authenticator にアカウントを登録するための以下の情報が含まれています。

項目 説明
登録用URL ブラウザで開くことで認証アプリに登録できる形式のURL(非推奨)
QRコード 登録用 QR コード
スマートフォンでアプリで読み取ることで簡単に登録が可能
秘密鍵(Secret Key) Google Authenticator に手動登録する際に入力する鍵
QR コードが読めない場合に使用する

表示されたQRコードをアプリで読み取り登録を進めてください。

QR コードが正しく表示されない場合や、読み取れない場合には 秘密鍵を利用して手動で登録することもできます。

Google Authenticator へ登録が完了すると、画面に入力待ちメッセージが表示されます。

先ほど登録したアプリに表示されている 6 桁の認証コードを入力してください。

Enter code from app (-1 to skip):

認証コードが正しく入力されると緊急用コードが表示されます。

Enter code from app (-1 to skip): XXXXXX
Code confirmed
Your emergency scratch codes are:
  70391853
  54946507
  29019470
  96826364
  34606648

これらは、スマートフォンを紛失した場合などに一時的にログインするための バックアップコード となります。

必ず控えておき、安全な場所に保管してください。

次に以下の質問が表示されます。

Do you want me to update your "/<アカウント名>/.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, a new token is generated every 30 seconds by the mobile app.
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. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n)

これは、スマートフォンとサーバーの時刻のズレをどこまで許容するかを設定する事ができます。

特に理由がなければ、ここは n で問題ありません。

次に、ログイン試行回数の制限(レート制限)を有効にするかどうかの質問が表示されます。

If the computer that you are logging into isn't 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)

これは、短時間に何度もログインを試される 総当たり攻撃(ブルートフォース攻撃)を防ぐための仕組みです。

有効にすると、30 秒間に 3 回までしか認証を試せなくなります。

こだわりが無ければ y を入力し有効にする事をお勧めします。

以上でユーザー側の設定はすべて完了となります。

設定が完了すると、ホームディレクトリに次のファイルが生成されます。

~/.google_authenticator

このファイルには、TOTP に必要な 秘密鍵 や、設定時に選択した再利用禁止・レート制限 といった動作設定、緊急用コード が保存されています。

第三者に読み取られないよう十分注意し、誤って削除しないよう取り扱いには気をつけてください。

PAMの設定変更
#

続いて、SSH 認証時に TOTP を利用できるよう、PAM の設定を変更します。

以下のファイルを編集してください。

vi /etc/pam.d/sshd

auth セクションの先頭付近に、次の 1 行を追加します。

auth       required     pam_google_authenticator.so

次に以下のように password-auth 設定を無効化してください。

+ #auth       substack     password-auth
- auth       substack     password-auth

この設定により、sshd がユーザー認証を行う際に Google Authenticator による認証を実行するようになります。

追加した設定を確認したい場合は、以下のコマンドで確認することができます。

$ grep "pam_google_authenticator" /etc/pam.d/sshd
auth       required     pam_google_authenticator.so

Google Authenticator を設定していないユーザーのログインも許可したい場合は、以下のように nullok オプションを付ける必要があります。

ご利用環境に合わせてご設定をお願いいたします。

auth       required     pam_google_authenticator.so nullok

SSHの設定変更
#

続いて、SSH ログイン時に 公開鍵認証と TOTP による認証の両方を必須とするための設定を行います。

sshd_configの設定
#

以下のコマンドで設定ファイルを開き編集します。

vi /etc/ssh/sshd_config

以下の項目を追加または変更してください。

UsePAM yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

各項目の設定は以下の通りです。

項目 簡易説明
UsePAM yes PAMを利用して認証を行うための設定
ChallengeResponseAuthentication yes チャレンジレスポンス認証を有効にし、TOTP 入力を受け付けられるようにする設定
AuthenticationMethods publickey
keyboard-interactive
公開鍵認証と TOTP 認証の 両方が成功した場合のみ ログインを許可する設定

RHEL系特有の設定 (50-redhat.conf)
#

AlmaLinux 9 系では Fedora 系の設定を引き継いでおり ChallengeResponseAuthentication がデフォルトで無効化されている仕様となっております。

参考情報

この仕様のままサービスの再起動を行うと keyboard-interactive が利用できずエラーが発生します。

$ sshd -t
Disabled method "keyboard-interactive" in AuthenticationMethods list "publickey,keyboard-interactive"
AuthenticationMethods cannot be satisfied by enabled authentication methods

そのため、デフォルトの設定にて ChallengeResponseAuthentication をコメントアウトして無効化してください。

以下のコマンドで設定ファイルを開き編集します。

vi /etc/ssh/sshd_config.d/50-redhat.conf

該当設定の先頭に # を記述し無効化してください。

- ChallengeResponseAuthentication no
+ #ChallengeResponseAuthentication no

サービスのリロード
#

SSH の設定を反映させるため、編集後に SSH デーモンを再起動してください。

systemctl restart sshd

動作確認
#

設定が完了したら、実際に SSH 接続を行い、認証コードが正しく要求されるかを確認してください。

以下の例のように、SSH 接続時に Verification code が求められれば設定は成功です。

ターミナルソフトでの例
#

RLoginでのSSH接続時に認証コードを求められた画面の例

上記の画像のように、ターミナルソフト「RLogin」で SSH 接続を行うと、認証コードの入力を求められます。

コマンドラインでの例
#

以下はSSHコマンドにて接続を行った際に表示される例となります。

ssh -i <公開鍵> <アカウント名>@<サーバー名>
Verification code:

以上で、Google Authenticator を用いた SSH の二段階認証の導入は完了です。

設定が正しく反映されているか確認したうえで、ぜひ安全な SSH 環境の強化に活用してみてください。

関連記事

【初心者向け】RPMのChangelogからセキュリティ修正を確認する方法
Linux RPM セキュリティ AlmaLinux
【セキュリティ】LinuxでASLRの設定を確認する方法
Linux ASLR セキュリティ AlmaLinux 音声解説あり
【脆弱性確認】RPMファイルを展開してソースコードとパッチを確認する方法
Linux RPM セキュリティ AlmaLinux
【スクショ解説】aaPanel のインストールとサイト追加手順
AlmaLinux AaPanel コントロールパネル
【簡単実装】firewalldで日本国内IPアドレスのみ許可する方法
Linux Firewalld セキュリティ ネットワーク
【簡単ガイド】AlmaLinuxでNginxをインストールする方法
Linux AlmaLinux Nginx Webサーバー