このチュートリアルでは、有名なGoogle認証システムを使用してUbuntuサーバーでSSH2要素認証を設定する方法を説明します。 UbuntuサーバーでのSSHサービスのセキュリティが大幅に向上します。
2要素認証の仕組み
通常、Ubuntuサーバーにリモートでログインするには、パスワードを入力するか、SSHキーを使用するだけです。二要素認証(2FA)では、ログインするために2つの情報を入力する必要があります。そのため、SSHサーバーにログインするには、時間ベースのワンタイムパスワードも入力する必要があります。このワンタイムパスワードは、IETF標準であるTOTPアルゴリズムを使用して計算されます。最近では、多くのWebサイトやサービス(Facebook、Google、Twitterなど)がユーザーにアカウントを保護するための2FAを提供しています。また、SSHサーバーで2FAを有効にすることをお勧めします。
このチュートリアルでは、設定方法を説明します
- 2FAによるパスワード認証
- 2FAによる公開鍵認証
注 :この記事で使用するオープンソースサーバーソフトウェアは、libpam-google-authenticator
と呼ばれます。 、デフォルトのUbuntuリポジトリからインストールされます。 Googleは、いかなる形や形式の認証プロセスにも関与していません。サーバーソフトウェアとモバイルアプリはネットワークアクセスを必要としません。
ステップ1:UbuntuサーバーにGoogle認証システムをインストールして構成する
Ubuntuサーバーにログインし、次のコマンドを実行して、デフォルトのUbuntuパッケージリポジトリからGoogle認証システムをインストールします。
sudo apt install -y libpam-google-authenticator
次に、google-authenticator
を実行します ホームディレクトリに新しい秘密鍵を作成するコマンド。
google-authenticator
「認証トークンを時間ベースにしますか?」と尋ねられたとき yと答えてください 。
次に、携帯電話のTOTPアプリを使用してスキャンできるQRコードが表示されます。私がお勧めする2つのアプリがあります:
- Google認証システム 最もよく知られているTOTPモバイルアプリです。携帯電話のGooglePlayまたはAppleAppStoreからインストールできます。
- Google認証システム モバイルアプリはオープンソースではありません。 Googleを信頼できない場合は、RedHatが開発したオープンソースのTOTPモバイルアプリであるFreeOTPを使用できます。
携帯電話でGoogle認証システムまたはFreeOTPを使用してQRコードをスキャンします。 QRコード全体をスキャンするには、ターミナルウィンドウを拡大する必要があることに注意してください。
QRコードは秘密鍵を表します。秘密鍵は、SSHサーバーとTOTPモバイルアプリでのみ認識されます。 QRコードをスキャンすると、携帯電話に6桁のワンタイムパスワードが表示されます。デフォルトでは、30秒ごとに変更されます。 SSH経由でUbuntuサーバーにログインするには、後でこのワンタイムパスワードを入力する必要があります。
ターミナルウィンドウには、秘密鍵、確認コード、緊急スクラッチコードが表示されます。この情報は、後で使用できるように安全な場所に保存することをお勧めします。
次に、 yと入力できます 残りのすべての質問に答えます。これにより、Google Authenticator構成ファイルが更新され、同じ認証トークンの複数の使用が無効になり、時間枠が長くなり、ブルートフォースログインの試行から保護するためのレート制限が有効になります。
ステップ2:Google認証システムを使用するようにSSHデーモンを構成する
- 2FAによるパスワード認証
- 2FAによる公開鍵認証
2FAによるパスワード認証
SSHキーを使用しない場合は、以下の手順に従ってください。
SSHサーバー構成ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイル内で次の2つのパラメータを見つけ、両方がはいに設定されていることを確認します 。
UsePAM yes ChallengeResponseAuthentication yes
PAM プラグ可能な認証モジュールの略です。 Linuxシステムにさまざまな認証方法をプラグインする簡単な方法を提供します。 SSHでGoogle認証システムを有効にするには、PAMとチャレンジレスポンス認証を有効にする必要があります。
rootユーザーに2FAの使用を許可する場合は、PermitRootLogin
を見つけます。 パラメータを設定し、その値をyes
に設定します 。 PermitRootLogin no
にすることはできません またはPermitRootLogin prohibit-password
。
PermitRootLogin yes
ファイルを保存して閉じます。次に、SSHデーモンのPAMルールファイルを編集します。
sudo nano /etc/pam.d/sshd
このファイルの先頭に、ChallengeResponseAuthentication
のときにパスワード認証を有効にする次の行が表示されます。 yes
に設定されています 。
@include common-auth
SSHで2FAを有効にするには、次の2行を追加します。
# two-factor authentication via Google Authenticator auth required pam_google_authenticator.so
ファイルを保存して閉じます。次に、SSHデーモンを再起動して、変更を有効にします。
sudo systemctl restart ssh
今後、SSHデーモンでは、ユーザーパスワードと確認コード(Google認証システムによって生成されるワンタイムパスワード)を入力する必要があります。次のスクリーンショットは、CentOSボックスからUbuntu20.04サーバーへのSSHログインセッションを示しています。
2FAによる公開鍵認証
SSHキーを使用してSSHサーバーにログインする場合は、以下の手順に従ってください。
SSHサーバー構成ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイル内で次の2つのパラメータを見つけ、両方がはいに設定されていることを確認します 。
UsePAM yes ChallengeResponseAuthentication yes
PAM プラグ可能な認証モジュールの略です。 Linuxシステムにさまざまな認証方法をプラグインする簡単な方法を提供します。 SSHでGoogle認証システムを有効にするには、PAMとチャレンジレスポンス認証を有効にする必要があります。
rootユーザーに2FAの使用を許可する場合は、PermitRootLogin
を見つけます。 パラメータを設定し、その値をyes
に設定します 。 PermitRootLogin no
にすることはできません またはPermitRootLogin prohibit-password
。
PermitRootLogin yes
次に、このファイルの最後に次の行を追加します。これは、SSHデーモンに、ユーザーが公開鍵認証とチャレンジ/レスポンス認証の両方に合格する必要があることを通知します。
AuthenticationMethods publickey,keyboard-interactive
ファイルを保存して閉じます。次に、SSHデーモンのPAMルールファイルを編集します。
sudo nano /etc/pam.d/sshd
このファイルの先頭に、ChallengeResponseAuthentication
のときにパスワード認証を有効にする次の行が表示されます。 yes
に設定されています 。パスワードの代わりにSSHキーを使用するため、この行をコメントアウトする必要があります。
@include common-auth
SSHで2FAを有効にするには、次の2行を追加します。
# two-factor authentication via Google Authenticator auth required pam_google_authenticator.so
ファイルを保存して閉じます。次に、SSHデーモンを再起動して、変更を有効にします。
sudo systemctl restart ssh
今後は、SSHキーとGoogle認証システムの確認コードを使用してログインする必要があります。
メモ
- Ubuntuサーバーの各ユーザーは
google-authenticator
を実行する必要があります 二要素認証を使用するには、コマンドを実行してQRコードをスキャンします。ユーザーが設定せずにログインしようとすると、「権限が拒否されました(キーボードインタラクティブ)」というエラーメッセージが表示されます。 」が表示されます。 - 緊急スクラッチコードはバックアップコードです。電話を紛失した場合は、ワンタイムパスワードの代わりに、5つの緊急スクラッチコードのいずれかを入力して、2段階の検証を完了することができます。これらのコードは1回限りの使用です。
- 秘密鍵を変更する場合は、サーバーにログインして
google-authenticator
を実行するだけです。 もう一度コマンドを実行して、~/.google_authenticator
を更新します ファイル。 - ワンタイムパスワードは共有秘密鍵と現在の時刻を使用して計算されるため、以前は4分のタイムスキューを許可していましたが、UbuntuサーバーでNTP時刻同期を有効にして、正確な時刻を維持することをお勧めしますUbuntuサーバーとモバイルアプリの間。 UbuntuサーバーとTOTPモバイルアプリは異なるタイムゾーンを使用できます。
SSH2要素認証を無効にする方法
SSHデーモンのPAMルールファイルを編集します。
sudo nano /etc/pam.d/sshd
次の行をコメントアウトします。
auth required pam_google_authenticator.so
ファイルを保存して閉じます。 /etc/ssh/sshd_config
に次の行を追加した場合 ファイル、
AuthenticationMethods publickey,keyboard-interactive
keyboard-interactive
を削除します 認証方法。
AuthenticationMethods publickey
ファイルを保存して閉じます。次に、SSHデーモンを再起動します。
sudo systemctl restart ssh