DebianでSSH鍵認証を設定する方法
DebianへSSH接続するときに毎回ユーザーパスワードを入力している場合は、公開鍵認証へ切り替えることで安全性と利便性を高められます。本記事ではDebian 13を接続先として、Windows・Linux・macOSでEd25519鍵を作成し、公開鍵をDebianへ登録してログインするまでを順番に解説します。
接続元は普段操作するWindows・Linux・macOS、接続先はSSH接続を受け付けるDebianです。コマンド内のUSERは接続先Debianの実際のユーザー名、192.168.1.50はDebianの実際のIPアドレスへ置き換えてください。
設定の順番を誤ると、DebianへSSH接続できなくなる可能性があります。現在のSSH接続は開いたままにし、別のターミナルから鍵認証でログインできることを確認してからパスワード認証を無効化してください。
最短手順
- 接続元で
ssh-keygenを実行して秘密鍵と公開鍵を作る ssh-copy-idなどで公開鍵だけをDebianへ登録する- 秘密鍵を指定し、公開鍵認証だけでログインできるか確認する
- 必要に応じてDebian側のパスワード認証を無効化する
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_debian -C "debian-login"
ssh-copy-id -i ~/.ssh/id_ed25519_debian.pub USER@192.168.1.50
ssh -i ~/.ssh/id_ed25519_debian -o IdentitiesOnly=yes USER@192.168.1.50
SSH鍵認証の仕組み
SSH鍵認証では、接続元に置く秘密鍵と、接続先Debianへ登録する公開鍵を組み合わせて本人確認を行います。Debian側には公開鍵を登録し、秘密鍵は接続元から外へ出しません。
| ファイル | 置く場所 | 取り扱い |
|---|---|---|
id_ed25519_debian |
接続元の.sshフォルダー |
秘密鍵。パスワードと同様に保護し、他人へ渡さない |
id_ed25519_debian.pub |
接続元で作成し、内容をDebianへ登録 | 公開鍵。Debian側のauthorized_keysへ追記する |
~/.ssh/authorized_keys |
接続先Debianのログイン対象ユーザー | 接続を許可する公開鍵を1行につき1個保存する |
本記事で作る鍵は、ユーザーを認証するための鍵です。Debianの/etc/ssh/ssh_host_*にあるホスト鍵は接続先サーバーの身元確認に使うものであり、コピーや置き換えは行いません。
設定前に確認すること
公開鍵を登録するには、接続先DebianでOpenSSH Serverが動作し、最初の1回はパスワードまたはDebian本体の画面から対象ユーザーを操作できる必要があります。
Debian側でSSHサービスを確認する
sudo systemctl status ssh --no-pager
hostname -I
Active: active (running)と表示されればSSHサービスは起動しています。未導入の場合は、次のコマンドでインストールと起動を行います。
sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
接続元でSSHクライアントを確認する
ssh -V
ssh-keygen -?
OpenSSHを含むバージョン情報やヘルプが表示されれば利用できます。DebianなどのLinuxでクライアントが未導入の場合はsudo apt install openssh-clientを実行します。Windows 10/11でコマンドが見つからない場合は、「設定」のオプション機能からOpenSSHクライアントを追加してください。
現在のパスワード接続を確認する
ssh USER@192.168.1.50
初回接続では接続先のホスト鍵を信頼するか尋ねられます。表示された鍵種別がED25519の場合は、Debian本体の画面で次のコマンドを実行し、SHA256から始まる指紋が一致することを確認してからyesを入力します。
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
記事中の接続コマンドへ-p 2222のように実際のポート番号を追加してください。たとえばssh -p 2222 USER@192.168.1.50とします。
接続元でSSH鍵を作成する
今回は、現在のOpenSSHで標準の鍵種別になっているEd25519を使用します。接続先を識別しやすくし、既存の既定鍵を誤って上書きしないよう、id_ed25519_debianという専用のファイル名で作成します。
Overwrite (y/n)?と表示された場合は、原則としてnを選んでください。既存鍵を上書きすると、その鍵を登録していた別のサーバーへ接続できなくなります。
Linux・macOSで作成する
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_debian -C "debian-login"
Windows PowerShellで作成する
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\id_ed25519_debian" -C "debian-login"
Enter passphraseと表示されたら、秘密鍵を保護するパスフレーズを入力します。入力中は文字や*が表示されません。空欄でも作成できますが、ノートパソコンや持ち出す端末ではパスフレーズの設定を推奨します。
.pubが付く作成されたファイルを確認する
ls -l ~/.ssh/id_ed25519_debian*
ssh-keygen -lf ~/.ssh/id_ed25519_debian.pub
Get-ChildItem "$env:USERPROFILE\.ssh\id_ed25519_debian*"
ssh-keygen -lf "$env:USERPROFILE\.ssh\id_ed25519_debian.pub"
.pubだけ
id_ed25519_debianは秘密鍵です。メール、チャット、Webフォームへ貼り付けたり、記事のスクリーンショットへ写したりしないでください。Debianへ登録するのはid_ed25519_debian.pubの内容だけです。
公開鍵をDebianへ登録する
公開鍵の登録先は、接続先Debianでログインしたいユーザーの~/.ssh/authorized_keysです。rootではなく、通常利用する一般ユーザーへ登録します。
Linuxからssh-copy-idで登録する
接続元でssh-copy-idを利用できる場合は、公開鍵の追記と必要なファイル作成をまとめて行えます。接続先Debianのユーザーパスワードを1回入力します。
ssh-copy-id -i ~/.ssh/id_ed25519_debian.pub USER@192.168.1.50
macOSではssh-copy-idが標準で入っていない場合があります。その場合は、次のWindows PowerShellと同じ仕組みの手動登録を使用できます。
Windows PowerShellから登録する
Windowsでは通常ssh-copy-idを使用できないため、公開鍵の内容をSSH経由でDebianのauthorized_keysへ追記します。
Get-Content "$env:USERPROFILE\.ssh\id_ed25519_debian.pub" | ssh USER@192.168.1.50 "umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"
macOSまたはLinuxから手動で登録する
cat ~/.ssh/id_ed25519_debian.pub | ssh USER@192.168.1.50 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
Debian本体の画面から登録する方法
パスワードでSSH接続できない場合でも、Debian本体の画面へログインできれば手動登録できます。接続元で公開鍵を表示し、ssh-ed25519から末尾のコメントまでを1行のままコピーします。
cat ~/.ssh/id_ed25519_debian.pub
Get-Content "$env:USERPROFILE\.ssh\id_ed25519_debian.pub"
接続先Debianで対象ユーザーとして次のコマンドを実行し、nanoへ公開鍵を新しい1行として貼り付けます。nanoではCtrl+O、Enterで保存し、Ctrl+Xで終了します。
install -d -m 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys
公開鍵は見た目が長くても1つの鍵で1行です。本文途中へ改行や余分な文字が入ると認証できません。画面上で折り返して見えるだけであれば問題ありません。
公開鍵の権限と所有者を確認する
OpenSSH Serverは安全でない権限や所有者を検出すると、登録済みの公開鍵を使用しないことがあります。接続先Debianで、ログイン対象ユーザーとして次のコマンドを実行します。
chmod go-w ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
stat -c '%A %U:%G %n' ~ ~/.ssh ~/.ssh/authorized_keys
| 場所 | 目安となる権限 | 確認ポイント |
|---|---|---|
| ホームディレクトリ | 755や750など |
グループやその他ユーザーが書き込めないこと |
~/.ssh |
700 |
所有者だけが読み書き・移動できること |
authorized_keys |
600 |
所有者だけが読み書きできること |
root操作や別ユーザーとしてファイルを作成したため所有者が違う場合は、次の例で修正します。USERとホームパスを実際の値へ置き換えてください。
sudo chown -R USER:USER /home/USER/.ssh
sudo chmod 700 /home/USER/.ssh
sudo chmod 600 /home/USER/.ssh/authorized_keys
id USERで実際の主グループを確認し、USER:USERの2つ目をそのグループ名へ置き換えてください。Debianの通常のユーザー作成では、ユーザー名と同名のグループが作られることが一般的です。
SSH鍵認証で接続をテストする
公開鍵登録後は、使用する秘密鍵を明示し、パスワード認証へ自動的に切り替わらない条件でテストします。現在開いているSSH接続は閉じず、必ず別のターミナルを開いて実行してください。
Linux・macOSからテストする
ssh -i ~/.ssh/id_ed25519_debian \
-o IdentitiesOnly=yes \
-o PreferredAuthentications=publickey \
-o PasswordAuthentication=no \
USER@192.168.1.50
Windows PowerShellからテストする
ssh -i "$env:USERPROFILE\.ssh\id_ed25519_debian" -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -o PasswordAuthentication=no USER@192.168.1.50
鍵作成時にパスフレーズを設定した場合は、Enter passphrase for keyと表示されます。これは接続先Debianのユーザーパスワードではなく、接続元に保存した秘密鍵を開くためのパスフレーズです。
whoami
hostname
exit
PasswordAuthentication=noを接続元オプションとして指定した状態でログインできれば、ユーザーパスワードへ切り替わらず公開鍵認証に成功しています。
接続設定を保存する
毎回-iやユーザー名を入力しなくてもよいように、接続元の~/.ssh/configへ接続先を登録できます。Linux・macOSでは次のコマンドで開きます。
nano ~/.ssh/config
Windows PowerShellでは、次のコマンドでメモ帳を開けます。
notepad "$env:USERPROFILE\.ssh\config"
設定ファイルへ次の内容を入力します。debian-pcは接続時に使う任意の名前です。
Host debian-pc
HostName 192.168.1.50
User USER
IdentityFile ~/.ssh/id_ed25519_debian
IdentitiesOnly yes
Linux・macOSでは設定ファイルの権限を整えます。
chmod 600 ~/.ssh/config
ssh debian-pc
Windowsでも保存後はssh debian-pcだけで接続できます。ポートを変更している場合は、設定へPort 2222のように追記します。
パスフレーズ入力をssh-agentで省略する
接続元のSSHエージェントへ秘密鍵を登録すると、パスフレーズを毎回入力せずに利用できます。Linux・macOSではデスクトップ環境がエージェントを自動管理している場合があります。
ssh-add ~/.ssh/id_ed25519_debian
ssh-add -l
Windowsでは管理者としてPowerShellを開き、エージェントサービスを有効化した後、通常のPowerShellで鍵を登録します。
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add "$env:USERPROFILE\.ssh\id_ed25519_debian"
ssh-add -l
パスワード認証を安全に無効化する
公開鍵認証で新しいSSH接続に成功した後は、必要に応じてパスワード認証を無効化できます。インターネットから到達できるSSHでは、推測攻撃への対策として特に有効です。
設定が完了するまで現在のSSHセッションを閉じないでください。可能であれば、Debian本体のキーボード・画面、仮想マシンのコンソール、管理画面など、SSH以外の復旧手段も確保します。
-
現在の実適用値を確認する
USERは接続先ユーザー、192.168.1.20は接続元端末のIPアドレスへ置き換えます。Match条件がある環境では、接続元を指定した確認が重要です。接続先Debiansudo /usr/sbin/sshd -T -C user=USER,addr=192.168.1.20,host=client | grep -E '^(pubkeyauthentication|authorizedkeysfile|passwordauthentication|kbdinteractiveauthentication|permitrootlogin|authenticationmethods) ' -
追加設定ファイルを作成する
Debianでは
/etc/ssh/sshd_config.d/*.confが本体設定の先頭で読み込まれます。同じ項目は原則として最初に得た値が使われるため、早い番号のローカル設定ファイルを作成します。接続先Debiansudo nano /etc/ssh/sshd_config.d/00-local-key-auth.conf -
鍵認証を許可し、パスワード方式を停止する
次の4行を入力します。nanoではCtrl+O、Enterで保存し、Ctrl+Xで終了します。
/etc/ssh/sshd_config.d/00-local-key-auth.confPubkeyAuthentication yes PasswordAuthentication no KbdInteractiveAuthentication no PermitRootLogin no -
構文を確認して再読み込みする
sshd -tが成功した場合だけ再読み込みするよう、&&でつなぎます。正常なら構文確認部分は何も表示しません。接続先Debiansudo /usr/sbin/sshd -t && sudo systemctl reload ssh -
実適用値と新しい接続を再確認する
手順1と同じ
sshd -T -Cを再実行し、pubkeyauthentication yes、passwordauthentication no、kbdinteractiveauthentication noを確認します。その後、別のターミナルからssh debian-pcで再接続します。
sshd -T -Cで実際に適用される設定を確認するパスワード認証が停止したことを確認する
別のターミナルで公開鍵を使わない接続を試します。Permission denied (publickey)と表示されれば、パスワード方式へ進まず拒否されています。パスワード入力画面が出た場合は設定が反映されていません。
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password,keyboard-interactive USER@192.168.1.50
接続できなくなった場合の戻し方
残しておいたSSHセッションまたはDebian本体の画面から、追加ファイルを読み込まれない名前へ変更して再読み込みします。
sudo mv /etc/ssh/sshd_config.d/00-local-key-auth.conf /etc/ssh/sshd_config.d/00-local-key-auth.conf.disabled
sudo /usr/sbin/sshd -t && sudo systemctl reload ssh
.conf以外の名前へ変更すると通常は追加設定の読み込み対象外になります。接続を復旧した後、公開鍵、権限、ユーザー名、実適用値を確認してください。
鍵を追加・削除・交換する
端末ごとに別の鍵を作る
デスクトップPCとノートPCなど複数端末から接続する場合は、同じ秘密鍵をコピーするより、端末ごとに別の鍵を作成して公開鍵を追加する方が管理しやすくなります。紛失した端末の鍵だけを無効化できます。
authorized_keysでは公開鍵を1行につき1個登録します。コメントをdesktop-2026やlaptop-2026のようにしておくと、後から識別しやすくなります。
ssh-keygen -lf ~/.ssh/authorized_keys
nl -ba ~/.ssh/authorized_keys
不要な鍵を削除する
削除前にバックアップを作成し、nanoで対象の公開鍵1行だけを削除します。別の端末で有効な鍵まで消さないよう、指紋と末尾コメントを確認してください。
cp -a ~/.ssh/authorized_keys ~/.ssh/authorized_keys.backup
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
秘密鍵を紛失・漏えいした場合
- 安全な別端末またはDebian本体からログインする
authorized_keysから該当する公開鍵の行を削除する- 新しい鍵ペアを作り、新しい公開鍵を登録する
- 古い秘密鍵を利用していた自動処理や接続設定を更新する
- 認証ログに不審な接続がないか確認する
秘密鍵をメール添付や通常のクラウドフォルダーで端末間共有することは避けてください。鍵を失うとログインできなくなるため、別の管理者鍵やローカルコンソールなどの復旧手段を用意したうえで、必要なら暗号化された安全な保管先へバックアップします。
鍵認証できない場合の対処法
最初に接続元で詳細ログを表示し、同時に接続先Debianの認証ログを確認すると原因を絞り込めます。
ssh -vvv -i ~/.ssh/id_ed25519_debian -o IdentitiesOnly=yes USER@192.168.1.50
Windows PowerShellでは秘密鍵の部分を"$env:USERPROFILE\.ssh\id_ed25519_debian"へ置き換えます。
sudo journalctl -u ssh -n 80 --no-pager
| 表示・症状 | 主な原因 | 確認すること |
|---|---|---|
Permission denied (publickey) |
違うユーザー、違う秘密鍵、公開鍵未登録、権限不良 | USER、-iのパス、authorized_keys、所有者と権限を確認 |
Offering public keyの後に拒否 |
対応する公開鍵がDebian側にない、鍵種別や設定で拒否 | 接続元とDebian側でssh-keygen -lfの指紋を比較 |
Too many authentication failures |
ssh-agent内の多数の鍵を先に試している | -o IdentitiesOnly=yes -i 秘密鍵を指定 |
UNPROTECTED PRIVATE KEY FILE |
接続元Linux・macOSの秘密鍵権限が広すぎる | chmod 600 ~/.ssh/id_ed25519_debianを実行 |
| 公開鍵登録後もユーザーパスワードを求められる | 鍵認証に失敗し、パスワード方式へ切り替わっている | PasswordAuthentication=noを接続元オプションにして再テスト |
| 鍵は受理されるが直後に切断 | ログインシェル、PAM、アカウント状態など鍵以外の問題 | journalctl -u ssh、getent passwd USER、passwd -S USERを確認 |
登録した鍵の指紋が一致するか確認する
ssh-keygen -lf ~/.ssh/id_ed25519_debian.pub
ssh-keygen -lf ~/.ssh/authorized_keys
接続元の公開鍵指紋がDebian側の一覧にない場合は、別の鍵を登録したか、別ユーザーのauthorized_keysへ登録した可能性があります。
sshdの実適用値を確認する
sudo /usr/sbin/sshd -T -C user=USER,addr=192.168.1.20,host=client | grep -E '^(pubkeyauthentication|authorizedkeysfile|authenticationmethods|strictmodes|allowusers|allowgroups|denyusers|denygroups) '
pubkeyauthentication noなら公開鍵認証が無効です。authorizedkeysfileが独自の場所を示している場合は、そのファイルへ登録する必要があります。AuthenticationMethods publickey,passwordなどが設定されている場合は、鍵認証に加えて別方式も必要です。
設定されている場所を検索する
sudo grep -RniE '^[[:space:]]*(PubkeyAuthentication|AuthorizedKeysFile|AuthenticationMethods|StrictModes|AllowUsers|AllowGroups|DenyUsers|DenyGroups|Match)[[:space:]]' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
OpenSSHは同じ項目について原則として最初に得た値を使い、Match条件でも結果が変わります。ファイルを編集した後は、sshd -tで構文を確認し、sshd -T -Cで対象ユーザーと接続元に対する実適用値を確認してください。
よくある質問
SSH鍵認証ならパスワードは完全に不要ですか?
DebianのユーザーパスワードをSSHへ送らずにログインできます。ただし、秘密鍵へパスフレーズを設定した場合は接続元で入力します。また、ログイン後にsudoを実行するときは、通常Debianのユーザーパスワードが必要です。
Ed25519ではなくRSA鍵を使えますか?
利用できます。古い機器や互換性要件がある場合はssh-keygen -t rsa -b 3072でRSA鍵を作成できます。ただし、Debian 13/12と現在のOpenSSHクライアント同士であれば、通常はEd25519を使用できます。
公開鍵を登録したのにパスワードを聞かれます
鍵のパスフレーズか、Debianユーザーのパスワードかを表示文で確認してください。Enter passphrase for keyなら秘密鍵のパスフレーズです。USER@IP's passwordなら鍵認証が失敗してパスワード方式へ切り替わっています。
秘密鍵のパスフレーズを忘れた場合はどうしますか?
忘れたパスフレーズを復元することはできません。別の有効な鍵、パスワード認証、またはDebian本体の画面からログインし、新しい鍵を作成して公開鍵を登録し直します。
rootユーザーへ直接鍵認証してもよいですか?
通常は一般ユーザーでログインして必要な操作だけsudoを使う方が安全です。本記事ではPermitRootLogin noとして、rootへの直接SSHログインを無効化します。
GitHub用のSSH鍵をそのまま使えますか?
技術的には利用できる場合がありますが、用途ごと・端末ごとに鍵を分ける方が、漏えいや端末紛失時の無効化範囲を限定できます。Debianログイン専用の鍵を作り、~/.ssh/configで使い分ける方法が分かりやすいです。
参考資料
- Debian Manpages:ssh-keygen(1)
- Debian Manpages:ssh(1)
- Debian Manpages:ssh-copy-id(1)
- Debian Manpages:sshd_config(5)
- Microsoft Learn:Key-Based Authentication in OpenSSH for Windows
まとめ
DebianのSSH鍵認証は、接続元でEd25519鍵を作成し、.pubの公開鍵だけを接続先の~/.ssh/authorized_keysへ登録して設定します。秘密鍵は接続元で厳重に保管し、Debianへ送らないことが重要です。
登録後は秘密鍵とIdentitiesOnly=yesを明示して鍵認証をテストし、成功を確認してからパスワード認証を無効化します。設定変更時は、現在の接続を残したままsshd -t、sshd -T -C、別ターミナルからの再接続という順番で確認すると、締め出しを防ぎやすくなります。
