SSHの公開鍵認証を設定する
1. 序章
公開鍵認証は、リモートサーバーに対して自分自身を識別するための代替方法です。通常のパスワードとは異なり、公開鍵認証は検証に暗号化鍵ペアを使用します。
強力なパスワードを使用すると、ブルートフォース攻撃を防ぐのに役立つ場合がありますが、公開鍵認証は暗号化の強度を提供します。 さらに、パスワードなしの自動ログインが可能になります。 これにより、2つのLinuxサーバー間の信頼が高まり、ファイル転送が容易になります。
このチュートリアルでは、Linuxシステムで公開鍵認証を設定する方法について説明します。
2. SSHキーペアの作成
まず、SSHキー認証を構成するために、ローカルコンピューターでSSHキーペアを生成する必要があります。 これを実現するために、標準のOpenSSHツールスイートに含まれている ssh-keygen、と呼ばれる特別なユーティリティを使用できます。
デフォルトでは、ssh-keygenは3072ビットのRSAキーペアを作成します。 このコマンドを使用して、SSHキーペアを生成してみましょう。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
-b オプションを使用して、生成されるキーペアの長さをバイト単位で指定することもできます。
$ ssh-keygen -b 4096
作成したキーペアの保存場所を選択するように求められます。
ENTER を押してデフォルトの場所を維持するか、別の場所を入力してキーペアを保存できます。
SSHキーペアが以前に生成されている場合は、既存のキーを上書きするように求めるプロンプトが表示されます。
/home/user/.ssh/id_rsa already exists.
Overwrite (y/n)?
[はい]を選択すると、既存のキーが上書きされ、再度使用できなくなります。 これは不可逆過程です。
次に、ローカルコンピューターの秘密鍵を暗号化するためのパスフレーズを入力するように求められます。
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
パスフレーズは、生成された秘密鍵を保護するための追加のセキュリティレイヤーとして機能します。秘密鍵を使用するたびにパスフレーズを入力する必要があります。
パスフレーズの入力はオプションですが、安全なシステムのために推奨されます。 キーペアの作成が成功すると、次の出力が得られます。
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:f6sdCUZLKUm61/Mbv7DZh+NNR4Dn7oA+vnb4JB82qyc user@user-PC
The key's randomart image is:
+---[RSA 3072]----+
| . |
| o . . . |
| . o + . o |
| . = . o . |
| . S * . .|
| . o = o . |
| +.& ..o|
| .EBo^ooo|
| o*XX.*+.|
+----[SHA256]-----+
これにより、2つのファイルが作成されます。
- id_rsa:は秘密鍵を表します
- id_rsa.pub:は公開鍵を表します
これで、認証に使用できる公開鍵と秘密鍵ができました。 次のステップは、公開鍵をリモートサーバーにコピーすることです。
3. 公開鍵をリモートサーバーにコピーする
公開鍵をリモートSSHサーバーにアップロードするために使用できる方法は複数あります。
- ssh-copy-idを使用
- SSHを使用
- 手動でコピーする
それぞれの方法を詳しく見ていきましょう。
3.1. ssh-copy-idを使用する
ssh-copy-idは、公開鍵をリモートSSHサーバーにコピーするためのユーティリティです。これは、公開鍵をコピーするための最も簡単で最も推奨される方法です。
ほとんどのLinuxディストリビューションのOpenSSHパッケージに含まれているため、インストールする必要はありません。 この方法を使用するには、パスワードベースの認証を有効にする必要があります。
リモートホストのIPアドレスと、パスワードベースの認証が有効になっているユーザーアカウントを指定する必要があります。
$ ssh-copy-id user@remote_host_ip_address
The authenticity of host 'xxx.x.xxx.x (xxx.x.xxx.x)' 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と入力し、を押してから、ENTERを押して続行します。
ユーティリティは、前に生成した公開鍵のスキャンに進みます。 キーが見つかると、リモートサーバーでパスワードを入力するように求められます。
正しいパスワードを入力すると、ユーティリティはリモートサーバーに接続し、公開鍵をコピーします。 キーは、リモートサーバーの〜/ .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.
3.2. SSHの使用
従来のSSH方式で公開鍵をアップロードすることもできます。 これを行うには、公開鍵の内容を出力し、SSH経由でリモートサーバーにパイプする必要があります。
>> リダイレクト演算子を使用して、既存のキーを上書きする代わりにコンテンツを追加しましょう。
$ cat ~/.ssh/id_rsa.pub | ssh user@remote_host_ip_address "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
The authenticity of host 'xxx.x.xxx.x (xxx.x.xxx.x)' 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と入力し、を押してから、ENTERを押して続行します。
次に、リモートサーバーでパスワードを入力するように求められます。 承認時に、ローカルコンピューターの公開鍵がauthorized_keyファイルの最後にコピーされます。
3.3. 公開鍵を手動でコピーする
リモートサーバーへのパスワードベースのアクセス権がない場合は、公開鍵を手動でコピーすることもできます。これを行うには、公開鍵のコンテンツを手動でコピーする必要があります。リモートサーバーに貼り付けます。
cat を使用して、公開鍵を表示してみましょう。
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAA...truncated...AGvaQ== user@host_ip_address
次に、端末からキーをコピーしてから、利用可能な手段でリモートサーバーにアクセスする必要があります。 たとえば、Webベースのコンソールまたはダッシュボードを使用できます。
次に、 mkdir コマンドを使用して、〜/.sshディレクトリがまだ存在しない場合は作成します。
$ mkdir -p ~/.ssh
または、Webベースのコンソールにアクセスできない場合は、手動でフォルダーを作成します。
最後に、 authorized_keys ディレクトリを作成または変更して、コピーした公開鍵を貼り付けましょう。
$ echo public_key >> ~/.ssh/authorized_keys
これにより、公開鍵の内容がauthorized_keysファイルに上書きされずに追加されます。
4. SSHキーによる認証のテスト
公開鍵をコピーしてリモートサーバーに貼り付けると、パスワードなしで正常にログインできるようになります。 このコマンドを使用して、キーをテストしてみましょう。
$ ssh user@remote_ip_address
キーペアの生成中にパスフレーズを作成した場合は、パスフレーズの入力を求められます。 それ以外の場合は、すぐにリモートサーバーにログインし、そのファイルとフォルダーにアクセスできます。
出力例は次のとおりです。
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-154-generic x86_64)
...truncated...
Last login: Thu Jan 6 10:48:29 2022 from xxx.xxx.xx.xxx
user@ubuntu-s-1vcpu-1gb-nyc1-01:~#
ログインすると、現在ログインしているユーザーの数、CPU使用率の統計など、リモートサーバーに関する多くの重要な情報を確認できます。
5. リモートサーバーでのパスワード認証の無効化
ブルートフォース攻撃からリモートサーバーを保護するために、まだアクティブなパスワードベースの認証を無効にすることが重要です。
rootユーザーまたはsudo権限を持つ他の利用可能なユーザーでSSHキー認証が設定されていることを確認する必要があります。 これは、引き続き管理アクセスを取得できるようにするために重要です。
まず、SSHを介してリモートサーバーにログインし、nanoを介してSSH構成ファイルを開きます。
$ sudo nano /etc/ssh/sshd_config
ファイルに入ったら、次の行を検索してみましょう。
PasswordAuthentication no
最後に、ファイルを保存して閉じましょう。 行った変更を実装するには、sshサービスを再起動する必要があります。
$ sudo systemctl restart ssh
または、次のコマンドを使用できます。
sudo kill -HUP `cat /var/run/sshd.pid`
もう1つの方法は、次のコマンドを使用することです。
sudo kill -HUP $(cat /var/run/sshd.pid)
これにより、SSH経由でログインしているときにパスワード認証が無効になります。
6. 追加情報
有用な公開鍵認証に関するいくつかの追加情報を見てみましょう。
6.1. 既存のSSHキーペアのバックアップ
ファイルを既存のバックアップサーバーや外部メディアストレージデバイスにコピーしたり、デジタル以外の方法を好む場合はキーペアを紙に印刷したりすることもできます。
6.2. 既存のキーのパスフレーズを追加または置換する
デフォルトのSSH秘密鍵に既存のパスフレーズを追加または変更するには、ssh-keygenコマンドを使用する必要があります。
$ ssh-keygen -p
別のファイル名を指定するには、-fフラグを使用してファイル名を渡すことができます。
$ ssh-keygen -p -f ~/.ssh/private_key_filename
6.3. SSHキーの保護
SSHキーを保護するには、次のことを行う必要があります。
- アカウントのすべての特権を制限する
- 強力なパスフレーズを使用してください。 数字と特殊文字を含む文にすることができます
- オンラインまたはセキュリティで保護されていないサーバー上で秘密鍵を共有することは避けてください
7. 結論
この記事では、ローカルコンピューターとリモートサーバー間で公開鍵認証を設定するために必要な重要な手順について説明しました。 また、従来のパスワードベースの認証を無効にして、ブルートフォース攻撃からリモートサーバーを保護する方法についても説明しました。
最後に、公開鍵認証を使用することのいくつかの利点と、SSH鍵ペアを操作するときに使用できる便利なヒントについて説明しました。