初めに #
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 |
publickeykeyboard-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 接続を行うと、認証コードの入力を求められます。
コマンドラインでの例 #
以下はSSHコマンドにて接続を行った際に表示される例となります。
ssh -i <公開鍵> <アカウント名>@<サーバー名>
Verification code:
以上で、Google Authenticator を用いた SSH の二段階認証の導入は完了です。
設定が正しく反映されているか確認したうえで、ぜひ安全な SSH 環境の強化に活用してみてください。