はじめに

SSH(Secure shell)は、サーバーを管理し通信するために使用される暗号化プロトコルです。Ubuntuサーバーを使用する場合、SSHを通じてサーバーに接続された端末セッションにほとんどの時間を費すことでしょう。

本ガイドでは、Ubuntu 20.04インストール用のSSHの鍵をセットアップすることに焦点を合わせます。SSHの鍵はサーバーに安全にログインする方法を提供するため、すべてのユーザーに推奨されます。

ステップ1 — 鍵のペアを作成する

ssh illustration for: ステップ1 — 鍵のペアを作成する

最初のステップでは、クライアントマシン(通常はコンピュータ)に鍵のペアを作成します。

				
					
[environment local]

ssh-keygen

				
			

デフォルトでssh-keygenの最近のバージョンは、ほとんどのユースケースで十分安全である3072ビットRSAの鍵のペアを生成します(オプションで-b 4096フラグに渡してより大きな4096ビットキーを作成できます)。

コマンドを入力すると、次の出力が表示されます。

				
					
[environment local]

[secondary_label Output]

Generating public/private rsa key pair.

Enter file in which to save the key (/<^>your_home<^>/.ssh/id_rsa):

				
			

enterを押して鍵のペアをホームディレクトリの.ssh/サブディレクトリに保存するか、別のパスを指定します。

これまでにSSHの鍵ペアを生成したことがある場合、次のプロンプトが表示されます。

				
					
[environment local]

[secondary_label Output]

/home/<^>your_home<^>/.ssh/id_rsa already exists.

Overwrite (y/n)?

				
			

ディスク上で鍵の上書きを選択している場合、前の鍵を使用して認証することはもうできません。これは元に戻せない破壊的なプロセスなので、yesを選択するときは特に注意してください。

次のプロンプトが表示されます。

				
					
[environment local]

[secondary_label Output]

Enter passphrase (empty for no passphrase):

				
			

ここで、随意に安全なパスフレーズを入力することを強くお勧めします。passphraseは、不正ユーザーがログインするのを防ぐために、セキュリティレベルを追加し高めます。セキュリティの詳細については、LinuxサーバーでSSHの鍵ベースの認証を設定する方法のチュートリアルを参考にしてください。

次のような出力が表示されます。

				
					
[environment local]

[secondary_label Output]

Your identification has been saved in /<^>your_home<^>/.ssh/id_rsa

Your public key has been saved in /<^>your_home<^>/.ssh/id_rsa.pub

The key fingerprint is:

SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host

The key's randomart image is:

+---[RSA 3072]----+

|                .|

|               + |

|              +  |

| .           o . |

|o       S   . o  |

| + o. .oo. ..  .o|

|o = oooooEo+ ...o|

|.. o *o+=.*+o....|

|    =+=ooB=o.... |

+----[SHA256]-----+

				
			

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

ステップ2 — Ubuntuサーバーに公開鍵をコピーする

Ubuntuホストに公開鍵をコピーする一番手っ取り早い方法は、ssh-copy-idと呼ばれるユーティリティを使用することです。このメソッドはとても簡単なため、利用可能であれば強く推奨します。クライアントマシンでssh-copy-idが使用できない場合、このセクションで提供されている2つの代替法(パスワードベースのSSHを介してコピーするか、鍵を手動でコピーすること)の1つを使用できます。

ssh-copy-idを使用して公開鍵をコピーする

ssh-copy-idツールは、デフォルトで多くのオペレーティングシステムに含まれているため、ローカルシステムで利用できる場合があります。この方法が動作するには、サーバーへのパスワードベースのSSHアクセスが必要です。

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

構文は次のとおりです。

				
					
ssh-copy-id <^>username<^>@<^>remote_host<^>

				
			

次のメッセージが表示されます。

				
					
[environment local]

[secondary_label Output]

The authenticity of host '<^>203.0.113.1<^> (<^>203.0.113.1<^>)' 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キーに対してローカルアカウントをスキャンします。鍵が見つかったら、リモートユーザーアカウントのパスワードを求められます。

				
					
[environment local]

[secondary_label Output]

/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

<^>username<^>@<^>203.0.113.1<^>'s password:

				
			

パスワード(セキュリティ上の目的で、入力は表示されません)とENTERを押します。ユーティリティは、提供したパスワードを使用して、リモートホストのアカウントに接続します。次に、 ~/.ssh/id_rsa.pubキーを、authorized_keysと呼ばれるリモートアカウントのホーム ~/.sshディレクトリにコピーします。

次の出力が表示されます。

				
					
[environment local]

[secondary_label Output]

Number of key(s) added: 1



Now try logging into the machine, with:   "ssh '<^>username<^>@<^>203.0.113.1<^>'"

and check to make sure that only the key(s) you wanted were added.

				
			

この時点で、id_rsa.pubキーがリモートアカウントにアップロードされました。[ステップ3](#step-3-%E2%80%94-authenticating-to-your-ubuntu-server-using-ssh-keys)に進むことができます。

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

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

catコマンドを使用して、ローカルコンピューターで公開SSHの鍵の内容を読み、リモートサーバーへSSH接続を通して繋がることで、これを行うことができます。

反対側では、~/.sshディレクトリが存在し、使用しているアカウントの下に正しい権限があることを確認できます。

次に、このディレクトリ内のauthorized_keysというファイルにパイプされたコンテンツを出力できます。このため、>> redirectシンボルを使用して、コンテンツを上書きするのではなく付加します。こうすることで、これまでに追加した鍵を破棄することなく追加されます。

フルコマンドは次のようになります。

				
					
[environment local]

cat ~/.ssh/id_rsa.pub | ssh <^>username<^>@<^>remote_host<^> "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

				
			

次のメッセージが表示されます。

				
					
[environment local]

[secondary_label Output]

The authenticity of host '<^>203.0.113.1<^> (<^>203.0.113.1<^>)' 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キーを押して続けます。

その後、リモートユーザーアカウントパスワードを入力するように求められます。

				
					
[environment local]

[secondary_label Output]

<^>username<^>@<^>203.0.113.1<^>'s password:

				
			

パスワードを入力すると、id_rsa.pubキーの内容は、リモートユーザーアカウントのauthorized_keysファイルの終わりにコピーされます。これが成功した場合、[ステップ3](#step-3-%E2%80%94-authenticating-to-your-ubuntu-server-using-ssh-keys)に進みます。

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

サーバーへのパスワードベースのSSHアクセスが利用可能な場合、手動で上記のプロセスを完了する必要があります。

id_rsa.pubファイルの内容をリモートマシンの ~/.ssh/authorized_keysファイルに手動で追加します。

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

				
					
[environment local]

cat ~/.ssh/id_rsa.pub

				
			

次のような鍵の内容が表示されます。

				
					
[environment local]

[secondary_label Output]

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

				
			

利用可能であればどのメソッドを使用しても、リモートホストにアクセスします。

リモートサーバーでアカウントにアクセスしたら、~/.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ディレクトリとauthorized_keysファイルが適切な権限セットになっていることを確認します。

				
					
chmod -R go= ~/.ssh

				
			

これにより、~/.ssh/ディレクトリのすべての「グループ」と「他の」権限が再帰的に取り除かれます。

rootアカウントを使用してユーザーアカウントの鍵をセットアップしている場合、 ~/.sshディレクトリがrootにではなくユーザーに属していることも重要です。

				
					
chown -R &lt;^&gt;sammy&lt;^&gt;:&lt;^&gt;sammy&lt;^&gt; ~/.ssh

				
			

このチュートリアルでは、ユーザーは<^>sammy<^>と名付けられていますが、適切なユーザー名を上記のコマンドに置き換える必要があります。

Ubuntuサーバーでパスワードレス認証を試みることができるようになりました。

ステップ3 — SSHの鍵を使用してUbuntuサーバーを認証する

上記の手順の一つが正常に完了した場合、リモートアカウントのパスワードを提供*せずに*、リモートホストにログインする必要があります。

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

				
					
[environment local]

ssh &lt;^&gt;username&lt;^&gt;@&lt;^&gt;remote_host&lt;^&gt;

				
			

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

				
					
[environment local]

[secondary_label Output]

The authenticity of host '&lt;^&gt;203.0.113.1&lt;^&gt; (&lt;^&gt;203.0.113.1&lt;^&gt;)' 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)? &lt;^&gt;yes&lt;^&gt;

				
			

つまり、ローカルコンピューターがリモートホストを認識していないということです。「yes」と入力して、ENTERキーを押して続けます。

秘密の鍵にパスフレーズを入力しなかった場合、直ちにログインされます。鍵を作成したときに秘密の鍵にパスフレーズを入力した場合、直ぐに入力するように求められます(セキュリティのためにキーストロークは端末セッションには表示されません)。認証後、Ubuntuサーバーで設定されたアカウントで新しいシェルセッションを開く必要があります。

キーベースの認証が成功した場合、パスワード認証を無効にすることで、システムをさらに安全にする方法を見てみましょう。

ステップ4 —サーバーでパスワード認証を無効にする

パスワードなしにSSHを使用してアカウントにログインできた場合、SH-keyベースの認証をアカウントに設定することができています。ただし、パスワードベースの認証機構はまだアクティブであり、サーバーがまだ総当り攻撃にさらされていることを意味します。

このセクションのステップを完了する前に、SSH-keyベースの認証がこのサーバーでrootアカウントに対して設定されているか、また望ましくは、SSH-keyベースの認証がsudo権限を持つこのサーバーでルート以外のアカウントに対して設定されていることを確認しますこのステップはパスワードベースのログインをロックダウンするため、管理アクセス権を持っていることがきわめて重要です。

リモートアカウントに管理権限があることを確認したら、rootとしてまたはsudo権限を持つアカウントで、リモートサーバーにログインします。次に、SSHのデーモン設定ファイルを開きます。

				
					
sudo nano /etc/ssh/sshd_config

				
			

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

				
					
[label /etc/ssh/sshd_config]

. . .

PasswordAuthentication no

. . .

				
			

CTRL+Xを押して終了したらファイルを保存して閉じ、次に、Yを押してファイルの保存を確認し、最後にENTERキーを押してnanoを終了します。これらの変更を実際にアクティブにするには、sshdサービスを再起動する必要があります。

				
					
sudo systemctl restart ssh

				
			

予防措置として、新しい端末ウィンドウを開き、SSHサービスが正しく機能していることをテストした後に現在のセッションを閉じます。

				
					
[environment local]

ssh &lt;^&gt;username&lt;^&gt;@&lt;^&gt;remote_host&lt;^&gt;

				
			

SSHサービスが適切に機能していることを確認したら、現在のすべてのサーバーセッションを安全に閉じます。

UbuntuサーバーのSSHデーモンはSSH-keyベースの認証にのみ対応します。パスワードベースのログインが無効になっています。

まとめ

これで、サーバーに SSH-key ベースの認証が設定され、アカウントパスワードを入力せずにサインインできるようになりました。

SSHを使用する方法についての詳しい情報が必要な場合は、SSHエッセンシャルガイドを参照してください。