この記事はUbuntu16.04用に更新されました。 更新されたバージョンには、基本的なセットアップを超える方法に関する追加情報も含まれています。

序章

認証要素は、システムへのログインなどのアクションを実行する権限があることを証明するために使用される単一の情報です。 認証チャネルは、認証システムがユーザーに要素を配信する方法、またはユーザーに応答を要求する方法です。 パスワードとセキュリティトークンは、認証要素の例です。 コンピュータと電話はチャネルの例です。

SSHはデフォルトで認証にパスワードを使用し、ほとんどのSSH強化手順では、代わりにSSHキーを使用することを推奨しています。 ただし、これはまだ1つの要因にすぎません。 悪意のある攻撃者がコンピュータを侵害した場合、彼らはあなたのキーを使用してサーバーも侵害する可能性があります。

これに対抗するために、このチュートリアルでは、多要素認証を設定します。 多要素認証(MFA)は、認証またはログインするために複数の要素を必要とします。 これは、悪意のある攻撃者が侵入するために、コンピュータと電話の両方など、複数のものを危険にさらす必要があることを意味します。 さまざまなタイプの要因は、多くの場合、次のように要約されます。

  1. パスワードやセキュリティ保護用の質問など、知っている
  2. オーセンティケーターアプリやセキュリティトークンなど、持っているもの
  3. 指紋や声など、あなたがしているもの

一般的な要因の1つは、Google認証システムのようなOATH-TOTPアプリです。 OATH-TOTP (オープン認証時間ベースのワンタイムパスワード)は、ワンタイム使用パスワード(通常は30秒ごとに再利用される6桁の数字)を生成するオープンプロトコルです。

この記事では、SSHキーに加えてOATH-TOTPアプリを使用してSSH認証を有効にする方法について説明します。 SSH経由でサーバーにログインするには、2つのチャネルで2つの要素が必要になるため、パスワードまたはSSHキーのみの場合よりも安全になります。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—libpam-google-authenticatorをインストールする

このステップでは、GoogleのPAMをインストールして構成します。

Pluggable Authentication Module の略であるPAMは、Linuxシステムでユーザーを認証するために使用される認証インフラストラクチャです。 GoogleはOATH-TOTPアプリを作成したため、TOTPを生成し、OATH-TOTPアプリと完全に互換性のあるPAMも作成しました。

まず、Ubuntuのリポジトリキャッシュを更新します。

  1. sudo apt-get update

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

  1. sudo apt-get install libpam-google-authenticator

PAMがインストールされたら、PAMとともにインストールされたヘルパーアプリを使用して、2番目の要素を追加するユーザーのTOTPキーを生成します。 このキーは、システム全体ではなく、ユーザーごとに生成されます。 つまり、TOTP認証アプリを使用するすべてのユーザーは、ログインしてヘルパーアプリを実行し、自分のキーを取得する必要があります。

  1. google-authenticator

コマンドを実行すると、いくつかの質問が表示されます。 最初の質問は、認証トークンを時間ベースにする必要があるかどうかを尋ねます。

このPAMは、時間ベースまたは順次ベースのトークンを許可します。 シーケンシャルベースのトークンを使用するということは、コードが特定のポイントで開始し、使用するたびにコードをインクリメントすることを意味します。 時間ベースのトークンを使用するということは、特定の時間が経過するとコードがランダムに変化することを意味します。 Google Authenticatorのようなアプリが予想するのは時間ベースであるため、時間ベースを使用します。そのため、「はい」と答えます。

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

この質問に答えた後、大きなQRコードを含む多くの出力がスクロールして通過します。 秘密鍵、確認コード、緊急スクラッチコードは、パスワードマネージャーなどの安全な場所に必ず記録してください。

この時点で、携帯電話の認証システムアプリを使用してQRコードをスキャンするか、秘密鍵を手動で入力します。 QRコードが大きすぎてスキャンできない場合は、QRコードの上にあるURLを使用して小さいバージョンを取得できます。 追加すると、アプリ内で30秒ごとに変化する6桁のコードが表示されます。

残りの質問は、PAMに機能する方法を通知します。 それらを1つずつ見ていきます。

Do you want me to update your "~/.google_authenticator" file (y/n) y

これは基本的にキーとオプションを.google_authenticatorファイルに書き込みます。 いいえと答えると、プログラムは終了し、何も書き込まれません。これは、オーセンティケーターが機能しないことを意味します。

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, tokens are good for 30 seconds and 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. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n

ここで「はい」と答えると、移動する4分のウィンドウで最大8つの有効なコードが許可されます。 「いいえ」と答えると、1:30分のローリングウィンドウで有効なコードが3つに制限されます。 1:30分の時間枠で問題が見つからない限り、これ以上安全な選択はありません。

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) y

レート制限とは、リモートの攻撃者がブロックされる前に特定の数の推測しか試行できないことを意味します。 以前にSSHに直接レート制限を設定していない場合は、今すぐ設定することは優れた強化手法です。

ステップ2—OpenSSHの構成

次のステップは、TOTPキーを使用するようにSSHを構成することです。 SSHにPAMについて通知し、それを使用するようにSSHを構成する必要があります。

まず、nanoまたはお気に入りのテキストエディタを使用して編集するためにsshd構成ファイルを開きます。

  1. sudo nano /etc/pam.d/sshd

ファイルの最後に次の行を追加します。

. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

最後の「nullok」という単語は、この認証方法がオプションであることをPAMに伝えます。 これにより、OATH-TOTPキーを持たないユーザーでも、SSHキーを使用してログインできます。 すべてのユーザーがOATH-TOTPキーを取得したら、この行の「nullok」を削除してMFAを必須にすることができます。

ファイルを保存して閉じます。

次に、この種の認証をサポートするようにSSHを構成します。 SSH構成ファイルを開いて編集します。

  1. sudo nano /etc/ssh/sshd_config

ChallengeResponseAuthenticationを探し、その値をyesに設定します。

. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
. . .

ファイルを保存して閉じてから、SSHを再起動して構成ファイルを再ロードします。

  1. sudo service ssh restart

ステップ3—SSHにMFAを認識させる

このステップでは、SSHキーが機能するかどうかをテストします。

まず、別の端末を開いて、今すぐサーバーにSSHで接続してみてください。 確認コードやパスワードを入力せずに、SSHキーを使用してこの2番目のセッションにログインしたことがわかります。 これは、SSHキーがデフォルトで他のすべての認証オプションを上書きするためです。 SSHにTOTPコードを使用し、パスワードの代わりにSSHキーを使用するように指示する必要があります。

ここで、sshd構成ファイルを再度開きます。

  1. sudo nano /etc/ssh/sshd_config

PasswordAuthentication行を見つけ、行の先頭にある#文字を削除してコメントを解除し、その値をnoに更新します。 これは、SSHにパスワードの入力を求めないように指示します。

. . .
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
. . .

次に、ファイルの最後に次の行を追加します。 これにより、SSHにどの認証方法が必要かが通知されます。

. . .
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive

ファイルを保存して閉じます。

次に、PAMsshd設定ファイルを開きます。

  1. sudo nano /etc/pam.d/sshd

@include common-auth行を見つけて、その行の最初の文字として#文字を追加してコメントアウトします。 これは、PAMにパスワードの入力を求めないように指示します。 以前、SSHにsshd_configで使用しないように指示しました。

. . .
# Standard Un*x authentication.
#@include common-auth
. . .

ファイルを保存して閉じてから、SSHを再起動します。

  1. sudo service ssh restart

ここで、サーバーへのログインを再試行してください。 SSHキーで部分的に認証された後、確認コードの入力を求められたことがわかります。 次のようになります。

ログイン出力の例
ssh sammy@your_server_ip

Authenticated with partial success.
Verification code:

OAUTH-TOTPアプリから確認コードを入力すると、サーバーにログインします。 これで、SSHに対してMFAが有効になりました。

結論

強化して保護する他のシステムと同様に、そのセキュリティを管理する責任はユーザーにあります。 この場合、それはSSHキーまたはTOTP秘密キーを失わないことを意味します。 ただし、場合によっては事態が発生し、キーを制御できなくなってしまう可能性があります。

サーバーへのアクセスを回復するためのいくつかの提案を次に示します。

  • TOTPアプリを紛失した場合、またはアクセスできない場合は、リカバリコードを確認コードとして使用してください。 これは、新しい電話を入手して古い電話からキーをエクスポートするのを忘れた場合、または電話の電源が切れた場合に発生します。

  • 秘密鍵とバックアップを紛失した場合は、DigitalOceanコントロールパネルからコンソールを使用してログインします。 次に、ファイルの名前を変更するか、ファイル~/.google_authenticatorを削除します。 これにより、PAMが構成を認識せず、コードの入力を求められなくなります。 手順2のように、/etc/pam.d/sshdに「nullok」が追加されていることを確認します。 これを変更する場合は、必ずSSHを再起動してください。

  • SSHキーを紛失した場合は、コンソールを再度使用してログインし、~/.ssh/authorized_hostsから古いパブリックを削除します。 次に、それを新しいキーに置き換えることができます。

2つのチャネル(コンピューター+電話)に2つの要素(SSHキー+ MFAトークン)を配置することで、外部エージェントがSSH経由でマシンにブルートフォース攻撃を仕掛けることをほぼ不可能にし、セキュリティを大幅に向上させました。あなたのマシン。