Linux & IT ノート

SSH 入門:鍵認証で安全にログインする

管理人 約10分で読めます

サーバーをリモートで操作するとき、今や事実上の標準となっているのが SSH(Secure Shell)です。 通信経路を暗号化してくれるため、パスワードやコマンドが第三者に盗聴されません。 さらにパスワード認証より安全な「公開鍵認証」を使えば、鍵ファイルを持っていない限りログインできなくなります。 本記事では、基本的な接続から鍵の生成・設置、設定ファイルの整理、サーバー側のセキュリティ設定まで順を追って解説します。

基本的な SSH 接続

最も単純な使い方は、ユーザー名とホスト名を指定するだけです。

ssh user@192.168.1.10
ssh user@example.com

デフォルトのポートは 22 ですが、変更されている場合は -p で指定します。

ssh -p 2222 user@example.com

初回接続時に「このホストのフィンガープリントを信頼しますか?」と聞かれます。 表示された fingerprint がサーバー管理者に確認したものと一致していれば yes と答えてください。 これは中間者攻撃を防ぐための確認ステップです。

公開鍵認証の設定

鍵ペアを生成する

パスワード認証は「知っている情報(パスワード)」による認証で、ブルートフォース攻撃の標的になります。 公開鍵認証は「持っている情報(秘密鍵ファイル)」による認証なので、鍵を持たない攻撃者は原理的にログインできません。

鍵の生成には ssh-keygen を使います。アルゴリズムは ed25519 を推奨します。 RSA より短い鍵長で同等以上の安全性を持ち、処理も速いためです。

ssh-keygen -t ed25519 -C "your@email.com"

-C はコメントで、鍵の用途や所有者を区別するために使います。省略しても構いません。 実行すると保存場所(デフォルト: ~/.ssh/id_ed25519)とパスフレーズを聞かれます。 パスフレーズは空でも動きますが、設定しておくと秘密鍵ファイルを盗まれた場合の最後の防壁になります。

生成後、2つのファイルができます。

ファイル役割
~/.ssh/id_ed25519秘密鍵(自分のPCに置く。絶対に外に出さない)
~/.ssh/id_ed25519.pub公開鍵(サーバーに登録する)

パーミッションを正しく設定する

SSH クライアントは鍵ファイルのパーミッションが緩いと接続を拒否します。 連載 #3 で学んだパーミッション管理がここで活きます。

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

~/.ssh ディレクトリは所有者のみアクセス可(700)、秘密鍵は所有者のみ読み書き可(600)が必須です。

公開鍵をサーバーに登録する

ssh-copy-id が使える環境なら、これが最も簡単です。

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

まだパスワード認証でログインし、~/.ssh/authorized_keys に公開鍵を追記してくれます。

手動で行う場合は、公開鍵の中身(.pub ファイルの1行テキスト)をサーバーの ~/.ssh/authorized_keys に追記します。

# ローカルで公開鍵の内容を確認
cat ~/.ssh/id_ed25519.pub

# サーバー上で authorized_keys に追記
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ここに公開鍵の内容を貼り付け" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

登録後、鍵認証でログインできるか確認しましょう。

ssh -i ~/.ssh/id_ed25519 user@example.com

-i で使う秘密鍵ファイルを明示しています。ファイル名がデフォルト(id_ed25519 等)なら省略できます。

~/.ssh/config で接続を整理する

接続先が増えてくると、ホスト名・ユーザー名・ポート・鍵ファイルを毎回指定するのが面倒になります。 ~/.ssh/config に設定を書いておけば、短いエイリアスで接続できるようになります。

Host myserver
    HostName example.com
    User alice
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host dev
    HostName 192.168.1.20
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519_dev

設定後は ssh myserver と打つだけで接続できます。

ssh myserver    # ssh -p 2222 -i ~/.ssh/id_ed25519 alice@example.com と同等
ssh dev

~/.ssh/config のパーミッションも 600 にしておくのが無難です。

chmod 600 ~/.ssh/config

サーバー側のセキュリティ設定(sshd_config)

鍵認証を設定しても、パスワード認証が有効なままでは意味が半減します。 サーバー側の SSH デーモン設定ファイル /etc/ssh/sshd_config を編集してセキュリティを強化しましょう。

sudo nano /etc/ssh/sshd_config

最低限変更しておきたい設定:

# パスワード認証を無効化(鍵認証のみにする)
PasswordAuthentication no

# root への直接ログインを禁止
PermitRootLogin no

# 鍵認証を明示的に有効化
PubkeyAuthentication yes

設定を変更したら SSH デーモンを再起動して反映します。

sudo systemctl restart sshd

重要: 再起動の前に、鍵認証でログインできることを別のターミナルセッションで確認しておいてください。 設定を誤ってパスワードも鍵も使えない状態にすると、コンソール(VNC やシリアル接続)からしかアクセスできなくなります。 別セッションを開いたまま設定変更 → 再起動 → 別セッションから新規ログイン確認、という手順を踏むのが安全です。

また、秘密鍵は絶対にサーバーに置かない、第三者に渡さないことが鍵管理の基本です。 複数のサーバーに接続する場合でも、秘密鍵は常に手元のマシンに置いておきます。

ファイル転送とポートフォワード

SSH が確立できると、ファイル転送や通信のトンネリングも使えるようになります。

scp / rsync でファイル転送

# ローカル → リモート
scp localfile.txt user@example.com:/home/user/

# リモート → ローカル
scp user@example.com:/home/user/data.csv ./

# ディレクトリごと転送
scp -r ./project user@example.com:/home/user/

# rsync(差分転送・高速)
rsync -avz ./project/ user@example.com:/home/user/project/

rsync は変更差分だけ転送するため、大きなディレクトリの同期に向いています。 -a でパーミッションなどの属性を保持、-z で圧縮転送します。

ポートフォワード(-L)

ローカルのポートをリモートのサービスに繋ぐ使い方です。 たとえばリモートサーバーで localhost:5432 で動いている PostgreSQL に、手元のマシンから接続したい場合:

ssh -L 15432:localhost:5432 user@example.com

このコマンドを実行すると、手元の 15432 番ポートへの接続がリモートの 5432 番に転送されます。 ファイアウォールで外部公開されていないサービスに安全にアクセスできる、実用性の高いテクニックです。

実践的なコツと落とし穴

鍵認証に切り替えたあと、よくハマるのが「どの鍵を使っているかわからなくなる」問題です。 複数のサーバーに異なる鍵を使っている場合は、~/.ssh/configIdentityFile で明示的に指定しておくと混乱を防げます。 ssh -v で詳細ログを出力すれば、どの鍵を試みているか確認できます。

ssh -v user@example.com

Offering public key の行で試みている鍵ファイルが確認できます。

もう一つの落とし穴は authorized_keys のパーミッションです。 chmod 600 ~/.ssh/authorized_keys を忘れると、サーバー側が鍵ファイルを読んでくれません。 「鍵を登録したのに認証できない」ときはまずパーミッションを確認する習慣をつけましょう。

パスフレーズ付きの鍵を使う場合、毎回パスフレーズを入力するのが煩わしければ ssh-agent が便利です。 一度 ssh-add しておけば、セッション中は再入力不要になります。

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

まとめ

SSH の基本から鍵認証・設定ファイル・セキュリティ強化まで、実用に必要な知識をひとまとめにしました。

  • 鍵認証は ssh-keygen -t ed25519 で鍵を生成し、公開鍵をサーバーの authorized_keys に登録する
  • ~/.ssh/config で接続先を管理すると作業効率が上がる
  • sshd_configPasswordAuthentication noPermitRootLogin no を設定して締める
  • 設定変更は別セッションを開いたまま行い、必ず疎通確認してから既存セッションを閉じる

これで連載「Linux 実践入門」は完結です。 第1回のターミナル操作とファイル管理に始まり、シェルの基本操作、権限管理(#3)、プロセス管理、テキスト処理、パッケージ管理、systemd と、Linux を日常的に扱うための土台を順番に積み上げてきました。 今回の SSH でリモートサーバーを安全に操作できるようになれば、VPS の運用・CI/CD との連携・開発環境の構築など、次のステップへの扉が開きます。 各回の知識は独立しているようで互いに繋がっています。ぜひ手を動かしながら定着させてください。