はじめに:SSHという扉に錠を追加する
サーバーを貴重な家、SSHをその玄関口だと想像してみてください。通常、私たちはこの扉を一つの鍵、つまりパスワードだけで施錠しています。しかし、もし悪意のある第三者がその鍵を手に入れたら(パスワードの漏洩)、あるいはもっと悪いことに、彼らが忍耐強くあらゆる種類の鍵を試したら(ブルートフォース攻撃)、どうなるでしょうか?明らかに、あなたの家は危険に晒されます。
最近、10台以上のサーバーのセキュリティ監査を行った際、憂慮すべき共通点を発見しました。それは、SSHがパスワードのみで保護されているという点です。たとえそれが非常に複雑なパスワードであっても、それは依然として唯一の防御層に過ぎません。実際、SSHへの自動化されたブルートフォース攻撃は、インターネット上で毎日、毎時間行われており、このような脆弱な「扉」を静かに探しています。
では、この「扉」をどうやって強化すればよいのでしょうか?その答えは、もう一つの錠前、すなわち二要素認証(2FA)を追加することです。2FAがあれば、攻撃者はたとえあなたのパスワードを知っていても侵入できません。彼らには第二の要素、つまり常にあなたのそばにあるスマートフォンからのランダムな認証コードが必要になるのです。この記事では、その強固な保護層を構築するための手順を一つずつ解説していきます。
主な概念
二要素認証(2FA)とは?
2FA、または二要素認証は、ユーザーに本人であることを証明するために2種類の異なる証拠の提供を要求するセキュリティ手法です。簡単に言うと:
- 要素1:あなたが知っているもの(例:パスワード、PINコード)。
- 要素2:あなたが持っているもの(例:スマートフォン、USBトークン)。
2FAを使用してSSHにログインする場合、まずパスワード(要素1)を入力し、次にシステムがスマートフォン上のAuthenticatorアプリからの6桁のコード(要素2)を要求します。これら両方の情報を正確に提供した場合にのみ、サーバーにアクセスできます。
Google Authenticatorはどのように機能するのか?
Google Authenticatorは、Time-based One-Time Password (TOTP) と呼ばれるアルゴリズムを使用しています。基本的には次のように動作します:
- 設定時、サーバーとスマートフォンのアプリは共通の「シークレットキー」を共有します。
- 30秒ごとに、サーバーとアプリの両方がこのシークレットキーと現在時刻を使用して、6桁のコードを生成します。
- 両者が同じ計算式とシークレットキーを使用しているため、生成される6桁のコードは完全に一致します。あなたがスマートフォンからコードを入力すると、サーバーは自身で生成したコードと比較するだけです。一致すれば、次に進めます。
大きな利点は、一度設定が完了すれば、スマートフォンがコードを生成するためにインターネットに接続する必要がないことです。
実践:UbuntuでSSHに2FAを設定する
最も重要な部分、実践です!このガイドはUbuntu 22.04で実行されていますが、他のUbuntuバージョンやDebian系の他のオペレーティングシステムにも問題なく適用できます。
ステップ1:Google Authenticatorモジュールをインストールする
まず、システムがGoogle Authenticatorの認証方法を「理解」できるように、特別なPAM(Pluggable Authentication Modules)モジュールをインストールする必要があります。このモジュールの名前はlibpam-google-authenticatorです。
ターミナルを開き、次のコマンドを実行します:
sudo apt update
sudo apt install libpam-google-authenticator -y
ステップ2:アカウント用の2FAコードを生成する
重要な注意:このコマンドは、2FAを有効にしたいユーザーアカウントで実行してください。rootアカウントは絶対に使用しないでください。
google-authenticator
実行後、ターミナルには大きなQRコードと非常に重要な情報が表示されます。注意深く読んでください:

- QRコード:スマートフォンのGoogle Authenticatorアプリ(またはAuthy、Microsoft Authenticator)でこのコードをスキャンします。
- Your new secret key(新しいシークレットキー):これはテキスト形式のシークレットキーです。このキーをバックアップし、非常に安全な場所(例:1Password、Bitwardenなどのパスワードマネージャー)に保管してください。このキーとスマートフォンの両方を失うと、サーバーからロックアウトされる可能性があります。
- Your verification code is…(あなたの確認コード):正しく設定できたかを確認するための最初の6桁のコードです。
- Your emergency scratch codes(緊急スクラッチコード):これらは5つの「予備の鍵」で、各コードは一度しか使えません。これらをパスワードマネージャーに保存するか、紙に印刷してすぐに保管してください。
次に、プログラムからいくつかの質問が表示されます。最適なセキュリティ構成のために、以下の推奨に従って回答してください:
Do you want me to update your "/home/your_user/.google_authenticator" file? (y/n) <strong>y</strong>
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30 seconds, but
it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) <strong>y</strong>
By default, tokens are good for 30 seconds... (y/n) <strong>n</strong>
Do you want to enable rate-limiting for the authentication module? (y/n) <strong>y</strong>
ステップ3:SSHに2FAを使用するよう「指示」する
अब SSHサービスに、誰かがログインしようとしたときに2FAコードを尋ねる必要があることを「教える」時が来ました。
1. SSHのPAMを設定する:
使い慣れたエディタ(例:nano)でファイルを開きます:
sudo nano /etc/pam.d/sshd
ファイルの一番上に次の行を追加します。これにより、2FAの要求が最初に実行されるようになります。
auth required pam_google_authenticator.so
2. SSHサービスを設定する:
次に、SSHのメイン設定ファイルを開きます:
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthenticationとUsePAMの行を見つけ、それらがyesに設定されていることを確認します(noになっていたり、#でコメントアウトされていないようにします)。
ChallengeResponseAuthentication yes
UsePAM yes
ChallengeResponseAuthentication yes: SSHが「Verification code:」のような対話形式のプロンプトを表示できるようにします。UsePAM yes: SSHDにPAMで定義された認証ルールに従うように命令します。
ステップ4:変更を適用する
すべての変更を適用するために、sshdサービスを再起動します:
sudo systemctl restart sshd
🛑 非常に重要:現在のターミナルウィンドウをまだ閉じないでください!新しいターミナルウィンドウを開いて、再度SSHを試してください。どこかで設定を間違えた場合、古いセッションが修正するための「命綱」になります。それを閉じてしまうと、永久にサーバーからロックアウトされる危険があります。
ステップ5:2FAでのログインを体験する
新しいターミナルウィンドウから、サーバーにSSHで接続してみてください。ログインプロセスには追加のステップが含まれるようになります:
$ ssh your_user@your_server_ip
(your_user@your_server_ip) Password: <strong>********</strong>
Verification code: <strong>123456</strong>
Welcome to Ubuntu ...
your_user@your_server:~$
パスワードを入力した後、システムは「Verification code」を要求します。Authenticatorアプリを開き、表示されている6桁のコードを入力するだけです。成功すれば、家に入れたことをお祝いします!
まとめ
おめでとうございます!わずか数ステップで、サーバーに非常に強固な「鎧」の層を追加できました。この第二の保護層は、自動化されたブルートフォース攻撃をほぼ完全に無力化します。これで、たとえパスワードが漏洩したとしても、悪意のある第三者があなたのサーバーに触れることはできません。
2FAの有効化を、「デジタル資産」の安全性に対する最も効果的な投資の一つと考えてください。セキュリティは終わりのない旅であり、今日、あなたはその旅で非常に大きな一歩を踏み出しました。

