よしたかの日常

日常の事やイラスト投稿、開発している時の備忘録を書いています。

Raspberry Pi への SSH 鍵認証 — Mac からパスワードなし接続

おはこんばんにちは!

自宅 LAN 上の Raspberry Pi に、Mac のターミナルから SSH する機会が増えてきました。
毎回 ssh pi@192.168.11.10 と IP を打ち、パスワードを入力するのは地味に面倒になってきました。

そこで、公開鍵認証(鍵認証) を入れておくと、

  • 接続コマンドが ssh raspi.local の一行になる
  • 2 回目以降はパスフレーズも Keychain 経由で省略できる(macOS)
  • パスワードログインよりブルートフォースに強い

という状態になり、Raspberry Pi への接続が楽になります。

やること自体は定番手順ですが、Mac 側の ~/.ssh/config と Pi 側の権限設定 をセットで整理しておくと、あとから Tailscale 越しに接続するときもそのまま流用できます。

この記事では、おおまかに次の流れで設定します。

  1. Mac で鍵ペアを作る
  2. 公開鍵(.pub)を Pi に送る
  3. Pi 側で authorized_keys を置く
  4. Mac の ~/.ssh/config にホスト定義を書く
  5. 接続テスト

前提

項目 この記事での例
接続元 macOS
接続先 Raspberry Pi(LAN 内)
Pi の IP 192.168.11.10
Pi のユーザー pi(環境に合わせて読み替え)
鍵の保存先 ~/.ssh/raspi_ed25519
鍵の種類 Ed25519

IP アドレスとユーザー名は環境ごとに違います。
コマンド中の値は自分の環境に置き換えてください。


1. 鍵ペアの作成(Mac)

~/.ssh に Raspberry Pi 専用の鍵を作ります。
種類は Ed25519 にします。
RSA 4096 より鍵が短く、生成・認証も速く、現行の OpenSSH ではこちらが定番。

cd ~/.ssh/
ssh-keygen -t ed25519 -C "pi@192.168.11.10" -f ~/.ssh/raspi_ed25519
オプション 意味
-t ed25519 Ed25519(楕円曲線。SSH 向けの現行標準)
-C "..." コメント(鍵のラベル。後から ssh-add -l で見分ける用)
-f ~/.ssh/raspi_ed25519 秘密鍵 / 公開鍵のファイル名

パスフレーズを聞かれたら、空でも動きますが、設定しておくほうが安全 です。
macOS なら後述の UseKeychain yes で Keychain に載せられます。

生成されるファイル:

~/.ssh/raspi_ed25519       … 秘密鍵(絶対に Pi へ送らない)
~/.ssh/raspi_ed25519.pub   … 公開鍵(Pi へ送る)

2. 公開鍵を Pi へ転送(Mac → Pi)

まだ鍵認証が効いていない段階なので、パスワードログインで転送 します。

scp ~/.ssh/raspi_ed25519.pub pi@192.168.11.10:~/authorized_keys

ホーム直下に authorized_keys という名前で置いておき、次のステップで .ssh へ移します。
(最初から ~/.ssh/ へ送っても構いませんが、Pi 側に .ssh が無い場合は mkdir が必要です。)

代替: ssh-copy-id

これからやる、同じことをまとめてやるコマンドもあります。

ssh-copy-id -i ~/.ssh/raspi_ed25519.pub pi@192.168.11.10

手動で権限を触りたい場合は、scp + 次セクションの手順のほうが分かりやすいです。


3. Raspberry Pi 側の設定

Pi に SSH ログインした状態で、公開鍵を正しい場所に置き、権限を揃えます
SSH は権限が 1 段ずれているだけで鍵認証を拒否するので、ここがハマりどころです。

mkdir -p ~/.ssh
chmod 700 ~/.ssh
mv ~/authorized_keys ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
パス 推奨権限 理由
~/.ssh/ 700 所有者以外読めない
~/.ssh/authorized_keys 600 公開鍵一覧を他人に読ませない

authorized_keys の中身は、Mac の raspi_ed25519.pub を 1 行そのまま貼った状態になっていれば OK です。


4. Mac の “~/.ssh/config” を編集

毎回 IP と -i を指定しなくて済むよう、ホストのエイリアスを定義します。

vim ~/.ssh/config
Host raspi.local
        HostName 192.168.11.10
        User pi
        IdentityFile ~/.ssh/raspi_ed25519
        PreferredAuthentications publickey
        UseKeychain yes
        AddKeysToAgent yes
設定 意味
Host raspi.local ssh raspi.local のときに使う設定ブロック(名前は任意)
HostName 実際の接続先 IP / ホスト名
User ログインユーザー
IdentityFile 使う秘密鍵
PreferredAuthentications publickey 鍵認証を優先(パスワード入力に落ちにくくする)
UseKeychain yes パスフレーズを macOS Keychain に保存
AddKeysToAgent yes 接続時に ssh-agent へ鍵を載せる

Host raspi.local は mDNS の raspi.local と名前を揃えているだけで、HostName が IP なら IP で繋がります
Tailscale 越しに繋ぐときは、別ブロック(例: Host raspi-tailscale)を足すと整理しやすいです。

config ファイル自体も権限を締めておきます。

chmod 600 ~/.ssh/config

5. 接続テスト

Mac から:

ssh raspi.local

初回は鍵のパスフレーズ入力を求められることがあります。
2 回目以降は ssh raspi.local だけで入れる状態になっていれば成功です。

動作確認のチェックリスト:

  1. パスワードを聞かれずにログインできる
  2. ssh -v raspi.local のログに Offering public keyAuthentication succeeded が出る
  3. 意図したユーザー(pi など)のシェルに入る

うまく繋がらないとき

症状 よくある原因
Permission denied (publickey) Pi 側の authorized_keys 権限、User の typo、別ユーザーに鍵を置いている
毎回パスフレーズを聞かれる UseKeychain / AddKeysToAgent 未設定、または Keychain 未登録
Connection refused Pi の SSH 無効、IP 変更、LAN 外から IP 直打ち
古い鍵が使われる IdentityFile の指定ミス、ssh-agent に別鍵だけ載っている

Pi 側の SSH ログを見ると原因が分かることが多いです。

sudo journalctl -u ssh -n 50
# または古い OS
sudo tail -n 50 /var/log/auth.log

Mac 側では verbose モードが手っ取り早いです。

ssh -v raspi.local

余裕があれば — パスワードログインを切る

鍵認証が安定したら、Pi 側でパスワード SSH を無効にする選択肢があります。
鍵を失うと入れなくなる ので、別経路(物理キーボード + モニタ、または別ユーザー鍵)を確保してからにしてください。

/etc/ssh/sshd_config の例:

PasswordAuthentication no
PubkeyAuthentication yes

変更後:

sudo systemctl restart ssh

このあと

鍵認証が通れば、同じ Pi 向けメモ(OpenMediaVault、Tailscale、Nextcloud など)の作業も、毎回パスワードなしで SSH → 設定 のリズムで回せます。
Tailscale を足したあとは HostName を Tailscale のホスト名にした別エントリを config に書く、という拡張だけで済みます。


まとめ

  • Macssh-keygen -t ed25519 で専用鍵、~/.ssh/configHost エイリアス
  • Pi~/.ssh/authorized_keys に公開鍵、ディレクトリ 700・ファイル 600
  • 接続ssh raspi.local の一行。2 回目以降は Keychain + agent で楽になる
  • ハマりどころ — 権限と User / IdentityFile の不一致

定番手順ですが、config と権限をセットでメモしておく と、数ヶ月後に Pi を増やしたときも同じ型で再現できます。


参考リンク