SSHの接続方法と鍵認証の設定|ssh-keygenからconfig活用までコマンド


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドP-T, ネットワーク管理コマンド > SSHの接続方法と鍵認証の設定|ssh-keygenからconfig活用までコマンド
「LinuxサーバーにSSHで接続したいけど、鍵認証の設定がよくわからない」
「毎回パスワードを入力するのが面倒。鍵認証に切り替えたい」
「Permission denied (publickey) と表示されて接続できない」

SSHはLinuxサーバーをリモートで操作するための必須技術です。パスワード認証のままだと、ブルートフォース攻撃(総当たり攻撃)の標的になります。
この記事では、SSHの基本的な接続方法から、鍵認証の設定、configファイルによる接続の効率化、セキュリティ強化まで、実務で必要な知識を網羅します。

SSHとは?

SSH(Secure Shell)は、ネットワーク越しにサーバーへ安全にログインするためのプロトコルです。

通信内容がすべて暗号化されるため、パスワードやコマンドが盗聴される心配がありません。以前使われていたtelnetは通信が平文(暗号化なし)だったため、現在はSSHが標準です。

SSHでできることは主に以下の3つです。

リモートログイン:サーバーにログインしてコマンドを実行する
ファイル転送:scp や sftp でファイルを送受信する
ポートフォワーディング:トンネルを作って別のサービスに安全にアクセスする

基本的な接続方法

1. パスワード認証で接続する

最もシンプルな接続方法です。

# ユーザー名@ホスト名(またはIPアドレス)で接続 ssh user@192.168.1.100 # ポート番号を指定する場合(デフォルトは22) ssh -p 2222 user@192.168.1.100

初回接続時は「このサーバーを信頼しますか?」という確認が表示されます。yesと入力すると、サーバーの公開鍵が ~/.ssh/known_hosts に保存されます。

The authenticity of host '192.168.1.100' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

2. コマンドを指定して実行する

ログインせずに、リモートサーバーでコマンドを1つだけ実行して結果を受け取ることもできます。

# リモートサーバーのディスク使用量を確認 ssh user@192.168.1.100 df -h # リモートサーバーのログを確認 ssh user@192.168.1.100 tail -20 /var/log/messages

複数台のサーバーを管理している場合、いちいちログインしなくても状態を確認できるので便利です。

SSH鍵認証の設定

鍵認証は、パスワードの代わりに「秘密鍵」と「公開鍵」のペアで認証する方式です。パスワード認証より安全で、設定後はパスワード入力なしで接続できます。

1. 鍵ペアを作成する(ssh-keygen)

まず、クライアント側(接続元のPC)で鍵ペアを作成します。

# ED25519形式で鍵を作成(現在の推奨) ssh-keygen -t ed25519 -C "your_email@example.com" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): # Enterでデフォルト 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

-t ed25519:鍵の暗号アルゴリズムを指定。ED25519はRSAより短い鍵長で同等以上の強度があり、現在の推奨
-C:コメント。どの鍵かを識別するためのメモ(省略可)
パスフレーズ:秘密鍵を保護するパスワード。空にもできるが、セキュリティ上は設定を推奨

※ ED25519に対応していない古い環境では、RSA 4096bitを使います。

# RSA形式(古い環境向け) ssh-keygen -t rsa -b 4096

2. 公開鍵をサーバーに登録する(ssh-copy-id)

作成した公開鍵を、接続先サーバーの ~/.ssh/authorized_keys に登録します。

# 公開鍵をサーバーにコピー(最も簡単な方法) ssh-copy-id user@192.168.1.100 # ポート番号を指定する場合 ssh-copy-id -p 2222 user@192.168.1.100

ssh-copy-idが使えない環境では、手動で登録します。

# 手動で公開鍵を登録する場合 cat ~/.ssh/id_ed25519.pub | ssh user@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

3. 鍵認証で接続する

公開鍵の登録が完了すれば、パスワードなしで接続できます。

# 鍵認証で接続(パスフレーズのみ求められる) ssh user@192.168.1.100 # 秘密鍵を明示的に指定する場合 ssh -i ~/.ssh/id_ed25519 user@192.168.1.100

【重要】パーミッションの設定

SSH鍵認証が動作するには、ファイルのパーミッションが正しく設定されている必要があります。パーミッションが緩すぎると、SSHは鍵を無視してパスワード認証にフォールバックします。

# クライアント側(接続元) chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 # 秘密鍵 chmod 644 ~/.ssh/id_ed25519.pub # 公開鍵 # サーバー側(接続先) chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

~/.ssh/config で接続を効率化する

毎回ユーザー名やIPアドレス、ポート番号を入力するのは面倒です。~/.ssh/config に接続先の情報を書いておけば、短い名前だけで接続できます。

1. configファイルの基本的な書き方

# ~/.ssh/config Host web01 HostName 192.168.1.100 User admin Port 22 IdentityFile ~/.ssh/id_ed25519 Host db01 HostName 192.168.1.200 User dbadmin Port 2222 IdentityFile ~/.ssh/id_ed25519

これで、以下のように短い名前だけで接続できます。

# configに定義した名前で接続 ssh web01 ssh db01 # scpやrsyncでも同じ名前が使える scp backup.tar.gz web01:/tmp/ rsync -av /data/ db01:/backup/

2. 全ホスト共通の設定

Host * で全接続先に共通のデフォルト設定を指定できます。

# ~/.ssh/config(先頭に記述) Host * ServerAliveInterval 60 ServerAliveCountMax 3 IdentitiesOnly yes

ServerAliveInterval 60:60秒ごとにサーバーへ生存確認を送信(無操作タイムアウト防止)
ServerAliveCountMax 3:3回応答がなければ切断
IdentitiesOnly yes:configで指定した鍵だけを使う(余計な鍵を試さない)

セキュリティ強化の設定

1. パスワード認証を無効にする

鍵認証の設定が完了したら、パスワード認証を無効にしてブルートフォース攻撃を防ぎます。

※ 必ず鍵認証で接続できることを確認してから実施してください。

# /etc/ssh/sshd_config を編集 sudo vi /etc/ssh/sshd_config # 以下の行を変更 PasswordAuthentication no # sshdを再起動して反映 sudo systemctl restart sshd

2. rootログインを禁止する

rootで直接SSHログインできる状態はセキュリティリスクです。一般ユーザーでログインしてからsudoを使う運用にしましょう。

# /etc/ssh/sshd_config PermitRootLogin no # sshdを再起動 sudo systemctl restart sshd

3. SSHのポート番号を変更する

デフォルトのポート22は攻撃者に狙われやすいため、別のポート番号に変更する方法もあります。

# /etc/ssh/sshd_config Port 2222 # sshdを再起動 sudo systemctl restart sshd # firewalldを使っている場合はポートも開放 sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload

トラブルシュート・エラー対処

「Permission denied (publickey)」が出た時の対処法

鍵認証の設定に問題がある場合に発生します。以下を順番に確認してください。

# 1. パーミッションを確認(サーバー側) ls -la ~/.ssh/ # .ssh は 700、authorized_keys は 600 であること # 2. 公開鍵が正しく登録されているか確認 cat ~/.ssh/authorized_keys # 3. -vオプションで詳細ログを出して原因を特定 ssh -v user@192.168.1.100

-v(verbose)オプションで接続の詳細が表示されます。どの鍵を試しているか、どこで拒否されたかがわかります。さらに詳しくするには -vv や -vvv を使います。

「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」が出た時の対処法

サーバーを再インストールした場合や、IPアドレスが別のサーバーに変わった場合に表示されます。

# known_hostsから該当ホストのエントリを削除 ssh-keygen -R 192.168.1.100 # 再度接続すると、新しい鍵のフィンガープリントが登録される ssh user@192.168.1.100

ただし、このメッセージは中間者攻撃(MITM)の可能性もあるため、サーバーの変更に心当たりがない場合はサーバー管理者に確認してください。

「Connection timed out」「Connection refused」が出た時の対処法

# Connection timed out: ネットワーク疎通を確認 ping 192.168.1.100 # Connection refused: sshdが起動しているか確認(サーバー側で実行) sudo systemctl status sshd # ファイアウォールでポートが開いているか確認 sudo firewall-cmd --list-all

本記事のまとめ

やりたいこと コマンド
サーバーにSSH接続する ssh ユーザー名@ホスト名
ポート番号を指定して接続する ssh -p ポート番号 ユーザー名@ホスト名
SSH鍵ペアを作成する ssh-keygen -t ed25519
公開鍵をサーバーに登録する ssh-copy-id ユーザー名@ホスト名
秘密鍵を指定して接続する ssh -i 鍵ファイルパス ユーザー名@ホスト名
接続の詳細ログを表示する ssh -v ユーザー名@ホスト名
known_hostsのエントリを削除する ssh-keygen -R ホスト名
リモートでコマンドを実行する ssh ユーザー名@ホスト名 コマンド

SSH接続の「その先」、サーバー構築を体系的に学びませんか?

SSHでサーバーに接続できるようになったら、次はWebサーバーやファイアウォールの構築です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る