FreeBSDサーバーでSSHキーベースの認証を設定する方法
序章
SSH(セキュアシェル)は、サーバーと通信してサーバーを管理するための安全で暗号化された方法を提供するネットワークプロトコルです。 SSHはFreeBSDサーバーを操作する最も一般的な方法であるため、サーバーを認証してログインするためのさまざまな方法をよく理解しておく必要があります。 FreeBSDサーバーにログインする方法はいくつかありますが、このチュートリアルでは、認証にSSHキーを設定して使用することに焦点を当てます。
SSHキーのしくみ
SSHサーバーは、さまざまな方法を使用してクライアントを認証できます。 最も一般的な方法には、パスワードとSSHキー認証が含まれます。 パスワードは不正アクセスに対するバリアを提供しますが、SSHキーの使用は一般的にはるかに安全です。
パスワードの問題は、通常、パスワードが手動で作成され、コンテンツの長さや複雑さが十分でないことです。 したがって、ブルートフォース攻撃によって危険にさらされる可能性があります。 SSHキーは、確実に安全な代替手段を提供します。
認証にはパスワードの代わりにSSHキーペアを使用でき、各キーペアは秘密キーと対応する公開キーで構成されます。
秘密鍵はパスワードと同様に機能し、クライアントコンピューターに保持されます。 その内容は秘密にしておく必要があります。許可されていない人があなたの秘密鍵にアクセスした場合、それは危険にさらされていると見なされ、すぐに置き換えられる必要があります。 秘密鍵は通常、少なくとも2048ビットの長さであり、オプションでパスフレーズ(基本的に秘密鍵を使用するために必要なパスワード)で暗号化して、権限のない人が鍵にアクセスした場合に使用を制限できます。
関連する公開鍵は、悪影響を与えることなく自由に共有できます。 秘密鍵のみが復号化できるメッセージを暗号化するために使用できます。これがSSH鍵認証の仕組みの基礎です。
認証に秘密鍵を使用できるようにするために、対応する公開鍵がリモートサーバー上のユーザーのアカウントにインストールされます。 公開鍵は、.ssh/authorized_keys
と呼ばれるリモートユーザーのホームディレクトリ内の特別なファイルに追加する必要があります。 クライアントがリモートサーバーに接続しようとすると、サーバーは、クライアントが許可されたキーの1つに対応する秘密キーを持っているかどうかを確認できます。秘密キーが許可された公開キーと一致することが確認された場合、クライアントは認証され、シェルセッションが開始されます。
SSHキーペアを作成する方法
SSHキー認証を設定する最初のステップは、ログイン元のコンピューターであるローカルコンピューターでSSHキーペアを生成することです。
SSHキーペアを生成するには、ssh-keygen
ユーティリティを使用できます。 デフォルトでは、2048ビットのRSAキーペアが作成されます。これはほとんどの場合に適しています。
ローカルコンピューターの端末で、次のコマンドを使用してキーペアを生成します。
ssh-keygen
次のような出力が表示されます。
Generating public/private rsa key pair. Enter file in which to save the key (/home/username/.ssh/id_rsa):
プロンプトで、デフォルトのキーの場所を受け入れるか、別のパスを入力できます。 デフォルトを受け入れると、キーはユーザーのホームディレクトリ内の.ssh
ディレクトリに保存されます。 秘密鍵はid_rsa
と呼ばれ、公開鍵はid_rsa.pub
と呼ばれます。
SSHキーを使い始めたばかりの場合は、デフォルトの場所を使用することをお勧めします。 そうすることで、SSHクライアントが認証を試みるときにSSHキーを自動的に見つけることができます。 非標準パスを選択する場合は、ここに入力します。それ以外の場合は、プロンプトを空白のままにし、RETURN
を押してデフォルトを受け入れます。
以前にSSHキーペアを生成した場合は、次のようなプロンプトが表示される場合があります。
/home/username/.ssh/id_rsa already exists. Overwrite (y/n)?
既存のキーを上書きすることを選択した場合、そのキーは削除され、認証に使用できなくなります。 つまり、どのサーバーに対しても認証する必要がないことが確実でない限り、上書きしないでください。
この時点で、パスフレーズのプロンプトが表示されます。
Created directory '/home/username/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again:
このオプションのパスフレーズは、秘密鍵を暗号化するために使用されます。 ここでパスフレーズを設定すると、認証に秘密鍵を使用するたびに必要になります。つまり、認証には秘密鍵との両方のパスフレーズが必要になります。これにより、秘密鍵がどういうわけか妥協。 パスフレーズを空白のままにすると、パスワードなしで秘密鍵を使用してサーバーにログインできるようになります。つまり、認証は秘密鍵のみに基づいて行われるため、キーは安全です。
この後、次の出力が表示されます。これにより、秘密鍵と公開鍵が作成されている場所などがわかります。
Your identification has been saved in /home/sammy/.ssh/id_rsa. Your public key has been saved in /home/sammy/.ssh/id_rsa.pub. The key fingerprint is: 76:e2:bc:19:18:b3:35:59:f4:54:b9:d3:bc:d0:56:a1 username@localcomputer The key's randomart image is: +--[ RSA 2048]----+ | . ...o.| | . o o .| | . .E.+.| | o .ooo| | o S . o..| | X + . | | o + | | + | | o | +-----------------+
公開と秘密のSSHキーのペアができたので、SSHキー認証を使用してログインするサーバーに公開キーをインストールする必要があります。
サーバーを作成するときに公開鍵を埋め込む方法
DigitalOceanコントロールパネルでは、ドロップレットの作成プロセス中に、作成中のドロップレットに1つ以上の公開SSHキーを追加するオプションがあります。 FreeBSDドロップレットの場合、この公開SSHキーは、スーパーユーザー権限を持つfreebsd
ユーザーにインストールされます。
SSHキーペアをデフォルトの場所に作成したとすると、公開キーは~/.ssh/id_rsa.pub
にあります。 公開鍵は、新しいドロップレットに追加するものです。
ローカルコンピューターで、ターミナルに次のコマンドを入力して、公開SSHキーを出力します。
cat ~/.ssh/id_rsa.pub
次に、DigitalOceanコントロールパネルから液滴作成プロセスを開始します。 ドロップレットに名前を付け、[ドロップレットの作成]ボタンの直前にある SSHキーの追加(オプション)セクションが表示されるまで、必要な選択を行います。
+SSHキーの追加リンクをクリックします。 これにより、公開SSHキーを追加できるフォームが開きます。
SSHキーの内容フィールドに、公開SSHキーの内容を貼り付けます(端末からコピーして貼り付けます)。 コメント(オプション)フィールドを使用してSSHキーにラベルを付けることもできます。 次のようになります。
次に、緑色の SSHキーの追加ボタンをクリックして、公開SSHキーをDigitalOceanアカウントに追加します。 新しく追加されたSSHが自動的に選択され(青色で強調表示)、新しいドロップレットに追加されることを示します。 次のようになります。
次に、ドロップレットの作成ボタンをクリックして、ドロップレットの作成プロセスを終了します。
選択したSSHキーは、freebsd
ユーザーのアカウントに自動的に追加されます。 サーバーが起動すると、対応する秘密鍵を使用して、freebsd
ユーザーとしてサーバーを認証できるようになります。
SSHキーがDigitalOceanアカウントに追加され、ドロップレット作成プロセス中に選択するだけで、将来作成するドロップレットに追加できるようになったことに注意してください。
公開鍵をサーバーにコピーする方法
すでにFreeBSDサーバーがあり、その作成時にSSHキーを追加しなかった場合(前のセクションで説明したように)、公開キーを追加し、秘密キーを使用してサーバーへの認証を行う方法は他にもいくつかあります。 。 それぞれの方法で同じ結果が得られ、SSHキーペアを使用してサーバー上の特定のユーザーに対して認証を行うことができます。 これらの方法のいずれかを繰り返して、複数のSSHキーをインストールできることに注意してください(対応する任意の秘密キーの所有者へのアクセスを許可します)。
最も単純なものから始めて、いくつかの異なる方法を説明します。 あなたがツールを持っていて、最も快適な方法を使うだけです。
SSH-Copy-IDを使用した公開鍵のコピー
ローカルコンピュータにssh-copy-id
ユーティリティがある場合は、それを使用して、パスワードベースのSSHアクセス権を持つリモートサーバーに公開SSHキーを簡単に追加できます。 ssh-copy-id
ユーティリティは、常にではありませんが、多くの場合、OpenSSHパッケージ(ssh
およびssh-keygen
を提供するものと同じもの)に含まれています。
ローカルコンピューターにツールがあるかどうかを確認するには、コマンドラインからssh-copy-id
を実行してみてください。 使用できない場合は、「コマンドが見つかりません」というエラーが表示されます。 ユーティリティを使用できない場合は、インストールしてインストールするか、次のサブセクションで説明する他の方法のいずれかを使用してください。
ssh-copy-id
を使用するには、リモートホストのIPアドレスまたはドメイン名、および公開SSHキーを追加するユーザーを指定する必要があります。 次のように実行できます(強調表示された部分を適切な情報に置き換えます)。
ssh-copy-id username@remote_host
次のようなメッセージが表示される場合があります。
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
これは、ローカルコンピュータがSSHを使用してリモートサーバーに接続しようとしたことがないため、リモートサーバーを認識しないことを意味します。 yes
でプロンプトに応答し、RETURN
を押して続行します。
ユーティリティは、ローカルユーザーアカウントをスキャンして、前に作成した公開鍵id_rsa.pub
を探します。 見つかったら、リモートサーバー上のユーザーのパスワードの入力を求められます。
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys [email protected]'s password:
パスワードを入力し、RETURN
を押します。 ユーティリティはリモートホストのユーザーアカウントに接続し、公開鍵id_rsa.pub
をインストールします。 キーは、公開キーの内容をリモートユーザーのホームディレクトリにある.ssh/authorized_keys
というファイルにコピーすることでインストールされます。
コピーが成功すると、次のような出力が表示されます。
Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added.
公開鍵はリモートユーザーのauthorized_keys
ファイルにインストールされているため、対応する秘密鍵(ローカルコンピューターのid_rsa
)は、リモートサーバーのユーザーへの認証として受け入れられます。
SSHキーを使用したサーバーへの認証セクションに進み、SSHキーを使用してサーバーにログインします。
SSHを使用した公開鍵のコピー
ローカルコンピューターにssh-copy-id
がないが、サーバーへのパスワードベースのSSHアクセスがある場合は、SSHクライアントを使用して公開鍵をインストールできます。
この方法は、ローカルコンピューターに公開SSHキーを出力し、SSH経由で削除サーバーにパイプすることで機能します。 リモートサーバーで、いくつかのコマンドを実行して~/.ssh
ディレクトリがまだ存在しない場合は作成し、公開鍵をauthorized_keys
というファイルに追加します。 >>
リダイレクトを使用して、authorized_keys
ファイルにキーを追加します(既に存在する場合)。リモートユーザーのアカウントに公開SSHキーが既にインストールされている場合は、許可されたキーとして上書きおよび削除されます)。
公開鍵のデフォルト名がid_rsa.pub
であるとすると、公開SSH鍵をインストールするコマンドは次のとおりです(リモートユーザーとホストを置き換えます)。
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
次のようなメッセージが表示される場合があります。
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
これは、ローカルコンピュータがSSHを使用してリモートサーバーに接続しようとしたことがないため、リモートサーバーを認識しないことを意味します。 yes
でプロンプトに応答し、RETURN
を押して続行します。
これで、リモートユーザーのパスワードの入力を求められます。
[email protected]'s password:
パスワードを入力し、RETURN
を押します。 コマンドが正常に実行された場合、フィードバックは送信されません。 公開鍵であるid_rsa.pub
の内容は、リモートユーザーのauthorized_keys
ファイルの最後に追加されます。
SSHキーを使用したサーバーへの認証セクションに進み、SSHキーを使用してサーバーにログインします。
公開鍵を手動でコピーする
公開鍵を手動でインストールする場合は、SSHまたはコンソールアクセスを使用してインストールできます。 公開鍵をインストールするユーザーとしてリモートサーバーにログインする必要があります。
基本的なプロセスは、公開SSHキーとid_rsa.pub
のコンテンツを取得し、リモートホスト上のユーザーのホームディレクトリにある.ssh/authorized_keys
ファイルに追加することです。
まず、リモートサーバーにログインします。 DigitalOceanコントロールパネルのコンソールを使用していない場合は、次のコマンドを使用してSSH経由で接続します。
ssh username@remote_host
次のようなメッセージが表示される場合があります。
The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe. Are you sure you want to continue connecting (yes/no)? yes
これは、ローカルコンピュータがSSHを使用してリモートサーバーに接続しようとしたことがないため、リモートサーバーを認識しないことを意味します。 yes
でプロンプトに応答し、RETURN
を押して続行します。
これで、リモートユーザーのパスワードの入力を求められます。
Password for [email protected]:
ここで、リモートユーザーのホームディレクトリに.ssh
ディレクトリがまだ存在しない場合は、作成する必要があります。 このコマンドはまさにそれを行います:
mkdir -p ~/.ssh
ローカルコンピューターで、ターミナルに次のコマンドを入力して、公開SSHキーを出力します。
cat ~/.ssh/id_rsa.pub
出力をクリップボードにコピーしてから、選択したテキストエディタでauthorized_keys
ファイルを開きます。 ここではee
を使用します。
ee ~/.ssh/authorized_keys
公開鍵をauthorized_keys
ファイルに貼り付け、保存して終了します。 ee
を使用している場合は、ESC
、a
、a
の順に押して保存して終了します。
これで、公開SSHキーがリモートサーバーにインストールされました。 次のセクションに進み、SSHキーを使用してサーバーにログインします。
SSHキーを使用してサーバーを認証する
上記の方法のいずれかを使用してFreeBSDサーバーに公開SSHキーを正常にインストールした場合、キー認証を使用してサーバーにログインできるはずです。 つまり、ログインするためにリモートユーザーのパスワードは不要になります。
SSHを使用してリモートサーバーにログインしてみます。
ssh username@remote_host
パスフレーズを使用してSSHキーペアを作成しなかった場合は、すぐにログインします。 パスフレーズを使用してキーペアを作成した場合は、入力を求められます。
サーバーにログインしている場合は、SSHキーが正常にインストールされたことを意味します。
このユーザーに対して、パスワードとキーベースの認証の両方が有効になっていることに注意してください。 サーバーのパスワード認証を無効にし、ログインにSSHキーを要求することでサーバーの安全性を高めたい場合は、次のセクションをお読みください。
サーバーでのパスワード認証の無効化
パスワードなしでSSHを使用してアカウントにログインできた場合は、アカウントにSSHキーベースの認証が正常に構成されています。 ただし、パスワードベースの認証メカニズムは引き続きアクティブです。つまり、サーバーはブルートフォース攻撃にさらされたままです。
このセクションの手順を完了する前に、このサーバーのrootアカウントにSSHキーベースの認証が構成されていること、またはできれば、sudoアクセスを使用してこのサーバーのアカウントにSSHキーベースの認証が構成されていることを確認してください。 この手順では、パスワードベースのログインがロックダウンされるため、管理者アクセスを引き続き取得できるようにすることが重要です。
上記の条件が満たされたら、rootとして、またはsudo権限を持つアカウントを使用して、SSHキーを使用してリモートサーバーにログインします。 SSHデーモンの構成ファイルを開きます。
sudo ee /etc/ssh/sshd_config
ファイルで、ChallengeResponseAuthentication
というディレクティブを見つけます。 コメントアウトされる場合があります。 #
文字を削除して行のコメントを解除し、値を「no」に設定します。 完了すると、次のようになります。
ChallengeResponseAuthentication no
ファイルを保存して閉じます。 ee
を使用している場合は、ESC
、a
、a
の順に押して保存して終了します。
変更を有効にするには、sshd
サービスを再起動する必要があります。 FreeBSDでSSHデーモンを再起動するには、次のコマンドを使用します。
sudo service sshd restart
パスワード認証が無効になっているため、サーバーへのSSHアクセスではSSHキー認証を使用する必要があります。
結論
これで、FreeBSDサーバーでSSHキーベースの認証が実行され、ユーザーパスワードを入力せずにログインできるようになります。 ここから、FreeBSDサーバーの保護についてもっと読みたいと思うかもしれません。 SSHの操作について詳しく知りたい場合は、SSHエッセンシャルガイドをご覧ください。