SSHキー認証の理解:公開鍵と秘密鍵の解説

この包括的なガイドでSSHキー認証の秘密を解き明かしましょう。公開鍵と秘密鍵の基本的な役割、それらがどのように連携してリモート接続を保護するか、そしてこの方法がパスワードベースのログインをはるかに凌ぐ理由を学びます。この記事では、キーの生成とデプロイの手順を段階的に説明し、重要なセキュリティ上の利点とベストプラクティスを提供します。SSHキーでサーバーセキュリティを強化し、アクセスを効率化しましょう。

SSHキー認証の理解:公開鍵と秘密鍵の解説

SSHキー認証は、多くの管理者、開発者、CIシステム、デプロイツールがサーバーにログインする標準的な方法です。あなたのラップトップは秘密鍵を保持し、サーバーは対応する公開鍵を保存し、SSHは秘密鍵をネットワーク経由で送信することなく、あなたが秘密鍵を持っていることを証明します。

最後の部分が重要です。パスワードは多くの場所に入力する秘密です。秘密鍵はあなたのマシンに留まるべき秘密です。パスフレーズで保護し、公開鍵のみをサーバーに保存すれば、共有パスワードよりも安全で自動化が容易なログイン方法が得られます。

パスワードの問題点

従来のパスワードベースの認証は、共有秘密であるパスワードに依存しています。強力なパスワードはある程度のセキュリティを提供できますが、いくつかの弱点があります:

  • ブルートフォース攻撃:攻撃者は無数のパスワードの組み合わせを試し、正しいものを推測できます。
  • 辞書攻撃:一般的な単語やフレーズを使用して、攻撃者は迅速にアカウントを侵害できます。
  • キーロガー:悪意のあるソフトウェアがキーストロークをキャプチャし、パスワードを漏洩させる可能性があります。
  • フィッシング:ソーシャルエンジニアリングの手法で、ユーザーを騙して認証情報を開示させることができます。
  • ヒューマンエラー:ユーザーはしばしば弱い、推測可能な、または再利用されたパスワードを選び、誤って露出させる可能性があります。

SSHキー認証は、秘密がリモートサーバーに入力されないため、これらのリスクを軽減します。しかし、キーが魔法のように安全になるわけではありません。盗まれた暗号化されていない秘密鍵は悪用される可能性があり、管理が不十分なauthorized_keysファイルは静かなバックドアになる可能性があります。

SSHキー認証の概要

SSHキー認証は、非対称暗号化を利用します。これは、数学的に関連付けられた鍵のペア(公開鍵と秘密鍵)を使用するシステムです。同じ鍵を暗号化と復号化の両方に使用する対称暗号化とは異なり、非対称暗号化は暗号化に一方の鍵を、復号化に別の(関連する)鍵を使用します。

キーを使用して接続するとき、サーバーは提供された公開鍵がアカウントで信頼されているかどうかを確認します。次に、クライアントは一致する秘密鍵で認証データに署名します。サーバーは公開鍵でその署名を検証します。秘密鍵はサーバーにアップロードされません。

暗号のデュオ:公開鍵と秘密鍵

SSHキー認証の核心は、これら2つの異なるが相互に関連するコンポーネントです。

秘密鍵

秘密鍵はあなたの秘密の身分証明です。これは長く複雑な文字列であり、絶対に機密を保持し、誰とも共有してはいけません。デジタルロックボックスへの唯一の鍵と考えてください。

  • セキュリティ上重要:秘密鍵が侵害されると、攻撃者はあなたになりすまし、対応する公開鍵がデプロイされたすべてのサーバーに不正アクセスできる可能性があります。
  • 場所:通常、ローカルマシンに保存されます(例:~/.ssh/id_rsa~/.ssh/id_ed25519)。
  • 保護:パスフレーズで保護できます。誰かが鍵ファイルをコピーした場合、パスフレーズは「ファイルが盗まれた」から「サーバーアクセスが盗まれた」への追加の障壁となります。

公開鍵

公開鍵は秘密鍵の対応物です。秘密鍵から派生しますが、秘密鍵を再作成するために使用することはできません。名前が示すように、公開鍵は共有することを目的としており、アクセスしたい任意のサーバーに配置されます。

  • 共有可能:セキュリティを損なうことなく、公開鍵を誰にでも、または任意のサーバーに安全に配布できます。
  • 場所:サーバー上では、公開鍵は通常、各ユーザーアカウントの~/.ssh/authorized_keysファイルに保存されます。このファイルの各行は、信頼された公開鍵を表します。
  • 役割:公開鍵により、サーバーは一致する秘密鍵によって作成された署名を検証できます。

SSHキー認証の仕組み:ハンドシェイク

SSHキー認証が安全な接続を確立する手順を段階的に見てみましょう:

  1. 鍵ペアの生成:まず、ローカルマシンで公開鍵と秘密鍵のペアを生成します。秘密鍵は秘密のまま、公開鍵は配布するものです。
  2. 公開鍵のデプロイ:アクセスしたいリモートサーバーに公開鍵をコピーします。この鍵は通常、サーバー上のユーザーのホームディレクトリにある~/.ssh/authorized_keysファイルに追加されます。
  3. 接続試行:ローカルマシンからリモートサーバーへのSSH接続を開始すると、SSHクライアントはキーを使用して認証したいことを示します。
  4. サーバーの確認:サーバーは、提供された公開鍵がそのユーザーに許可されているかどうかを確認します。
  5. クライアントの証明:クライアントは秘密鍵で認証データに署名します。秘密鍵にパスフレーズがある場合、ローカルでロックを解除するよう求められることがあります。
  6. 検証:サーバーはauthorized_keysの公開鍵を使用して署名を検証します。署名が有効で、アカウントがログインを許可されている場合、認証は成功します。
  7. 認証許可:検証が成功すると、サーバーはアクセスを許可し、安全なSSHセッションが確立されます。

重要なのは、このプロセス全体を通じて秘密鍵がローカルマシンから決して離れないことです。 そこから派生した暗号証明のみが交換されます。

SSH鍵ペアの生成

SSH鍵ペアの生成は、ローカルマシン(Linux、macOS、またはWindowsのWSL/Git Bash)でssh-keygenコマンドを使用する簡単なプロセスです。

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519:作成する鍵のタイプを指定します。Ed25519は、ほとんどの新しいOpenSSH鍵の現代的なデフォルトです。RSAも、特に古いシステムでは依然として一般的です。
  • -C "[email protected]":公開鍵にコメントを追加し、その目的や所有者を識別するのに役立ちます。

鍵を保存するファイル(デフォルトは~/.ssh/id_ed25519)とパスフレーズを求められます。常に強力なパスフレーズを使用して秘密鍵を保護してください。

Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Created directory '/home/youruser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/youruser/.ssh/id_ed25519.
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:...
The key's randomart image is:
+--[ED25519 256]----+
|      .=+          |
|     . o. .        |
|    . + o.         |
|   o = B o.        |
|  . S @ + +        |
|   = + B .         |
|  o * * E          |
| . o o             |
|  . .              |
+----[SHA256]-------+

生成後、~/.sshディレクトリに2つのファイルができます:

  • id_ed25519(秘密鍵)
  • id_ed25519.pub(公開鍵)

秘密鍵ファイルのパーミッションが厳格であることを確認してください:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

公開鍵のデプロイ

キー認証を使用するには、アクセスしたいリモートサーバーに公開鍵を配置する必要があります。

ssh-copy-idの使用(推奨)

ssh-copy-idユーティリティは、公開鍵をデプロイする最も簡単で安全な方法です。必要に応じて、正しいパーミッションで~/.sshディレクトリとauthorized_keysファイルを作成します。

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host

userをリモートサーバーのユーザー名に、remote_hostをサーバーのIPアドレスまたはホスト名に置き換えてください。キーをアップロードするために、user@remote_hostパスワード最後に一度求められます。

手動デプロイ

ssh-copy-idが利用できない場合は、公開鍵を手動でコピーできます:

  1. 公開鍵の内容をコピーcatを使用して公開鍵を表示します。

    cat ~/.ssh/id_ed25519.pub
    

    ssh-ed25519 ...で始まりコメントで終わる出力全体をコピーします。

  2. パスワード認証を使用してリモートサーバーにSSH接続

    ssh user@remote_host
    

    プロンプトが表示されたらパスワードを入力します。

  3. ~/.sshディレクトリとauthorized_keysファイルが存在しない場合は作成

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
  4. 公開鍵をauthorized_keysに追加:先ほどコピーした公開鍵の内容をauthorized_keysファイルに貼り付けます。

    echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
    

    ssh-ed25519 AAAA...を実際の公開鍵の内容に置き換えてください)

SSHキーでの接続

公開鍵がサーバーに配置されると、ユーザーとホストを指定するだけで接続できます:

ssh user@remote_host

複数の鍵ペアがある場合、または秘密鍵がデフォルトの場所(~/.ssh/id_rsaまたは~/.ssh/id_ed25519)にない場合は、-iオプションを使用して指定する必要があるかもしれません:

ssh -i ~/.ssh/my_custom_key user@remote_host

秘密鍵がパスフレーズで保護されている場合、入力するよう求められます。セッション中にパスフレーズを繰り返し入力しないようにするには、ssh-agentを使用できます。

SSHキー認証のセキュリティ上の利点

  1. パスワード推測リスクの低減:パスワードログインが無効になっている場合、攻撃者はSSHパスワードを介してそのアカウントをブルートフォースできません。
  2. より強力な認証情報:適切に生成されたSSHキーは、人間が推測できるものではありません。
  3. 秘密鍵のアップロードなし:認証中、秘密鍵はローカルに留まります。
  4. 自動化に適している:キーにより、スクリプト可能でパスワード不要のログインが可能になり、自動化ツールやCI/CDパイプラインに不可欠です。
  5. パスフレーズ保護:秘密鍵にパスフレーズを追加すると、追加のセキュリティ層が提供されます。秘密鍵ファイルが盗まれても、パスフレーズがなければ使用できません。

SSHキーの管理

ssh-agent

ssh-agentはバックグラウンドで実行され、復号化された秘密鍵をメモリに保持するプログラムです。SSHサーバーに接続しようとすると、SSHクライアントはssh-agentに必要な秘密鍵を問い合わせることができ、パスフレーズを繰り返し入力する必要がなくなります。

ssh-agentを起動してキーを追加するには:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

エージェントにキーを追加するときに、パスフレーズを一度入力します。

キーの命名と整理

複数のキー(例:異なる組織、プロジェクト、個人使用用)を管理するには、意味のある名前を使用することを検討してください:

ssh-keygen -t ed25519 -f ~/.ssh/id_work_project -C "work_project_key"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "personal_github_key"

その後、-iオプションで使用するキーを指定するか、~/.ssh/configファイルを設定して、ホストに基づいて正しいキーを自動的に選択できます。

~/.ssh/configの例:

Host github.com
    IdentityFile ~/.ssh/id_personal_github
    User git

Host work-server
    Hostname 192.168.1.100
    IdentityFile ~/.ssh/id_work_project
    User devuser

ベストプラクティスとヒント

  • 秘密鍵を決して共有しない:これが黄金律です。秘密鍵はあなたのデジタルアイデンティティです。
  • 強力なパスフレーズを使用する:強力なパスワードと同様に、堅牢なパスフレーズで秘密鍵を保護してください。これにより、鍵が悪意のある手に渡っても無価値になります。
  • 理由がある場合にローテーションする:デバイスを紛失した、請負業者が退社した、鍵が誤って共有された、古いアルゴリズムがポリシーに合わなくなった場合などに、新しい鍵を生成します。
  • ファイルのパーミッションを制限する:秘密鍵ファイルに600rw-------)、~/.sshディレクトリに700rwx------)のパーミッションを設定してください。
  • パスワード認証を慎重に無効にする:別のターミナルからキーログインが機能することを確認したら、多くのサーバーで/etc/ssh/sshd_configPasswordAuthentication noを設定する必要があります。リモートシステムでこれを変更する前に、コンソールアクセスを利用可能にしておいてください。
  • ssh-agentを使用する:利便性とセキュリティのために、ssh-agentを使用してキー(特にパスフレーズ付きのもの)を管理してください。

シンプルなメンタルモデル

公開鍵はサーバーアカウントにインストールする錠前です。秘密鍵は自分のマシンに保持する資格情報です。パスフレーズは、ファイルがコピーされた場合にその資格情報を保護します。authorized_keysファイルはアクセスリストです。

SSHキーの問題のほとんどは、これらを混同することから発生します:秘密鍵をサーバーにコピーする、公開鍵を間違ったユーザーの下に貼り付ける、間違ったIDファイルを使用する、またはOpenSSHが信頼するにはパーミッションが開きすぎている状態にする。キーは目的に応じて名前を付け、秘密鍵はパスフレーズで保護し、利便性のためにssh-agentを使用し、アクセスを終了する必要がある場合は古い公開鍵を削除し、パスワードログインを無効にする前に別のターミナルから変更をテストしてください。