LinuxサーバーでSSHキーベース認証を構成する方法

前書き

SSH(セキュアシェル)は、サーバーの管理と通信に使用される暗号化されたプロトコルです。 Linuxサーバーを使用する場合、ほとんどの時間はSSHを介してサーバーに接続されたターミナルセッションで過ごすことになります。

SSHサーバーにログインする方法はいくつかありますが、このガイドでは、SSHキーのセットアップに焦点を当てます。 SSHキーは、簡単でありながら非常に安全な方法でサーバーにログインします。 このため、これはすべてのユーザーに推奨される方法です。

SSHキーの仕組み

SSHサーバーは、さまざまな方法を使用してクライアントを認証できます。 これらの最も基本的なものはパスワード認証です。これは使いやすいですが、最も安全ではありません。

パスワードは安全な方法でサーバーに送信されますが、通常は複雑ではなく、繰り返し持続的な攻撃に耐えられるほど長くはありません。 自動化されたスクリプトと組み合わされた最新の処理能力により、パスワードで保護されたアカウントのブルートフォースが非常に可能になります。 セキュリティを追加する方法は他にもありますが(fail2banなど)、SSHキーは信頼性が高く安全な代替手段であることが証明されています。

SSHキーペアは、クライアントをSSHサーバーに対して認証するために使用できる2つの暗号的に安全なキーです。 各キーペアは、公開キーと秘密キーで構成されます。

秘密鍵はクライアントによって保持され、絶対に秘密にしておく必要があります。 秘密キーが侵害されると、攻撃者は追加の認証なしで関連する公開キーで構成されたサーバーにログインできます。 追加の予防策として、キーはパスフレーズを使用してディスク上で暗号化できます。

関連付けられた公開鍵は、マイナスの影響なしに自由に共有できます。 公開鍵は、秘密鍵が復号化できるonlyのメッセージを暗号化するために使用できます。 このプロパティは、キーペアを使用して認証する方法として使用されます。

公開鍵は、SSHでログインできるようにするリモートサーバーにアップロードされます。 キーは、ログインするユーザーアカウント内の~/.ssh/authorized_keysという特別なファイルに追加されます。

クライアントがSSHキーを使用して認証しようとすると、サーバーはクライアントがプライベートキーを所有しているかどうかをテストできます。 クライアントがプライベートキーを所有していることを証明できる場合、シェルセッションが生成されるか、要求されたコマンドが実行されます。

SSHキーを作成する方法

サーバーへのSSHキー認証を構成する最初のステップは、ローカルコンピューターでSSHキーペアを生成することです。

これを行うには、ssh-keygenと呼ばれる特別なユーティリティを使用できます。これは標準のOpenSSHツールスイートに含まれています。 デフォルトでは、これにより2048ビットのRSAキーペアが作成されますが、これはほとんどの用途に適しています。

ローカルコンピューターで、次のように入力してSSHキーペアを生成します。

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キーを自動的に見つけることができます。 非標準のパスを選択する場合は、ここで入力します。そうでない場合は、Enterキーを押してデフォルトを受け入れます。

以前にSSHキーペアを生成したことがある場合は、次のようなプロンプトが表示される場合があります。

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

ディスク上のキーを上書きすることを選択した場合、notは以前のキーを使用して認証できるようになります。 「はい」を選択するときは、これは元に戻せない破壊的なプロセスなので、非常に注意してください。

Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

次に、キーのパスフレーズを入力するように求められます。 これは、ディスク上の秘密鍵ファイルを暗号化するために使用できるオプションのパスフレーズです。

パスフレーズを入力する必要がある場合、SSHキーがどのような利点を提供するのか疑問に思うかもしれません。 利点のいくつかは次のとおりです。

  • プライベートSSHキー(パスフレーズで保護できる部分)は、ネットワーク上で公開されることはありません。 パスフレーズは、ローカルマシン上のキーを復号化するためにのみ使用されます。 これは、ネットワークベースのブルートフォースがパスフレーズに対して不可能であることを意味します。

  • 秘密鍵は制限されたディレクトリ内に保持されます。 SSHクライアントは、制限されたディレクトリに保持されていない秘密鍵を認識しません。 キー自体にも制限されたアクセス許可が必要です(所有者のみが読み取りおよび書き込み可能)。 これは、システム上の他のユーザーがスヌープできないことを意味します。

  • 秘密のSSHキーパスフレーズを解読しようとする攻撃者は、すでにシステムにアクセスできる必要があります。 これは、ユーザーアカウントまたはルートアカウントに既にアクセスできることを意味します。 この位置にいる場合、パスフレーズは攻撃者がすぐに他のサーバーにログインするのを防ぐことができます。 これにより、新しいSSHキーペアを作成および実装し、侵害されたキーからアクセスを削除する時間が得られます。

秘密鍵は決して​​ネットワークに公開されることはなく、ファイルのアクセス許可によって保護されているため、このファイルには、あなた(およびルートユーザー)以外の誰もアクセスすることはできません。 パスフレーズは、これらの条件が侵害された場合の追加の保護層として機能します。

パスフレーズはオプションの追加です。 入力した場合、このキーを使用するたびに入力する必要があります(復号化キーを保存するSSHエージェントソフトウェアを実行している場合を除く)。 パスフレーズを使用することをお勧めしますが、パスフレーズを設定したくない場合は、Enterキーを押すだけでこのプロンプトをバイパスできます。

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

これで、認証に使用できる公開鍵と秘密鍵ができました。 次のステップは、SSH鍵認証を使用してログインできるように、公開鍵をサーバーに配置することです。

サーバーを作成するときに公開キーを埋め込む方法

新しいDigitalOceanサーバーを起動する場合、SSH公開キーを新しいサーバーのルートアカウントに自動的に埋め込むことができます。

ドロップレット作成ページの下部に向かって、サーバーにSSHキーを追加するオプションがあります。

SSH key embed

DigitalOceanアカウントに公開キーファイルを既に追加している場合は、選択可能なオプションとしてここに表示されます(上記の例には「作業キー」と「ホームキー」の2つの既存のキーがあります)。 既存のキーを埋め込むには、クリックするだけで強調表示されます。 単一のサーバーに複数のキーを埋め込むことができます。

SSH key selection

アカウントにSSH公開キーをまだアップロードしていない場合、またはアカウントに新しいキーを追加する場合は、「+ SSHキーを追加」ボタンをクリックします。 これはプロンプトに展開されます:

SSH key prompt

[SSH Key content]ボックスに、SSH公開キーのコンテンツを貼り付けます。 上記の方法を使用してキーを生成したと仮定すると、ローカルコンピューターで公開キーの内容を取得するには、次のように入力します。

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]

この値全体を大きなボックスに貼り付けます。 [コメント(オプション)]ボックスで、キーのラベルを選択できます。 これは、DigitalOceanインターフェースのキー名として表示されます。

SSH new key

ドロップレットを作成すると、選択した公開SSHキーがrootユーザーのアカウントの~/.ssh/authorized_keysファイルに配置されます。 これにより、秘密鍵を使用してコンピューターからサーバーにログインできます。

公開キーをサーバーにコピーする方法

サーバーが既に利用可能であり、作成時にキーを埋め込まなかった場合でも、公開キーをアップロードして、サーバーへの認証に使用できます。

使用する方法は、使用可能なツールと現在の構成の詳細に大きく依存します。 次のメソッドはすべて同じ最終結果をもたらします。 最も簡単で最も自動化された方法が最初であり、上記の方法を使用できない場合、それぞれに続く方法では追加の手動手順が必要です。

SSH-Copy-IDを使用した公開キーのコピー

公開鍵を既存のサーバーにコピーする最も簡単な方法は、ssh-copy-idというユーティリティを使用することです。 単純であるため、使用可能な場合はこの方法をお勧めします。

ssh-copy-idツールは多くのディストリビューションのOpenSSHパッケージに含まれているため、ローカルシステムで使用できる場合があります。 この方法が機能するには、サーバーへのパスワードベースのSSHアクセスが既に必要です。

このユーティリティを使用するには、接続するリモートホストと、パスワードSSHアクセスのあるユーザーアカウントを指定するだけです。 これは、公開SSHキーがコピーされるアカウントです。

構文は次のとおりです。

ssh-copy-id username@remote_host

次のようなメッセージが表示される場合があります。

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

これは、ローカルコンピューターがリモートホストを認識しないことを意味します。 これは、新しいホストに初めて接続したときに発生します。 「yes」と入力し、Enterキーを押して続行します。

次に、ユーティリティはローカルアカウントをスキャンして、前に作成した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:

パスワードを入力し(セキュリティ上の理由から入力は表示されません)、Enterキーを押します。 ユーティリティは、指定したパスワードを使用してリモートホストのアカウントに接続します。 次に、~/.ssh/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.

この時点で、id_rsa.pubキーがリモートアカウントにアップロードされています。 次のセクションに進むことができます。

SSHを使用して公開キーをコピーする

使用可能なssh-copy-idがないが、サーバー上のアカウントへのパスワードベースのSSHアクセスがある場合は、従来のSSH方式を使用してキーをアップロードできます。

これを行うには、ローカルコンピューターで公開SSHキーのコンテンツを出力し、リモートサーバーへのSSH接続を介してパイプします。 反対側では、使用しているアカウントの下に~/.sshディレクトリが存在することを確認してから、パイプしたコンテンツをこのディレクトリ内のauthorized_keysというファイルに出力できます。

>>リダイレクト記号を使用して、コンテンツを上書きする代わりに追加します。 これにより、以前に追加したキーを破棄せずにキーを追加できます。

完全なコマンドは次のようになります。

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

次のようなメッセージが表示される場合があります。

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

これは、ローカルコンピューターがリモートホストを認識しないことを意味します。 これは、新しいホストに初めて接続したときに発生します。 「yes」と入力し、Enterキーを押して続行します。

その後、接続しようとしているアカウントのパスワードの入力を求められます:

[email protected]'s password:

パスワードを入力すると、id_rsa.pubキーの内容が、リモートユーザーのアカウントのauthorized_keysファイルの末尾にコピーされます。 これが成功した場合は、次のセクションに進みます。

公開キーを手動でコピーする

サーバーへのパスワードベースのSSHアクセスが利用できない場合は、上記のプロセスを手動で行う必要があります。

id_rsa.pubファイルの内容は、何らかの方法でリモートマシンの~/.ssh/authorized_keysにあるファイルに追加する必要があります。

id_rsa.pubキーの内容を表示するには、ローカルコンピューターに次のように入力します。

cat ~/.ssh/id_rsa.pub

キーのコンテンツが表示されます。これは次のようになります。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

使用可能な方法を使用して、リモートホストにアクセスします。 たとえば、サーバーがDigitalOcean Dropletの場合、コントロールパネルのWebコンソールを使用してログインできます。

DigitalOcean console access

リモートサーバー上のアカウントにアクセスできるようになったら、~/.sshディレクトリが作成されていることを確認する必要があります。 このコマンドは、必要に応じてディレクトリを作成するか、既に存在する場合は何もしません:

mkdir -p ~/.ssh

これで、このディレクトリ内のauthorized_keysファイルを作成または変更できます。 id_rsa.pubファイルの内容をauthorized_keysファイルの最後に追加し、必要に応じて次のコマンドを使用して作成できます。

echo public_key_string >> ~/.ssh/authorized_keys

上記のコマンドで、public_key_stringを、ローカルシステムで実行したcat ~/.ssh/id_rsa.pubコマンドからの出力に置き換えます。 ssh-rsa AAAA...で始まる必要があります。

これが機能する場合は、パスワードなしで認証を試みるために進むことができます。

SSHキーを使用してサーバーを認証する

上記の手順のいずれかを正常に完了すると、リモートホストwithoutのリモートアカウントのパスワードにログインできるようになります。

基本的なプロセスは同じです:

ssh username@remote_host

このホストに初めて接続する場合(上記の最後の方法を使用した場合)、次のように表示されます。

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

これは、ローカルコンピューターがリモートホストを認識しないことを意味します。 「yes」と入力し、Enterキーを押して続行します。

秘密鍵のパスフレーズを指定しなかった場合、すぐにログインされます。 キーを作成したときに秘密キーのパスフレーズを指定した場合は、ここで入力する必要があります。 その後、リモートシステムのアカウントで新しいシェルセッションが生成されます。

成功した場合は、サーバーをロックダウンする方法を見つけます。

サーバーでパスワード認証を無効にする

パスワードなしでSSHを使用してアカウントにログインできた場合、アカウントへのSSHキーベースの認証は正常に設定されています。 ただし、パスワードベースの認証メカニズムはまだアクティブであるため、サーバーはブルートフォース攻撃にさらされています。

このセクションの手順を完了する前に、このサーバーのルートアカウントにSSHキーベースの認証が構成されていること、またはできれば、sudoを使用してこのサーバーのアカウントにSSHキーベースの認証が構成されていることを確認してください。 )sアクセス。 この手順により、パスワードベースのログインがロックダウンされるため、管理アクセスを取得できるようにすることが不可欠です。

上記の条件が満たされたら、rootとして、またはsudo権限を持つアカウントを使用して、SSHキーを使用してリモートサーバーにログインします。 SSHデーモンの構成ファイルを開きます。

sudo nano /etc/ssh/sshd_config

ファイル内で、PasswordAuthenticationというディレクティブを検索します。 これはコメントアウトされる場合があります。 行のコメントを解除し、値を「no」に設定します。 これにより、アカウントパスワードを使用してSSH経由でログインする機能が無効になります。

PasswordAuthentication no

完了したら、ファイルを保存して閉じます。 行った変更を実際に実装するには、サービスを再起動する必要があります。

UbuntuまたはDebianマシンでは、次のコマンドを発行できます。

sudo service ssh restart

CentOS / Fedoraマシンでは、デーモンはsshdと呼ばれます。

sudo service sshd restart

この手順を完了すると、SSHキーのみに応答するようにSSHデーモンを正常に移行できました。

結論

これで、サーバーでSSHキーベースの認証を構成して実行し、アカウントパスワードを入力せずにサインインできるようになります。 ここから、あなたが向かうことができる多くの方向があります。 SSHの操作について詳しく知りたい場合は、SSH essentials guideをご覧ください。