SSHを2段階認証にする

2段階認証の設定方法 技術系

今回はSSH接続を2段階認証(2ファクタ認証)にする方法をご紹介します。
SSHを2段階認証にするメリットは、万が一登録しているIDとパスワードが漏洩しても、第二の認証手段(認証コード、生体情報など)がなければ第三者がログインできないため、不正アクセスやアカウント乗っ取りを防げる点です。
また、リスト型攻撃やフィッシングなどでパスワードが盗まれても、手元にある端末やコードがなければログインを阻止できます。

手順

SSHの2段階認証(2FA)には、Google AuthenticatorのPAMモジュールを利用するのが最も一般的です。
設定ミスによりサーバーから締め出されるのを防ぐため、現在のSSH接続は開いたまま維持し、必ず別のターミナルウィンドウから新規接続のテストを行ってください。

パッケージのインストール

サーバーのOSに合わせてコマンドを実行します。

Ubuntu / Debian系:

sudo apt update
sudo apt install libpam-google-authenticator

CentOS / RHEL / AlmaLinux系:

sudo dnf install epel-release
sudo dnf install google-authenticator

2段階認証キーの生成

2FAを有効にしたいユーザーアカウントで以下コマンドを実行。

google-authenticator

実行後、巨大なQRコードといくつかの質問が表示されます。

①タイムベースのトークンを使用するか: y

②スマートフォンの認証アプリ(Google Authenticatorなど)でQRコードを読み取る。

③~/.google_authenticator に設定を保存するか: y

④同一トークンの複数回使用を禁止するか(セキュリティ向上): y

⑤タイムスケジュールのウィンドウを拡大するか(時刻ズレ対策): 通常は n

⑥レートリミット(3回連続失敗でブロック)を有効にするか: y

PAMの設定変更

PAM設定ファイルを開きます。

sudo vi /etc/pam.d/sshd

ファイルの末尾(または @include common-auth の下)に以下の1行を追記して保存します。

auth required pam_google_authenticator.so

SSHデーモンの設定変更

SSHのメイン設定ファイルを開きます。

sudo vi /etc/ssh/sshd_config

以下の項目を探し、yes に変更します(古いOSの場合は ChallengeResponseAuthentication yes となっている場合があります)。

KbdInteractiveAuthentication yes

さらに、「公開鍵認証」と「2段階認証」の両方を必須にする場合は、ファイルの末尾に以下を追記します。

AuthenticationMethods publickey,keyboard-interactive

SSHサービスの再起動とテスト

設定を反映するためにSSHサービスを再起動します。(このタイミングで切断はしないでください。)

Ubuntu / Debian系:

sudo systemctl restart ssh

CentOS / RHEL / AlmaLinux系:

sudo systemctl restart sshd

別のターミナルを開き、サーバーへSSH接続を行います。パスワード(または公開鍵)による認証後、Verification code: と表示され、アプリの6桁の数字を入力してログインできれば成功です。

まとめ

いかがだったでしょうか。思ったより簡単に設定できるのにセキュリティはより高いものになるので必ず設定してほしい項目です。冒頭ご説明したとおり、2段階認証を設定しておくことでIDとPWが流出したとしてもギリギリのところで侵入を食い止めてくれます。
ただし、今回Googleのサービスを使用してますので、Googleアカウントが乗っ取られた場合、2段階認証の意味がなくなってしまうのでGoogleアカウントのセキュリティチェックは頻繁に実施するようにしてください。



コメント