前書き
SSH(セキュアシェル)は、サーバーの管理と通信に使用される暗号化されたプロトコルです。 Ubuntuサーバーを使用する場合、ほとんどの時間をSSHを介してサーバーに接続されたターミナルセッションに費やす可能性があります。
このガイドでは、バニラUbuntu 18.04インストール用のSSHキーのセットアップに焦点を当てます。 SSHキーは、サーバーへの簡単で安全なログイン方法を提供し、すべてのユーザーに推奨されます。
[[step-1 -—- create-the-rsa-key-pair]] ==ステップ1—RSAキーペアを作成します
最初のステップは、クライアントマシン(通常はコンピューター)でキーペアを作成することです。
ssh-keygen
デフォルトでは、ssh-keygen
は2048ビットのRSAキーペアを作成します。これはほとんどのユースケースで十分に安全です(オプションで-b 4096
フラグを渡して、より大きな4096ビットキーを作成できます)。
コマンドを入力すると、次の出力が表示されます。
OutputGenerating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
Enterキーを押して、キーペアをホームディレクトリの.ssh/
サブディレクトリに保存するか、代替パスを指定します。
以前にSSHキーペアを生成していた場合、次のプロンプトが表示される場合があります。
Output/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?
ディスク上のキーを上書きすることを選択した場合、notは以前のキーを使用して認証できるようになります。 「はい」を選択するときは、これは元に戻せない破壊的なプロセスなので、非常に注意してください。
その後、次のプロンプトが表示されます。
OutputEnter passphrase (empty for no passphrase):
ここでは、オプションで安全なパスフレーズを入力できますが、これを強くお勧めします。 パスフレーズは、セキュリティのレイヤーを追加して、権限のないユーザーがログインするのを防ぎます。 セキュリティの詳細については、How To Configure SSH Key-Based Authentication on a Linux Serverに関するチュートリアルを参照してください。
次の出力が表示されます。
OutputYour 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:
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キーベースの認証を使用してログインできるように、サーバーに公開キーを配置することです。
[[step-2 -—- copy-the-public-key-to-ubuntu-server]] ==ステップ2—公開鍵をUbuntuサーバーにコピーします
公開鍵をUbuntuホストにコピーする最も簡単な方法は、ssh-copy-id
というユーティリティを使用することです。 単純であるため、この方法は可能であれば強くお勧めします。 クライアントマシンで使用可能なssh-copy-id
がない場合は、このセクションで提供されている2つの代替方法(パスワードベースのSSHを介したコピー、または手動でのキーのコピー)のいずれかを使用できます。
ssh-copy-id
を使用した公開鍵のコピー
ssh-copy-id
ツールは、多くのオペレーティングシステムにデフォルトで含まれているため、ローカルシステムで使用できる場合があります。 この方法が機能するには、サーバーへのパスワードベースのSSHアクセスが既に必要です。
このユーティリティを使用するには、接続するリモートホストと、パスワードSSHアクセスのあるユーザーアカウントを指定するだけです。 これは、公開SSHキーのコピー先のアカウントです。
構文は次のとおりです。
ssh-copy-id username@remote_host
次のメッセージが表示される場合があります。
OutputThe 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
キーを探します。 キーが見つかると、リモートユーザーのアカウントのパスワードの入力を求められます。
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
[email protected]'s password:
パスワードを入力し(セキュリティ上の理由から、入力内容は表示されません)、ENTER
を押します。 ユーティリティは、指定したパスワードを使用してリモートホストのアカウントに接続します。 次に、~/.ssh/id_rsa.pub
キーの内容を、リモートアカウントのホーム~/.ssh
ディレクトリ内のauthorized_keys
というファイルにコピーします。
次のような出力が表示されるはずです。
OutputNumber 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
キーがリモートアカウントにアップロードされています。 Step 3に進むことができます。
SSHを使用した公開キーのコピー
使用可能なssh-copy-id
がないが、サーバー上のアカウントへのパスワードベースのSSHアクセスがある場合は、従来のSSH方式を使用してキーをアップロードできます。
これを行うには、cat
コマンドを使用してローカルコンピューター上の公開SSHキーの内容を読み取り、SSH接続を介してリモートサーバーにパイプします。
反対に、~/.ssh
ディレクトリが存在し、使用しているアカウントで正しい権限を持っていることを確認できます。
次に、パイプしたコンテンツをこのディレクトリ内のauthorized_keys
というファイルに出力できます。 >>
リダイレクト記号を使用して、コンテンツを上書きするのではなく追加します。 これにより、以前に追加したキーを破棄せずにキーを追加できます。
完全なコマンドは次のようになります。
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
次のメッセージが表示される場合があります。
OutputThe 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
を押して続行します。
その後、リモートユーザーアカウントのパスワードを入力するように求められます。
[email protected]'s password:
パスワードを入力すると、id_rsa.pub
キーの内容が、リモートユーザーのアカウントのauthorized_keys
ファイルの末尾にコピーされます。 これが成功した場合は、Step 3に進みます。
公開キーを手動でコピーする
サーバーへのパスワードベースのSSHアクセスが利用できない場合は、上記のプロセスを手動で完了する必要があります。
id_rsa.pub
ファイルの内容をリモートマシンの~/.ssh/authorized_keys
ファイルに手動で追加します。
id_rsa.pub
キーの内容を表示するには、ローカルコンピューターに次のように入力します。
cat ~/.ssh/id_rsa.pub
キーのコンテンツが表示され、次のようになります。
Outputssh-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 sammy:sammy ~/.ssh
このチュートリアルでは、ユーザーの名前はsammyですが、上記のコマンドに適切なユーザー名を代入する必要があります。
これで、Ubuntuサーバーでパスワードなしの認証を試みることができます。
[[step-3 -—- authenticate-to-ubuntu-server-using-ssh-keys]] ==ステップ3—SSHキーを使用してUbuntuサーバーに認証する
上記の手順のいずれかを正常に完了すると、リモートホストwithoutのリモートアカウントのパスワードにログインできるようになります。
基本的なプロセスは同じです:
ssh username@remote_host
このホストに初めて接続する場合(上記の最後の方法を使用した場合)、次のように表示されます。
OutputThe 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
を押して続行します。
秘密鍵のパスフレーズを指定しなかった場合、すぐにログインされます。 キーを作成したときに秘密キーのパスフレーズを指定した場合、ここで入力するように求められます(セキュリティのために、キーストロークはターミナルセッションに表示されないことに注意してください)。 認証後、Ubuntuサーバーで構成されたアカウントで新しいシェルセッションが開きます。
キーベースの認証が成功した場合は、パスワード認証を無効にしてシステムをさらに保護する方法を引き続き学習してください。
[[step-4 -—- disable-password-authentication-on-your-server]] ==ステップ4—サーバーでパスワード認証を無効にする
パスワードなしでSSHを使用してアカウントにログインできた場合、SSHキーベースの認証をアカウントに正常に設定できました。 ただし、パスワードベースの認証メカニズムはまだアクティブであるため、サーバーはブルートフォース攻撃にさらされています。
このセクションの手順を完了する前に、このサーバーのルートアカウントにSSHキーベースの認証が構成されていること、またはできれば、このサーバーの非ルートアカウントにSSHキーベースの認証が構成されていることを確認してください。 sudo
特権を持つサーバー。 この手順により、パスワードベースのログインがロックダウンされるため、管理アクセスを取得できるようにすることが重要です。
リモートアカウントに管理者権限があることを確認したら、rootとして、またはsudo
権限を持つアカウントを使用して、SSHキーを使用してリモートサーバーにログインします。 次に、SSHデーモンの構成ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイル内で、PasswordAuthentication
というディレクティブを検索します。 これはコメントアウトされる場合があります。 行のコメントを解除し、値を「no」に設定します。 これにより、アカウントパスワードを使用してSSH経由でログインする機能が無効になります。
/etc/ssh/sshd_config
...
PasswordAuthentication no
...
終了したら、CTRL
+X
、次にY
を押してファイルの保存を確認し、最後にENTER
を押してnanoを終了し、ファイルを保存して閉じます。 これらの変更を実際に実装するには、sshd
サービスを再起動する必要があります。
sudo systemctl restart ssh
予防措置として、このセッションを閉じる前に、新しいターミナルウィンドウを開き、SSHサービスが正しく機能していることをテストします。
ssh username@remote_host
SSHサービスを確認したら、現在のすべてのサーバーセッションを安全に閉じることができます。
Ubuntuサーバー上のSSHデーモンは、SSHキーにのみ応答するようになりました。 パスワードベースの認証は正常に無効化されました。
結論
これで、サーバーでSSHキーベースの認証が構成され、アカウントパスワードを入力せずにサインインできるようになります。
SSHの操作について詳しく知りたい場合は、SSH Essentials Guideをご覧ください。