※本記事にはプロモーション(広告)を含みます。

SSH公開鍵認証を正しく設定すれば、パスワード入力の手間をなくし、セキュリティを大幅に向上させられます。サーバー管理者であれば、公開鍵認証の仕組みと実践的な設定方法を理解しておくことが必須です。この記事では、SSH公開鍵認証の基礎理論から、具体的な設定手順、トラブルシューティングまで、実務で即活用できる知識を網羅的に解説します。


目次

SSH公開鍵認証とは
公開鍵認証を使うべき理由
SSH鍵ペアの生成方法
公開鍵をサーバーに配置する
SSHサーバーの設定変更
接続テストと動作確認
応用的な設定と管理
トラブルシューティング
ベストプラクティスとセキュリティ強化
よくある質問
まとめ


SSH公開鍵認証とは

SSH公開鍵認証は、暗号化された鍵ペア(公開鍵と秘密鍵)を用いてユーザー認証を行う仕組みです。従来のパスワード認証と比較して、以下の特徴があります。

  • 高いセキュリティ:総当たり攻撃に対して耐性があります
  • 自動化が容易:パスワード入力が不要でスクリプト処理に適しています
  • 鍵の管理が重要:秘密鍵の漏洩は即座にセキュリティリスクに直結します

SSH公開鍵認証の仕組みは以下の通りです。

  1. クライアントは秘密鍵で署名を生成します
  2. サーバーは公開鍵で署名を検証します
  3. 検証に成功すれば認証が完了します

この仕組みにより、パスワードを送信する必要がなく、ネットワーク上で認証情報が盗まれるリスクを大幅に低減できます。


公開鍵認証を使うべき理由

SSH公開鍵認証を導入する主なメリットは以下の通りです。

比較項目パスワード認証公開鍵認証
セキュリティレベル低(総当たり攻撃に弱い)高(暗号化により安全)
自動化のしやすさ難しい(パスワード入力が必要)容易(鍵ベースで認証)
管理コスト低(設定が簡単)中(鍵の管理が必要)
パスワード変更頻度定期的な変更が推奨鍵のローテーションで対応可能

特に企業や個人サーバーで複数のユーザーを管理する場合、公開鍵認証は必須のセキュリティ対策と言えます。パスワード認証は総当たり攻撃や辞書攻撃の対象になりやすいため、インターネットに公開する SSH サーバーでは公開鍵認証への移行が推奨されます。


SSH鍵ペアの生成方法

SSH鍵ペアを生成するには、ssh-keygenコマンドを使用します。以下に基本的な手順を示します。

1. 鍵ペアの生成

ターミナルを開き、以下のコマンドを実行します。

ssh-keygen -t ed25519 -C "your_email@example.com"

このコマンドは以下の設定で鍵ペアを生成します。

  • 暗号化方式:ed25519(推奨)
  • コメント:鍵の用途や所有者を識別するための任意のテキスト

実行すると以下のようなプロンプトが表示されます。

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub

2. 鍵ファイルの保存場所

鍵ファイルは通常、以下のディレクトリに保存されます。

  • 秘密鍵:~/.ssh/id_ed25519(デフォルト)
  • 公開鍵:~/.ssh/id_ed25519.pub(デフォルト)

鍵ファイルのパーミッションは以下のように設定する必要があります。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 644 ~/.ssh/authorized_keys

これらのパーミッション設定はセキュリティ上非常に重要です。秘密鍵のパーミッションは600(所有者のみ読み書き可)に設定してください。

3. 鍵の種類と特徴

SSHで使用できる鍵の種類には以下のものがあります。

鍵タイプ特徴推奨度鍵長
ed25519高速で安全性が高い。最新の標準規格★★★★★256ビット
rsa広く普及しているが、処理が遅い★★★☆☆2048ビット以上
ecdsa楕円曲線暗号。安全性は高いが互換性に注意★★★☆☆256ビット以上

ed25519を使用することを強く推奨します。これはNIST(米国立標準技術研究所)によっても安全性が認められており、処理速度も優れています。RSA鍵を使用する場合は、少なくとも2048ビット以上の長さを確保してください。

4. パスフレーズの設定

鍵生成時にパスフレーズを設定することで、秘密鍵のさらなる保護が可能です。パスフレーズは以下の特徴があります。

  • 利点:秘密鍵が盗まれても、パスフレーズがなければ使用できません
  • 欠点:毎回入力が必要で利便性が低下します

パスフレーズは10文字以上で、大文字・小文字・数字・記号を含む複雑なものを設定することを推奨します。


公開鍵をサーバーに配置する

生成した公開鍵をサーバーに配置する方法には、主に以下の3つがあります。

1. ssh-copy-idコマンドを使用する方法

最も簡単な方法はssh-copy-idコマンドを使用することです。以下のコマンドで公開鍵をサーバーにコピーできます。

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

このコマンドは以下の処理を行います。

  1. 公開鍵をサーバーの~/.ssh/authorized_keysに追加
  2. 必要に応じて.sshディレクトリとauthorized_keysファイルを作成
  3. パーミッションを自動的に設定

注意点:ssh-copy-idコマンドが利用できない場合は、手動で公開鍵を配置する必要があります。

2. 手動で公開鍵を配置する場合

手動で公開鍵を配置する場合は、以下の手順で行います。

手順1:公開鍵の内容を確認

cat ~/.ssh/id_ed25519.pub

出力例:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMJvKqQ3X5X7Y8Z9W0X1Y2Z3A4B5C6D7E8F9G0H1I2 user@email.com

手順2:サーバーに接続

ssh user@server-ip

手順3:公開鍵をauthorized_keysに追加

mkdir -p ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMJvKqQ3X5X7Y8Z9W0X1Y2Z3A4B5C6D7E8F9G0H1I2 user@email.com" >> ~/.ssh/authorized_keys

手順4:パーミッションを設定

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

3. 複数の公開鍵を管理する方法

複数のユーザーやデバイスからアクセスする場合、authorized_keysファイルに複数の公開鍵を追加します。各行に1つの公開鍵を記述します。

また、~/.ssh/authorized_keysファイルには以下のオプションを追加できます。

  • from=”ip-address”:特定のIPアドレスからのみ接続を許可
  • command=”command”:特定のコマンドのみ実行を許可
  • no-port-forwarding:ポートフォワーディングを禁止します

例:

from="192.168.1.100" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMJvKqQ3X5X7Y8Z9W0X1Y2Z3A4B5C6D7E8F9G0H1I2 user@email.com

SSHサーバーの設定変更

SSHサーバー(sshd)の設定を変更することで、公開鍵認証を有効にし、セキュリティを強化できます。設定ファイルは通常/etc/ssh/sshd_configにあります。

1. 設定ファイルの編集

設定ファイルを編集するには、以下のコマンドを使用します。

sudo vi /etc/ssh/sshd_config

以下のパラメータを確認・設定します。

パラメータ設定値説明
PubkeyAuthenticationyes公開鍵認証を有効化
PasswordAuthenticationnoパスワード認証を無効化(推奨)
ChallengeResponseAuthenticationnoチャレンジレスポンス認証を無効化
UsePAMnoPAM(Pluggable Authentication Modules)を無効化
PermitRootLoginprohibit-passwordrootユーザーの直接ログインを禁止(鍵認証のみ許可)

重要:設定を変更した後は、必ずsshdサービスを再起動してください。

sudo systemctl restart sshd

2. セキュリティ強化のための追加設定

基本的な設定に加えて、以下のセキュリティ強化設定を追加することを推奨します。

パラメータ設定値説明
MaxAuthTries3認証試行回数の制限
LoginGraceTime60ログイン猶予時間(秒)
ClientAliveInterval300クライアント生存確認の間隔(秒)
ClientAliveCountMax2生存確認に応答しない場合の最大回数
AllowUsersuser1 user2特定のユーザーのみ接続を許可

これらの設定により、SSHサーバーへの不正アクセスを大幅に防ぐことができます。

3. SSHポートの変更

デフォルトのSSHポート(22)は攻撃者に狙われやすいため、ポート番号を変更することを推奨します。

設定ファイルで以下の行を追加します。

Port 2222

ポートを変更した場合は、ファイアウォールの設定も更新する必要があります。

sudo ufw allow 2222/tcp

注意:ポートを変更する場合は、必ず新しいポートで接続できることを確認してから古いポートを閉じてください。


接続テストと動作確認

SSH公開鍵認証の設定が完了したら、実際に接続テストを行います。以下の手順で動作を確認します。

1. 接続テスト

以下のコマンドでSSH接続を試みます。

ssh -i ~/.ssh/id_ed25519 user@server-ip -p 2222

接続に成功すると、以下のようなプロンプトが表示されます。

Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-76-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Last login: Mon Jan  1 00:00:00 2024 from 192.168.1.100
user@server:~$

2. 接続ログの確認

SSH接続のログは/var/log/auth.log(Ubuntu/Debian系)または/var/log/secure(RHEL/CentOS系)で確認できます。

sudo tail -f /var/log/auth.log

接続成功時のログ例:

Jan  1 00:00:00 server sshd[1234]: Accepted publickey for user from 192.168.1.100 port 12345 ssh2: RSA SHA256:abcdef...

3. 接続トラブルの診断

接続に失敗した場合は、以下の点を確認します。

確認項目確認方法解決策
秘密鍵のパーミッションls -l ~/.ssh/id_ed25519chmod 600 ~/.ssh/id_ed25519
公開鍵の配置cat ~/.ssh/authorized_keys公開鍵が正しく追加されているか確認
sshd_configの設定sudo grep PubkeyAuthentication /etc/ssh/sshd_configPubkeyAuthenticationがyesになっているか確認
ファイアウォール設定sudo ufw statusSSHポートが開放されているか確認
ポート番号の一致ssh -v -i ~/.ssh/id_ed25519 user@server-ip接続に使用するポートが正しいか確認

接続に失敗した場合は、ssh -vコマンドで詳細なデバッグ情報を取得できます。

ssh -v -i ~/.ssh/id_ed25519 user@server-ip

応用的な設定と管理

基本的な設定が完了したら、より高度な設定や管理方法について学びましょう。

1. 鍵のローテーション

定期的な鍵のローテーションはセキュリティを維持するために重要です。鍵のローテーション手順は以下の通りです。

  1. 新しい鍵ペアを生成します
  2. 新しい公開鍵をサーバーのauthorized_keysに追加します
  3. 古い公開鍵をauthorized_keysから削除します
  4. 古い秘密鍵を削除します

鍵のローテーションは少なくとも年に1回、またはセキュリティインシデントが発生した場合に実施することを推奨します。

2. 複数の鍵を使い分ける

用途に応じて複数の鍵ペアを使い分けることで、セキュリティをさらに強化できます。

用途鍵タイプ保存場所注意事項
日常的な作業ed25519ローカルPCパスフレーズ付きで管理
バックアップサーバーrsa 4096bit専用USBドライブ物理的なセキュリティに注意
CI/CDパイプラインed25519専用サーバー鍵の権限を厳格に管理

3. SSHエージェントの活用

SSHエージェントを使用すると、パスフレーズの入力を1回で済ませ、複数のSSH接続を簡単に管理できます。

SSHエージェントの起動

eval "$(ssh-agent -s)"

秘密鍵の追加

ssh-add ~/.ssh/id_ed25519

これにより、一度パスフレーズを入力すれば、そのセッション内で複数のSSH接続が可能になります。

4. 2要素認証の導入

SSHに2要素認証(2FA)を導入することで、さらにセキュリティを強化できます。一般的な方法は以下の通りです。

  1. Google AuthenticatorなどのOTP(ワンタイムパスワード)アプリをインストール
  2. libpam-google-authenticatorをインストール
  3. Google AuthenticatorでQRコードをスキャンして設定
  4. sshd_configに以下の設定を追加
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
UsePAM yes

これにより、SSH接続時に公開鍵認証に加えて、OTPコードの入力が求められます。


トラブルシューティング

SSH公開鍵認証の設定や運用中に発生する可能性のある問題とその解決策をまとめます。

1. 接続できない

症状:SSH接続に失敗する

原因と解決策:

  • 秘密鍵のパーミッションが不適切
    • 解決策:chmod 600 ~/.ssh/id_ed25519
  • 公開鍵が正しく配置されていない
    • 解決策:~/.ssh/authorized_keysに公開鍵が正しく追加されているか確認
  • sshd_configの設定が間違っている
    • 解決策:PubkeyAuthentication yesとPasswordAuthentication noが設定されているか確認
  • ファイアウォールでSSHポートがブロックされている
    • 解決策:ファイアウォールの設定を確認し、SSHポートを開放

2. パスフレーズを毎回入力せずに済ませる方法

症状:秘密鍵にパスフレーズを設定したため、毎回入力が必要

解決策:SSHエージェントを使用します。

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

これにより、一度パスフレーズを入力すれば、そのセッション内で複数のSSH接続が可能になります。

3. 鍵が古くなった

症状:鍵の有効期限が切れた、またはセキュリティ上の懸念がある

解決策:鍵のローテーションを行います。

  1. 新しい鍵ペアを生成
  2. 新しい公開鍵をサーバーに配置
  3. 古い公開鍵をauthorized_keysから削除
  4. 古い秘密鍵を削除

4. 接続が切断される

症状:SSH接続が一定時間後に切断される

原因と解決策:

  • アイドルタイムアウト
    • 解決策:ClientAliveIntervalとClientAliveCountMaxを調整
  • ネットワークの不安定さ
    • 解決策:ネットワーク接続を確認し、必要に応じて再接続

5. 秘密鍵が漏洩した

症状:秘密鍵が第三者に漏洩した可能性がある

緊急対応:

  1. 直ちにサーバーのauthorized_keysから該当の公開鍵を削除
  2. 秘密鍵を無効化し、新しい鍵ペアを生成
  3. サーバーのsshd_configを再設定し、sshdを再起動
  4. システム全体のセキュリティ監査を実施

予防策:

  • 秘密鍵は暗号化されたストレージに保管
  • 鍵のバックアップは厳重に管理
  • 定期的なセキュリティ監査を実施

ベストプラクティスとセキュリティ強化

SSH公開鍵認証を安全かつ効果的に運用するためのベストプラクティスを紹介します。

1. 鍵管理のベストプラクティス

  • 秘密鍵の保護
    • 秘密鍵は暗号化されたストレージに保管
    • 物理的なセキュリティにも注意(USBドライブなど)
    • バックアップは暗号化して別の場所に保管
  • 鍵の分離
    • 用途ごとに異なる鍵ペアを使用
    • 個人用、業務用、バックアップ用など用途別に管理
  • 鍵のローテーション
    • 少なくとも年に1回は鍵をローテーション
    • セキュリティインシデント発生時は直ちにローテーション

2. サーバー設定のベストプラクティス

  • 最小権限の原則
    • 必要なユーザーのみSSH接続を許可
    • AllowUsersやDenyUsersを活用
  • ポートセキュリティ
    • SSHポートを22から変更(例:2222)
    • ファイアウォールで特定のIPアドレスからのみ接続を許可

よくある質問

LinuxのSSH公開鍵認証に関する導入や運用で、多くの方が抱く疑問やトラブルシューティングについて、具体的な事例と解決策を紹介します。

Q1. 公開鍵認証で「Permission denied (publickey)」エラーが発生した場合の対処法は?

このエラーは、クライアント側の鍵がサーバーで正しく認識されていない、またはファイルのパーミッションが不適切な場合に発生します。まず、クライアントの秘密鍵(例:~/.ssh/id_rsa)のパーミッションを「600」に設定し、所有者のみが読み取り可能な状態にします。次に、サーバー側でauthorized_keysファイル(~/.ssh/authorized_keys)のパーミッションを「600」、親ディレクトリの.sshディレクトリを「700」に設定します。また、sshd_configでPubkeyAuthentication yesが有効になっているか確認し、sshdサービスを再起動します。それでも解決しない場合は、鍵の形式や改行コード(LF)が正しいか、ssh -v コマンドで詳細なログを確認してください。

Q2. 複数の鍵を使い分ける方法は?

SSHでは、ssh_configやssh-agentを活用して複数の鍵を使い分けることができます。例えば、~/.ssh/configファイルに以下のように設定します:

Host example1
HostName example.com
User user1
IdentityFile ~/.ssh/key1

Host example2
HostName example2.com
User user2
IdentityFile ~/.ssh/key2

これにより、example1に接続する際はkey1、example2にはkey2が自動的に使用されます。また、ssh-addコマンドで鍵をssh-agentに登録し、パスフレーズの入力を一度で済ませることも可能です。鍵の使い分けは、用途やセキュリティ要件に応じて柔軟に設定しましょう。

Q3. 公開鍵認証のセキュリティをさらに強化する方法は?

公開鍵認証のセキュリティを高めるには、鍵の長さを2048ビット以上に設定し、定期的に鍵をローテーションすることが推奨されます。また、sshd_configで以下の設定を追加することで、不正アクセスのリスクを低減できます:

PasswordAuthentication no
PermitRootLogin no
AllowUsers user1 user2
MaxAuthTries 3
LoginGraceTime 30

さらに、fail2banなどのツールを導入して、不正なログイン試行を自動的にブロックする仕組みを構築するのも有効です。鍵の管理は慎重に行い、バックアップや廃棄時の処理にも注意が必要です。

Q4. 公開鍵認証とパスワード認証を併用することは可能?

はい、SSHでは公開鍵認証とパスワード認証を併用することができます。sshd_configで以下のように設定します:

AuthenticationMethods publickey,password

これにより、公開鍵認証に失敗した場合でも、パスワード認証にフォールバックします。ただし、セキュリティ要件によっては、公開鍵認証のみを有効にすることが望ましい場合もあります。併用する際は、パスワードの強度やアカウント管理に十分注意し、不要なリスクを回避しましょう。設定変更後はsshdサービスを再起動して反映させます。

まとめ

LinuxにおけるSSH公開鍵認証は、パスワード認証と比較してセキュリティを強化する手法の一つです。鍵ペアの生成から始まり、サーバーへの公開鍵の配置、そしてクライアント側の設定まで、一連の流れを正しく理解しておくことが重要です。特に、鍵の管理や権限設定には注意が必要であり、不適切な設定がセキュリティリスクにつながる可能性があります。また、SSHの設定ファイルを編集する際は、バックアップを取得しておくことで、万が一のトラブルに備えることが推奨されます。

実務では、公開鍵認証を活用することで、人的ミスによるパスワードの漏洩リスクを低減できます。一方で、鍵の紛失や管理の煩雑さといった課題も存在します。そのため、目的に応じた適切な認証方式の選択や、定期的なセキュリティレビューが求められます。SSH公開鍵認証の仕組みと運用方法を正しく把握し、安全なリモートアクセス環境を構築していきましょう。

【編集・制作ポリシー】
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら
ABOUT ME
たから
フリーランスIT講師/エンジニア。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900//サーティファイC言語/情報処理技術者 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営