LinuxサーバーでSSHキーベースの認証を構成する方法
序章
SSH(セキュアシェル)は、サーバーの管理と通信に使用される暗号化されたプロトコルです。 Linuxサーバーで作業する場合、SSHを介してサーバーに接続されたターミナルセッションに多くの時間を費やすことがよくあります。
SSHサーバーにログインする方法はいくつかありますが、このガイドでは、SSHキーの設定に焦点を当てます。 SSHキーは、サーバーにログインするための非常に安全な方法を提供します。 このため、これはすべてのユーザーに推奨される方法です。
SSHキーはどのように機能しますか?
SSHサーバーは、さまざまな方法を使用してクライアントを認証できます。 これらの最も基本的なものはパスワード認証です。これは使いやすいですが、最も安全ではありません。
パスワードは安全な方法でサーバーに送信されますが、一般に、複雑ではなく、繰り返しの永続的な攻撃者に耐えられるほど長くはありません。 自動化されたスクリプトと組み合わされた最新の処理能力により、パスワードで保護されたアカウントを総当たり攻撃することが非常に可能になります。 セキュリティを追加する方法は他にもありますが( fail2ban など)、SSHキーは信頼性が高く安全な代替手段であることが証明されています。
SSHキーペアは、SSHサーバーに対してクライアントを認証するために使用できる2つの暗号的に安全なキーです。 各キーペアは、公開キーと秘密キーで構成されます。
秘密鍵はクライアントによって保持され、絶対に秘密にしておく必要があります。 秘密鍵が侵害されると、攻撃者は追加の認証なしで、関連付けられた公開鍵で構成されたサーバーにログインできるようになります。 追加の予防策として、キーはパスフレーズを使用してディスク上で暗号化できます。
関連する公開鍵は、悪影響を与えることなく自由に共有できます。 公開鍵は、秘密鍵が復号化できるのみのメッセージを暗号化するために使用できます。 このプロパティは、キーペアを使用して認証する方法として使用されます。
公開鍵は、SSHでログインできるようにするリモートサーバーにアップロードされます。 キーは、ログインするユーザーアカウント内の特別なファイルに追加されます。 ~/.ssh/authorized_keys
.
クライアントがSSHキーを使用して認証を試みる場合、サーバーはクライアントが秘密キーを所有しているかどうかをテストできます。 クライアントが秘密鍵を所有していることを証明できる場合は、シェルセッションが生成されるか、要求されたコマンドが実行されます。
ステップ1—SSHキーを作成する
サーバーへのSSHキー認証を構成するための最初のステップは、ローカルコンピューターでSSHキーペアを生成することです。
これを行うには、と呼ばれる特別なユーティリティを使用できます ssh-keygen
、これは標準のOpenSSHツールスイートに含まれています。 デフォルトでは、これにより3072ビットのRSAキーペアが作成されます。
ローカルコンピューターで、次のように入力してSSHキーペアを生成します。
- ssh-keygen
OutputGenerating 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キーペアを生成したことがある場合は、次のようなプロンプトが表示される場合があります。
Output/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?
ディスク上のキーを上書きすることを選択した場合、以前のキーを使用して認証することはできなくなります。 これは元に戻せない破壊的なプロセスであるため、[はい]を選択するときは十分に注意してください。
OutputCreated directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
次に、キーのパスフレーズを入力するように求められます。 これは、ディスク上の秘密鍵ファイルを暗号化するために使用できるオプションのパスフレーズです。
それでもパスフレーズを入力する必要がある場合、SSHキーがどのような利点を提供するのか疑問に思われるかもしれません。 いくつかの利点は次のとおりです。
- 秘密SSHキー(パスフレーズで保護できる部分)は、ネットワーク上で公開されることはありません。 パスフレーズは、ローカルマシンのキーを復号化するためにのみ使用されます。 これは、ネットワークベースのブルートフォースがパスフレーズに対して不可能であることを意味します。
- 秘密鍵は制限されたディレクトリ内に保持されます。 SSHクライアントは、制限されたディレクトリに保持されていない秘密鍵を認識しません。 キー自体にも制限された権限が必要です(読み取りと書き込みは所有者のみが使用できます)。 これは、システム上の他のユーザーがスヌープできないことを意味します。
- 秘密のSSHキーパスフレーズを解読しようとする攻撃者は、すでにシステムにアクセスできる必要があります。 これは、ユーザーがすでにユーザーアカウントまたはrootアカウントにアクセスできることを意味します。 この位置にいる場合、パスフレーズにより、攻撃者が他のサーバーにすぐにログインするのを防ぐことができます。 これにより、新しいSSHキーペアを作成して実装し、侵害されたキーからアクセスを削除する時間ができれば幸いです。
秘密鍵がネットワークに公開されることはなく、ファイルのアクセス許可によって保護されるため、このファイルには、自分(および root ユーザー)以外の人がアクセスできないようにする必要があります。 パスフレーズは、これらの条件が損なわれた場合の保護の追加レイヤーとして機能します。
パスフレーズはオプションの追加です。 入力する場合は、このキーを使用するたびに入力する必要があります(復号化されたキーを保存するSSHエージェントソフトウェアを実行している場合を除く)。 パスフレーズの使用をお勧めしますが、パスフレーズを設定したくない場合は、 ENTER
このプロンプトをバイパスします。
OutputYour 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:
SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname
The key's randomart image is:
+---[RSA 3072]----+
|o ..oo.++o .. |
| o o +o.o.+... |
|. . + oE.o.o . |
| . . oo.B+ .o |
| . .=S.+ + |
| . o..* |
| .+= o |
| .=.+ |
| .oo+ |
+----[SHA256]-----+
これで、認証に使用できる公開鍵と秘密鍵ができました。 次のステップは、SSHキー認証を使用してログインできるように、サーバーに公開キーを配置することです。
ステップ2—SSH公開鍵をサーバーにコピーする
注:このチュートリアルの以前のバージョンには、SSH公開鍵をDigitalOceanアカウントに追加するための手順が含まれていました。 これらの手順は、DigitalOcean製品ドキュメントのSSHキーセクションにあります。
公開鍵をリモートSSHサーバーにアップロードする方法は複数あります。 使用する方法は、使用可能なツールと現在の構成の詳細に大きく依存します。
次の方法はすべて同じ最終結果をもたらします。 最も単純で最も自動化された方法を最初に説明し、それに続く方法にはそれぞれ追加の手動手順が必要です。 上記の方法を使用できない場合にのみ、これらに従う必要があります。
を使用して公開鍵をコピーする ssh-copy-id
公開鍵を既存のサーバーにコピーする最も簡単な方法は、次のようなユーティリティを使用することです。 ssh-copy-id
. 単純なため、可能な場合はこの方法をお勧めします。
The ssh-copy-id
ツールは多くのディストリビューションのOpenSSHパッケージに含まれているため、ローカルシステムですでに利用できる場合があります。 この方法を機能させるには、現在、サーバーへのパスワードベースの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
username@203.0.113.1's password:
パスワードを入力し(セキュリティ上の理由から、入力内容は表示されません)、を押します。 ENTER
. ユーティリティは、指定したパスワードを使用してリモートホストのアカウントに接続します。 その後、あなたのコンテンツをコピーします ~/.ssh/id_rsa.pub
リモートアカウントのホームにあるファイルにキー入力する ~/.ssh
と呼ばれるディレクトリ authorized_keys
.
次のような出力が表示されます。
OutputNumber 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
キーがリモートアカウントにアップロードされました。 次のセクションに進むことができます。
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"
次のようなメッセージが表示される場合があります。
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
続ける。
その後、接続しようとしているアカウントのパスワードの入力を求められます。
Outputusername@203.0.113.1'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== username@hostname
利用可能な方法を使用して、リモートホストにアクセスします。 これは、インフラストラクチャプロバイダーによって提供されるWebベースのコンソールである可能性があります。
注: DigitalOceanドロップレットを使用している場合は、DigitalOcean製品ドキュメントの回復コンソールのドキュメントを参照してください。
リモートサーバー上のアカウントにアクセスできるようになったら、次のことを確認する必要があります。 ~/.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認証のテストに進むことができます。
ステップ3—SSHキーを使用したサーバーへの認証
上記の手順のいずれかを正常に完了すると、リモートアカウントのパスワードなしでリモートホストにログインできるようになります。
プロセスはほとんど同じです:
- 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
続ける。
秘密鍵のパスフレーズを指定しなかった場合は、すぐにログインします。 鍵の作成時に秘密鍵のパスフレーズを指定した場合は、ここで入力する必要があります。 その後、リモートシステムのアカウントを使用して新しいシェルセッションが作成されます。
成功した場合は、サーバーをロックダウンする方法を引き続き確認してください。
ステップ4—サーバーでのパスワード認証の無効化
パスワードなしでSSHを使用してアカウントにログインできた場合は、アカウントにSSHキーベースの認証が正常に構成されています。 ただし、パスワードベースの認証メカニズムは引き続きアクティブです。つまり、サーバーはブルートフォース攻撃にさらされたままです。
このセクションの手順を完了する前に、このサーバーの root アカウントにSSHキーベースの認証が構成されていること、またはできれば、のアカウントにSSHキーベースの認証が構成されていることを確認してください。このサーバーと sudo
アクセス。 この手順では、パスワードベースのログインがロックダウンされるため、管理アクセスを引き続き取得できるようにすることが重要です。
上記の条件が満たされたら、SSHキーを使用して root として、または次のアカウントを使用してリモートサーバーにログインします。 sudo
特権。 SSHデーモンの構成ファイルを開きます。
- sudo nano /etc/ssh/sshd_config
ファイル内で、というディレクティブを検索します PasswordAuthentication
. これはコメントアウトされる場合があります。 削除して行のコメントを解除します #
行の先頭で、値をに設定します no
. これにより、アカウントのパスワードを使用してSSH経由でログインする機能が無効になります。
PasswordAuthentication no
終了したら、ファイルを保存して閉じます。 行った変更を実際に実装するには、サービスを再起動する必要があります。
ほとんどのLinuxディストリビューションでは、次のコマンドを発行してこれを行うことができます。
- sudo systemctl restart ssh
この手順を完了すると、SSHデーモンがSSHキーにのみ応答するように正常に移行されました。
結論
これで、SSHキーベースの認証が構成され、サーバーで実行され、アカウントのパスワードを入力しなくてもサインインできるようになります。 ここから、あなたが向かうことができる多くの方向があります。 SSHの操作について詳しく知りたい場合は、SSHエッセンシャルガイドをご覧ください。