SSHキー初心者ガイド:安全な生成、利用、管理

SSHキーを使って、安全でパスワードなしのリモートアクセスを実現しましょう。この初心者ガイドでは、`ssh-keygen` を使ったSSHキーペアの生成、`ssh-copy-id` を使ったサーバーへのデプロイ、そして `ssh-agent` と設定ファイルを使った効果的なキー管理について解説します。サーバーのセキュリティを強化し、接続を効率化するためのベストプラクティスを学びましょう。

39 ビュー

SSHキー初心者ガイド:安全な生成、使用、管理

Secure Shell (SSH) は、サーバーやその他のネットワークデバイスへの安全なリモートアクセスにおける事実上の標準です。パスワードベースの認証は一般的ですが、ブルートフォース攻撃に対して脆弱であり、複雑なパスワードを覚える必要があります。SSHキーは、より堅牢で便利な代替手段を提供し、パスワードなしの認証を可能にし、全体的なセキュリティ体制を強化します。

このガイドでは、SSHキーペアの生成、デプロイ、管理における重要なステップを説明します。これらの実践を理解し、実装することで、リモートアクセスのセキュリティを大幅に向上させ、ワークフローを効率化することができます。SSHキー認証を始めるために、コアな概念、実践的なコマンド、およびベストプラクティスについて解説します。

SSHキーペアを理解する

SSHキー認証は、暗号化キーのペア、つまり秘密鍵と公開鍵に依存しています。これらのキーは数学的に関連していますが、公開鍵から秘密鍵を導出することは計算上不可能です。

  • 秘密鍵: この鍵は秘密に保持されるべきであり、決して共有してはなりません。あなたのローカルマシンに存在し、あなたの身元として機能します。SSH接続を開始する際、クライアントはあなたの秘密鍵を使用して身元を証明します。
  • 公開鍵: この鍵は自由に共有できます。アクセスしたいリモートサーバーに公開鍵を配置します。接続を試みるとき、サーバーはあなたの公開鍵を使用して、対応する秘密鍵を所有していることを確認します。

サーバーへの接続を試みるとき、以下のプロセスが実行されます。

  1. あなたのSSHクライアントがサーバーに公開鍵を提示します。
  2. サーバーはこの公開鍵が認証されているか(つまり、そのauthorized_keysファイルに存在するか)を確認します。
  3. 認証されていれば、サーバーはあなたのクライアントにチャレンジを送信します。
  4. あなたのクライアントは秘密鍵を使用してチャレンジを暗号化し、暗号化された応答をサーバーに送り返します。
  5. サーバーは公開鍵を使用して応答を復号します。復号が成功し、元のチャレンジと一致する場合、パスワードを必要とせずに認証が許可されます。

SSHキーペアの生成

SSHキーペアを生成するための最も一般的なツールはssh-keygenです。このコマンドは、ほとんどのLinux、macOS、およびWindows(WSLまたはGit Bash経由)システムで利用できます。

ssh-keygenを使用する

新しいSSHキーペアを生成するには、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行します。

ssh-keygen -t ed25519

このコマンドを分解してみましょう。

  • ssh-keygen: SSHキーを生成するコマンドです。
  • -t ed25519: 作成するキーのタイプを指定します。ed25519は、最新で非常に安全かつ高速な楕円曲線暗号アルゴリズムです。他の一般的なオプションにはrsaがあります(例:4096ビットRSAキーの場合はssh-keygen -t rsa -b 4096)。

コマンドを実行すると、いくつかの質問が表示されます。

  1. キーを保存するファイル名を入力してください(例:/home/your_user/.ssh/id_ed25519): デフォルトの場所を受け入れるにはEnterキーを押します。これにより、.sshディレクトリにid_ed25519(秘密鍵)とid_ed25519.pub(公開鍵)の2つのファイルが作成されます。
  2. パスフレーズを入力してください(空にするとパスフレーズなし): これは重要なセキュリティステップです。パスフレーズを入力すると、ディスク上の秘密鍵が暗号化されます。秘密鍵ファイルが侵害された場合でも、攻撃者はそれを使用するためにパスフレーズが必要になります。強力なパスフレーズを使用することを強く推奨します。
  3. 同じパスフレーズをもう一度入力してください: パスフレーズを確認します。

出力ファイルを理解する

生成後、~/.ssh/ディレクトリ(または指定したパス)に2つのファイルが作成されます。

  • id_ed25519(またはid_rsa):あなたの秘密鍵です。このファイルを絶対に共有しないでください。 ユーザーの読み取り専用に権限を制限してください。
  • id_ed25519.pub(またはid_rsa.pub):あなたの公開鍵です。これはサーバーに配布する鍵です。

秘密鍵を保護する

秘密鍵に正しいファイル権限があることを確認することが不可欠です。Linux/macOSでは、以下を実行します。

chmod 600 ~/.ssh/id_ed25519

このコマンドは、読み書き権限をファイルの所有者のみに制限し、システム上の他のユーザーが秘密鍵にアクセスするのを防ぎます。

公開鍵をサーバーにデプロイする

SSHキーペアを生成したら、アクセスしたいリモートサーバーに公開鍵を配置する必要があります。

ssh-copy-idを使用する(推奨)

ssh-copy-idは、公開鍵をリモートサーバーにコピーするプロセスを簡素化するユーティリティスクリプトです。公開鍵をサーバー上の~/.ssh/authorized_keysファイルに自動的に追加し、正しい権限を設定します。

ssh-copy-idを使用するには、ローカルマシンから以下のコマンドを実行します。

ssh-copy-id user@remote_host

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

標準以外のSSHポート(例:2222)を使用している場合は、-pオプションで指定できます。

ssh-copy-id -p 2222 user@remote_host

手動デプロイ(ssh-copy-idが利用できない場合)

ssh-copy-idが利用できない場合は、手動で公開鍵をコピーできます。まず、ローカルマシンで公開鍵の内容を表示します。

cat ~/.ssh/id_ed25519.pub

出力全体をコピーします。次に、パスワードを使用してリモートサーバーにSSH接続します。

ssh user@remote_host

ログインしたら、.sshディレクトリが存在しない場合は作成し、authorized_keysファイルを作成または追加します。

mkdir -p ~/.ssh
chmod 700 ~/.ssh

次に、公開鍵の内容をauthorized_keysファイルに貼り付けます。これにはnanovimのようなテキストエディタを使用できます。

nano ~/.ssh/authorized_keys

コピーした公開鍵を新しい行に貼り付けます。保存してエディタを終了します。

最後に、authorized_keysファイルに正しい権限があることを確認してください。

chmod 600 ~/.ssh/authorized_keys

これらの手順を完了すると、パスワードなしでサーバーにSSH接続できるようになります。

SSHキーで接続する

公開鍵がサーバーに配置されたら、秘密鍵を使用して接続できます。SSHクライアントは、~/.ssh/にある鍵を自動的に使用しようとします。

ssh user@remote_host

キー生成中にパスフレーズを使用した場合、ここで入力するように求められます。パスフレーズを使用しなかった場合、直接ログインします。

異なるキーを指定する

複数のSSHキーペアがある場合や、キーがデフォルトの場所にない場合は、-iオプションでどの秘密鍵を使用するかを指定できます。

ssh -i /path/to/your/private_key user@remote_host

SSHキーの管理

より多くのサーバーにアクセスするにつれて、より多くのSSHキーが蓄積されます。効率的な管理が、セキュリティと利便性を維持するための鍵です。

SSHエージェント

SSHエージェントは、パスフレーズで復号化された秘密鍵をメモリに保持するバックグラウンドプログラムです。これにより、パスフレーズを毎回再入力することなく、複数のSSH接続に鍵を使用できるようになります。

  • SSHエージェントの起動: エージェントは、デスクトップ環境にログインすると自動的に起動されることがよくあります。そうでない場合は、手動で起動できます。
    bash eval "$(ssh-agent -s)"
  • エージェントにキーを追加する: エージェントが実行されたら、秘密鍵を追加します。
    bash ssh-add ~/.ssh/id_ed25519
    パスフレーズの入力を求められます。この後、エージェントが鍵を管理し、その後のSSH接続で自動的に使用されます。

SSH設定ファイル (~/.ssh/config)

SSHクライアント設定ファイル(~/.ssh/config)を使用すると、ホストのエイリアスを定義し、特定のホストに使用するキーを含む接続パラメータを指定できます。これは複数のサーバーを管理するのに非常に役立ちます。

ローカルマシン上の~/.ssh/configファイルを作成または編集し、次のようなエントリを追加します。

# デフォルト設定
Host *
  ForwardAgent yes
  ServerAliveInterval 60

# サーバー1:Webサーバー
Host webserver
  HostName 192.168.1.100
  User webadmin
  Port 2222
  IdentityFile ~/.ssh/webserver_key

# サーバー2:データベースサーバー
Host dbserver
  HostName db.example.com
  User dbuser
  IdentityFile ~/.ssh/db_key

この設定により、以下を使用してWebサーバーに接続できます。

ssh webserver

そして、以下を使用してデータベースサーバーに接続できます。

ssh dbserver

SSHクライアントは、~/.ssh/configファイルで定義された正しいユーザー名、ポート、および秘密鍵ファイルを自動的に使用します。

キーのローテーションと失効

  • ローテーション: 特に機密性の高いシステムについては、定期的にSSHキーのローテーションを検討してください。これには、新しい鍵を生成し、古い公開鍵をサーバー上で置き換えることが含まれます。
  • 失効: 秘密鍵が侵害された場合や、アクセスが不要になった場合、デプロイされていたすべてのサーバーのauthorized_keysファイルから、対応する公開鍵を削除する必要があります。これはセキュリティを維持するために不可欠です。

ベストプラクティスとセキュリティのヒント

  • パスフレーズを使用する: 常に強力なパスフレーズで秘密鍵を保護してください。これは、秘密鍵ファイルが盗まれた場合の不正使用に対する主要な防御策です。
  • 秘密鍵の権限を保護する: 秘密鍵ファイルが600権限(-rw-------)を持つことを確認してください。
  • ssh-agentを使用する: SSHエージェントを活用して、パスフレーズを繰り返し入力する手間を省きましょう。
  • パスワード認証を無効にする: SSHキー認証が機能したら、追加のセキュリティレイヤーとしてパスワードベースの認証をサーバーで無効にすることを検討してください。
  • 鍵を最新に保つ: Ed25519のような最新の強力なアルゴリズムを使用してください。十分なビット長(少なくとも4096ビット)を持たない古いRSAキーは避けてください。
  • authorized_keysに注意する: 信頼できるソースからの公開鍵のみをauthorized_keysファイルに追加してください。
  • 定期的な監査: サーバー上のauthorized_keysファイルを定期的にレビューし、許可された鍵のみが存在することを確認してください。

結論

SSHキーは、リモートサーバー管理のセキュリティと利便性を向上させるための強力なツールです。ssh-keygenssh-copy-idなどのツールを使用してSSHキーペアの生成、デプロイ、管理を習得することで、パスワードベースの認証を超えて、より安全で効率的なリモートアクセスワークフローを確立できます。強力なパスフレーズの使用と秘密鍵の保護によってセキュリティを優先することを忘れないでください。