前書き

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

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

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

  1. パスワードやセキュリティの質問など、*知っている*もの

  2. オーセンティケーターアプリやセキュリティトークンなど、*持っている*もの

  3. 指紋や声など、あなたが*している*もの

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

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

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • Ubuntu 14.04ドロップレット1つ。

  • SSHキーが追加されたsudo非ルートユーザー。https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [この初期サーバーセットアップチュートリアル]。

  • Google Authenticator(https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8[iOS]、https://play.googleなどのOATH-TOTPアプリがインストールされたスマートフォンまたはタブレット.com / store / apps / details?id = com.google.android.apps.authenticator2&hl = en [Android])。

ステップ1-libpam-google-authenticatorのインストール

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

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

最初に、Ubuntuリポジトリキャッシュを更新します。

sudo apt-get update

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

sudo apt-get install libpam-google-authenticator

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

google-authenticator

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

このPAMでは、時間ベースまたはシーケンシャルベースのトークンを使用できます。 _sequential-based tokens_を使用すると、コードは特定のポイントで開始され、使用するたびにコードが増分されます。 _時間ベースのトークン_を使用すると、特定の時間が経過するとコードがランダムに変更されます。 Google Authenticatorのようなアプリが予想しているので、時間ベースに固執します。

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

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

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

残りの質問は、PAMに機能方法を伝えます。 それらを1つずつ確認します。

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

これは基本的にキーとオプションを `+ .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)

ここで「はい」と答えると、各コードを使用後すぐに期限切れにすることで、リプレイ攻撃を防ぎます。 これにより、攻撃者が使用したばかりのコードをキャプチャしてログインすることを防ぎます。

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)

ここで「はい」と答えると、移動する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)

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

ステップ2-OpenSSHの構成

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

最初に、sshd設定ファイルを開いて、 `+ nano +`またはお好みのテキストエディターを使用して編集します。

sudo nano /etc/pam.d/sshd

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

. . .
# Standard Un*x password updating.
@include common-password

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

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

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

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
. . .

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

sudo service ssh restart

ステップ3-SSHをMFAに対応させる

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

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

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

sudo nano /etc/ssh/sshd_config

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

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

次に、ファイルの下部に次の行を追加します。 これは、どの認証方法が必要かをSSHに伝えます。

. . .
UsePAM yes

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

次に、PAM sshd構成ファイルを開きます。

sudo nano /etc/pam.d/sshd

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

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

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

sudo service ssh restart

サーバーに再度ログインしてみてください。 SSHキーで部分的に認証され、確認コードの入力を求められたことを確認する必要があります。 これは次のようになります。

ログイン出力の例

ssh @

Authenticated with partial success.
Verification code:

OAUTH-TOTP apから確認コードを入力すると、サーバーにログインします。 これで、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を介してマシンにブルートフォースすることをほぼ不可能にし、セキュリティを大幅に強化しました。あなたのマシン。