MacBookから自宅サーバーへSSH接続する!公開鍵認証の設定から~/.ssh/config活用まで完全ガイド

未分類

自宅にサーバーを構築すると、設定変更やファイル編集のたびにサーバーの前に座る必要があるのでしょうか?
答えは「No」です。SSH(Secure Shell)を使えば、MacBookのターミナルから自宅LAN内のサーバーにセキュアに接続し、まるでそのサーバーを直接操作しているように作業できます。
本記事では、MacBookからNUCBox G3 Plus(Linuxサーバー)へSSH接続するための設定手順を、公開鍵認証の仕組みから~/.ssh/configによる快適接続設定までゼロから解説します。
Raspberry Piを使っている方も、同じ手順でSSH接続できます。

なぜこの機能を作ったのか?

自宅サーバーを構築していると、設定ファイルを修正したり、ログを確認したり、プログラムを更新したりと、サーバーを操作する機会が頻繁にあります。
毎回サーバーにモニターとキーボードを接続して操作するのは非常に手間がかかります。
SSHを使えば、MacBookのターミナルからリモートでサーバーを操作できるため、ソファに座ったまま、またはリビングのテーブルからでもサーバー管理ができるようになります。
また、VS Codeの「Remote SSH」拡張機能と組み合わせれば、サーバー上のファイルをMacのエディターで直接編集することも可能です。

サーバーの前まで行かなくても、MacBookのターミナルからサーバーをサクサク操作したい!

実現したいこと

  • MacBookのターミナルから自宅LAN内のサーバーにSSH接続できる
  • パスワード入力なしで、SSHキーだけで安全にログインできる(公開鍵認証)
  • ssh nucboxのような短いコマンドだけで接続できる(~/.ssh/config活用)
  • VS Code Remote SSH でサーバー上のファイルをMacで直接編集できる
  • 複数のサーバー(NUCBox、Raspberry Pi等)への接続をまとめて管理できる

この記事でわかること

  • SSH公開鍵認証の仕組み(秘密鍵・公開鍵・authorized_keysの関係)
  • macOS標準のOpenSSHでSSH鍵ペアを生成する方法(ed25519)
  • 公開鍵をサーバーに登録する方法(ssh-copy-id コマンド)
  • ~/.ssh/config を使って接続を便利にする方法
  • サーバー側のSSH設定(sshd_config)を確認・強化する方法
  • macOSのキーチェーン連携で毎回のパスフレーズ入力を省略する方法

必要な準備と用意するもの

ハードウェア
  • MacBook(本記事はMacBook Air M2で確認。Intel Macも同じ手順)
  • 自宅サーバー(本記事はNUCBox G3 Plus、IP: 192.168.68.89)
    • Raspberry Piでも同じ手順で設定できます
  • MacBookとサーバーが同じLAN内に接続されていること
ソフトウェア/サービス
  • macOS(OpenSSHクライアントが標準搭載、追加インストール不要)
  • Linux(Ubuntu / Debian系)サーバー
    • openssh-server(SSH接続を受け付けるサーバー側ソフト)
  • (オプション)VS Code + Remote SSH 拡張機能

完成イメージ

設定完了後は、MacBookのターミナルで以下のように入力するだけでサーバーに接続できます。


# ~/.ssh/config に設定済みなら、たったこれだけでサーバーに接続できる
$ ssh nucbox

# 接続後はサーバーのターミナルが使える
user@nucbox-g3-plus:~$ hostname
nucbox-g3-plus
user@nucbox-g3-plus:~$

また、VS Code の Remote SSH 拡張機能を使えば、サーバー上のファイルをMacのエディターで直接開いて編集することもできます。

システムの仕組み

SSH 公開鍵認証とは?

SSH接続には「パスワード認証」と「公開鍵認証」の2種類があります。本記事では、より安全な公開鍵認証を使います。

公開鍵認証の仕組み
① Mac側で「秘密鍵(自分だけが持つ)」と「公開鍵(サーバーに渡す)」のペアを生成する
② 公開鍵をサーバーの ~/.ssh/authorized_keys に登録する
③ 接続時に、サーバーが公開鍵を使って「数学的な問題」を出す
④ MacBook側が秘密鍵を使って正しく回答できれば認証成功
⑤ 秘密鍵はMac外に出ないため、パスワードを使わず安全にログインできる


[MacBook]                        [サーバー (NUCBox)]
  |                                      |
  |-- 接続リクエスト ------------------>|
  |                                      |-- authorized_keys から公開鍵を取得
  |                                      |-- 乱数をMacの公開鍵で暗号化
  |<-- 暗号化された「問題」 -----------|
  |-- 秘密鍵で復号して回答 ----------->|
  |                                      |-- 回答を検証 → 一致すれば認証OK
  |<-- 接続確立 ----------------------|

ed25519 vs RSA — どのアルゴリズムを使うか

ed25519(推奨)
現在推奨されている最新のアルゴリズムです。RSAに比べて鍵が短く、処理が速く、セキュリティも同等以上です。新規に鍵を作成するなら -t ed25519 を使いましょう。

RSAについて
古くから使われているアルゴリズムで、現在も広く使われています。既にRSA鍵でサーバーに接続済みであれば、そのまま使い続けても問題ありません。新規環境はed25519を推奨。

実装のポイント

パスワード認証を無効化する
公開鍵認証が設定できたら、サーバー側の sshd_configPasswordAuthentication no にしてパスワード認証を無効化しましょう。ブルートフォース攻撃への耐性が大幅に上がります。

パスフレーズ付きの鍵を作成する
SSH鍵にパスフレーズを設定しておくと、仮にMacが盗まれても秘密鍵を悪用されにくくなります。macOSのキーチェーン連携(UseKeychain yes)と組み合わせれば、最初の一回だけパスフレーズを入力すればあとは自動で使えます。

注意:パスワード認証を無効にするタイミング
PasswordAuthentication no を設定する前に、必ずSSH鍵による接続が成功することを確認してください。順番を間違えると、サーバーにログインできなくなります(物理アクセスが必要になります)。

事前準備

サーバー側のSSHサーバーが動いているか確認する

サーバーに物理接続またはパスワード認証が有効な状態でSSH接続して、SSH サーバーの状態を確認します。


# openssh-server がインストールされているか確認
$ dpkg -l openssh-server

# SSH サービスが動作しているか確認
$ sudo systemctl status ssh

# ● ssh.service - OpenBSD Secure Shell server
#    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; ...)
#    Active: active (running) ...  ← "active (running)" であればOK

インストールされていない場合は以下でインストールします。


$ sudo apt update
$ sudo apt install openssh-server
$ sudo systemctl enable ssh
$ sudo systemctl start ssh

サーバーのIPアドレスとユーザー名を確認する


# サーバーのIPアドレスを確認
$ ip addr show | grep "inet " | grep -v 127.0.0.1
    inet 192.168.68.89/24 brd 192.168.68.255 scope global eth0

# ログイン中のユーザー名を確認
$ whoami
user

サーバーIPを固定する
Decoルーターの「アドレス予約」機能(MACアドレスベースのIP固定)を使って、サーバーのIPアドレスを固定しておきましょう。IPが変わるたびにSSH設定を修正する手間が省けます。本記事の環境では 192.168.68.89 を固定IPとして使用しています。

実装方法

① MacBook側でSSH鍵ペアを生成する

MacBookのターミナル(ターミナル.app または iTerm2)を開いて、SSH鍵ペアを生成します。


# ed25519 形式で SSH 鍵ペアを生成する
$ ssh-keygen -t ed25519 -C "mac-to-homeserver"

# 保存先を聞かれる(デフォルトのままEnterでOK)
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/username/.ssh/id_ed25519): [Enter]

# パスフレーズを設定する(推奨。空でもOKだが、設定した方が安全)
Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [同じパスフレーズを再入力]

# 鍵が生成された
Your identification has been saved in /Users/username/.ssh/id_ed25519
Your public key has been saved in /Users/username/.ssh/id_ed25519.pub

生成された鍵ファイルを確認します。


$ ls -la ~/.ssh/
-rw-------   1 username  staff   411  id_ed25519       ← 秘密鍵(絶対に外部に出さない)
-rw-r--r--   1 username  staff   102  id_ed25519.pub   ← 公開鍵(サーバーに登録する)

秘密鍵(id_ed25519)は絶対に他人に渡さない
秘密鍵はパスポートのようなものです。メールやチャットで送ったり、クラウドストレージにアップロードしたりしてはいけません。公開鍵(.pubファイル)はサーバーに渡しても安全です。

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

ssh-copy-id コマンドを使うと、公開鍵をサーバーに自動で登録できます。
このとき、サーバーのパスワード認証が有効になっている必要があります。


# ssh-copy-id でサーバーに公開鍵を登録する
# 書式: ssh-copy-id -i ~/.ssh/id_ed25519.pub <ユーザー名>@<サーバーIP>
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.68.89

# サーバーのパスワードを入力する(この一回だけ)
user@192.168.68.89's password: [サーバーのパスワード]

# 登録成功のメッセージ
Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'user@192.168.68.89'"

ssh-copy-id が使えない場合(手動登録)
サーバーに直接アクセスできる場合は、手動でも登録できます。
Mac側で cat ~/.ssh/id_ed25519.pub の出力内容をコピーして、サーバー側の ~/.ssh/authorized_keys にテキストとして貼り付けます(1行1鍵)。ファイルのパーミッションは chmod 600 ~/.ssh/authorized_keys にしてください。

③ まずSSH接続を確認する

鍵の登録が完了したら、接続を確認します。


# フルコマンドでSSH接続テスト
$ ssh user@192.168.68.89

# パスフレーズを設定した場合は入力が求められる(Macのキーチェーンに保存可能)
Enter passphrase for key '/Users/username/.ssh/id_ed25519': [パスフレーズを入力]

# 接続成功!サーバーのターミナルが使える
user@nucbox-g3-plus:~$

接続成功の確認ポイント
プロンプトが user@サーバー名:~$ に変わったら接続成功です。exit または Ctrl+D でサーバーから切断できます。

④ サーバー側のSSH設定を強化する(sshd_config)

SSH鍵での接続が確認できたら、サーバー側でパスワード認証を無効化してセキュリティを強化します。


$ sudo nano /etc/ssh/sshd_config

以下の項目を確認・設定します(# がある行はコメントアウトされているので外すか、新しく追記します)。


# rootでのSSHログインを禁止する(重要)
PermitRootLogin no

# 公開鍵認証を有効にする
PubkeyAuthentication yes

# パスワード認証を無効にする(鍵の登録が完了してから設定すること!)
PasswordAuthentication no

# キーボードインタラクティブ認証も無効にする
KbdInteractiveAuthentication no

設定を保存したら、SSHサービスを再起動して設定を反映させます。


$ sudo systemctl restart ssh

# 現在のSSHセッションを切断せずに、別のターミナルから接続確認してから設定を確定させる

重要:sshd 再起動後は別ウィンドウで接続確認する
設定変更後は、現在のSSHセッションを閉じずに、MacBookの別のターミナルウィンドウを開いてSSH接続できることを確認してください。接続できなかった場合は、現在のセッションから設定を修正できます。

⑤ ~/.ssh/config を設定して接続を快適にする

毎回 ssh user@192.168.68.89 と入力するのは手間がかかります。~/.ssh/config ファイルを作成すると、ssh nucbox だけで接続できるようになります。


$ nano ~/.ssh/config

# NUCBox G3 Plus(メインサーバー)
Host nucbox
    HostName 192.168.68.89
    User user
    IdentityFile ~/.ssh/id_ed25519
    AddKeysToAgent yes
    UseKeychain yes

# Raspberry Pi 5(必要なら追加)
Host raspi5
    HostName 192.168.68.109
    User pi
    IdentityFile ~/.ssh/id_ed25519
    AddKeysToAgent yes
    UseKeychain yes

# 共通設定(全Hostに適用)
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

各設定項目の意味は以下のとおりです。

設定項目意味
Host接続名のエイリアス(ssh nucbox で使う名前)
HostName実際のIPアドレスまたはホスト名
UserSSHログインユーザー名
IdentityFile使用する秘密鍵のパス
AddKeysToAgent yesssh-agentに鍵を追加(パスフレーズの再入力を省略)
UseKeychain yesmacOSのキーチェーンにパスフレーズを保存(Mac専用)
ServerAliveInterval切断防止のためのkeep-alive送信間隔(秒)

設定ファイルのパーミッションを適切に設定します。


$ chmod 600 ~/.ssh/config

⑥ macOSのキーチェーンにパスフレーズを登録する

パスフレーズを設定した場合、毎回入力するのは手間がかかります。macOSのキーチェーンに登録すると、初回のみの入力で済みます。


# ssh-agentに秘密鍵を追加してmacOSのキーチェーンに保存する
$ ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# パスフレーズを1回だけ入力する
Enter passphrase for /Users/username/.ssh/id_ed25519: [パスフレーズ]
Identity added: /Users/username/.ssh/id_ed25519 (mac-to-homeserver)

macOS Ventura以降について
macOS Ventura(13.0)以降では ssh-add -K は非推奨になり、ssh-add --apple-use-keychain を使います。どちらも同じ機能です。

動作確認

SSH接続の最終確認


# エイリアスで接続できるか確認
$ ssh nucbox

# 接続成功
user@nucbox-g3-plus:~$

# ホスト名・ユーザー名・IPを確認
user@nucbox-g3-plus:~$ hostname
nucbox-g3-plus
user@nucbox-g3-plus:~$ whoami
user
user@nucbox-g3-plus:~$ ip addr show | grep "inet " | grep -v 127
    inet 192.168.68.89/24 ...

# 切断
user@nucbox-g3-plus:~$ exit
logout
Connection to 192.168.68.89 closed.

パスワード認証が無効になっているか確認する


# -o で認証方法を鍵のみに限定して接続テスト(パスワード認証が無効になっているか確認)
$ ssh -o PreferredAuthentications=publickey nucbox
user@nucbox-g3-plus:~$   ← 成功すればOK

# パスワードのみで試みると拒否されることを確認
$ ssh -o PreferredAuthentications=password user@192.168.68.89
user@192.168.68.89: Permission denied (publickey).  ← パスワード認証が無効になっている

(オプション)VS Code Remote SSH での接続

VS Code に「Remote - SSH」拡張機能をインストールすると、~/.ssh/config の設定を使ってサーバー上のファイルをGUIで編集できます。

  • VS Code を開き、拡張機能(Ctrl+Shift+X)で「Remote - SSH」を検索してインストール
  • 左下の「><」アイコン → 「Connect to Host...」→ nucbox を選択
  • 新しいウィンドウが開き、サーバー上のファイルをMacのVS Codeで直接編集できる

Remote SSH × VS Code は最強の開発環境
サーバー上のPythonスクリプトやNginx設定ファイルを、VS CodeのGUI上で快適に編集できます。ターミナルも統合されているため、編集→実行→確認のサイクルが格段に楽になります。

トラブルシューティング

Q: Permission denied (publickey) と出て接続できない
A: 以下を確認してください。
① サーバーの ~/.ssh/authorized_keys に公開鍵が正しく登録されているか(cat ~/.ssh/authorized_keys
authorized_keys のパーミッションが 600 になっているか(chmod 600 ~/.ssh/authorized_keys
~/.ssh/ ディレクトリのパーミッションが 700 になっているか(chmod 700 ~/.ssh
~/.ssh/configIdentityFile が正しい秘密鍵を指しているか

Q: ssh: connect to host 192.168.68.89 port 22: Connection refused
A: サーバー側でSSHサービスが起動していない可能性があります。サーバーに物理接続して sudo systemctl start ssh を実行してください。またはUFWなどのファイアウォールでポート22がブロックされていないか確認してください。

Q: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! と出た
A: サーバーを再インストールするなどして、サーバーのSSHホスト鍵が変わった場合に表示されます。Mac側の ~/.ssh/known_hosts から対象IPの行を削除してから再接続してください。
$ ssh-keygen -R 192.168.68.89

まとめ

本記事では、MacBookから自宅LAN内のサーバーへSSH接続する方法を解説しました。

  • macOS には OpenSSH クライアントが標準搭載されており、追加インストール不要
  • ssh-keygen -t ed25519 で安全なSSH鍵ペアを生成できる
  • ssh-copy-id コマンドで公開鍵を簡単にサーバーへ登録できる
  • サーバー側で PasswordAuthentication no にすることでセキュリティを強化できる
  • ~/.ssh/config を使えば ssh nucbox だけで接続できて非常に快適
  • macOSのキーチェーン連携でパスフレーズの毎回入力を省略できる
  • VS Code Remote SSH を使えばGUIでサーバーのファイルを編集できる

これでサーバーの前に座らずとも、ソファや自室のMacBookからサーバーを操作できるようになりました。
次のステップとして、外出先からもSSH接続できるように、ポート転送や外部からのアクセス設定を追加すれば、どこからでも自宅サーバーを管理できる環境が整います。

タイトルとURLをコピーしました