0. やりたかったこと
こんにちは。自宅にRTX 4070を積んだそこそこ強いPCがあるのですが、外からこのPCのリソース(特にGPU)を使いたいとずっと思っていました。
ただ、外部(インターネット)にPCを公開するのはセキュリティが怖い。
そこで、自分の中で以下の3つのルールを決めて、外部から安全にSSH接続できる環境を構築してみました。
- パスワード認証は絶対に許可しない(ブルートフォース攻撃対策)。
- 認証は公開鍵(ed25519)のみを許可する。
- PCを再起動しても、SSHサーバーは自動で立ち上がってほしい。
この記事は、私が実際に試行錯誤して「あ、これで動いた」となった手順をまとめた個人的なメモです。あくまで一例として、同じことをしたい方の参考になれば幸いです。
私の作業環境(仮)
-
サーバーPC (自宅): Windows 11 / ユーザー名
myuser(←仮のユーザー名) -
サーバーPCのIP:
192.168.1.100(ipconfigで確認した 仮のIP) -
ルーター:
192.168.1.1(ipconfigのデフォルトゲートウェイ)
ステップ1: 【接続元PC】まず、合鍵(ed25519)を作る
最初に、接続「する」側のPC(私はMacBookを使いました)で、SSH用の「鍵のペア」を作りました。
-
Macのターミナルで以下のコマンドを実行。
ssh-keygen -t ed25519-
ed25519が最近の主流っぽいので、これを選びました。 - 保存場所やパスフレーズは、全部
Enterで(パスフレーズなしに)進めました。
-
-
これで
id_ed25519(秘密鍵・門外不出)とid_ed25519.pub(公開鍵・サーバーに置く用)ができました。 -
サーバーに設置するために、公開鍵(.pub)の中身をクリップボードにコピーしておきます。
# 表示された "ssh-ed25519 AAAA..." の文字列をまるごとコピー cat ~/.ssh/id_ed25519.pub
ステップ2: 【サーバーPC】SSHサーバー導入と「自動起動」の設定
次に、自宅のWindows機での作業です。
-
PowerShellを「管理者として」実行しました。
-
Windowsには標準でOpenSSHサーバー機能があるんですね。便利。
以下のコマンドで、インストール $\to$ 起動 $\to$ 自動起動設定 を一気に行いました。# 1. OpenSSHサーバーをインストール Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # 2. とりあえずサービスを起動 Start-Service sshd # 3. ★これがやりたかったこと★ PC起動時に自動でSSHDが動くようにする Set-Service -Name sshd -StartupType 'Automatic'-
Set-Service -StartupType 'Automatic'が、PCを再起動してもSSHサーバーが動いてくれるようにするおまじないです。これで安心。
-
ステップ3: 【サーバーPC】公開鍵の設置(Windows特有のハマりポイント)
ここが、私が一番ハマったポイントでした。Linuxと違って、Windowsはファイルの「アクセス許可」に一手間必要でした。
-
管理者PowerShellで、
authorized_keysファイルを作ります。# ユーザー "myuser" のホームディレクトリに移動 (ご自身のユーザー名に合わせてください) # $HOME は自動的に C:\Users\myuser のようなパスに展開されます cd $HOME # .ssh フォルダ作成 (すでにあればエラーが出ますが無視してOK) mkdir .ssh # .ssh フォルダに移動 cd .ssh # authorized_keys ファイルを空で作成 New-Item authorized_keys -
メモ帳で今作ったファイルを開き、ステップ1でコピーした公開鍵の文字列(
ssh-ed25519 AAAA...)を貼り付けて、上書き保存します。notepad $HOME\.ssh\authorized_keys -
【最重要】 アクセス許可の絞り込み
このauthorized_keysは、「自分とシステム以外は触れない」状態じゃないと、SSHサーバーが「こんな緩い設定の鍵は危なくて使えない!」と判断して、鍵を読んでくれないそうです。管理者PowerShellで以下のコマンドを実行し、アクセス許可を自分(
myuser)とSYSTEMだけに絞りました。$keyFile = $HOME + "\.ssh\authorized_keys" # 権限の継承をまず無効にする icacls.exe $keyFile /inheritance:d # 自分(myuser)にフルコントロールを"与える" icacls.exe $keyFile /grant:r "$($env:USERNAME):(F)" # SYSTEMアカウントにもフルコントロールを"与える" icacls.exe $keyFile /grant:r "SYSTEM:(F)"
ステップ4: 【サーバーPC】パスワード認証の無効化(セキュリティのキモ)
これが今回の一番の目的です。パスワードでのログインを完全に禁止します。
-
sshd_configというSSHサーバーの「大本の設ファイル」をメモ帳で開きます。# ProgramData は隠しフォルダなのでパスを直打ち notepad "C:\ProgramData\ssh\sshd_config" -
開いたファイルで、以下の2箇所を検索して書き換えました。
-
#PubkeyAuthentication yes$\to$PubkeyAuthentication yes(#を消して、公開鍵認証を明示的に有効化) -
#PasswordAuthentication yes$\to$PasswordAuthentication no(#を消して、パスワード認証を無効化)
-
-
設定を変更したので、SSHサービスを再起動して設定を読み込ませます。(必須)
Restart-Service sshd
ステップ5: 【サーバーPC】ファイアウォールの穴あけ
PC本体のファイアウォールがSSH(ポート22)を止めてしまわないよう、通信を許可しました。
- 管理者PowerShellで、以下のコマンドを実行。
New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
ステップ6: 【ルーター】ポートフォワーディング(家の玄関)
これでPC側の準備はOK。最後に、家の「大門」であるルーターの設定です。
-
ブラウザで
http://192.168.1.1を開き、ルーターの管理画面にログイン。 -
「ポートフォワーディング」(BUFFALOだったので「ポート変換」でした)の項目を探しました。
-
世界中のボットがスキャンしてくる
22番ポートをそのまま使うのは嫌だったので、外部ポートは適当な数字(50022)にしました。-
プロトコル:
TCP -
外部ポート (WAN側):
50022(← 自分で決めた番号) -
内部IPアドレス:
192.168.1.100(サーバーPCの仮のIP) -
内部ポート (LAN側):
22(← SSHサーバーが待ってるポート)
「外部から
50022宛に来た通信を、192.168.1.100の22番に繋いでね」という意味ですね。なるほど。 -
プロトコル:
ステップ7: 【接続元PC】接続テスト!
長かったですが、これで全部の設定が終わったはず。
-
まず、サーバーPC(自宅PC)のグローバルIPを調べます。
# サーバーPCのPowerShellで実行 curl ifconfig.me # 表示された本物のIPアドレス(例: 203.0.113.10 など)を控える(注意) ここで表示されるIPは本物なので、絶対に記事などには書かないように!
-
いよいよ、接続元PC(MacBook)から接続します。
-
-iで「使う秘密鍵はこれだよ」 -
-pで「ルーターで設定したポート番号はこれだよ」 - と指定するのがミソでした。
# ssh -i [秘密鍵のパス] [ユーザー名]@[控えたグローバルIP] -p [外部ポート番号] ssh -i ~/.ssh/id_ed25519 myuser@[控えたグローバルIP] -p 50022 -
結果:
パスワードを聞かれることなく、PS C:\Users\myuser> という見慣れたプロンプトがMacBookのターミナルに表示されれば、成功です!
7. おわりに
お疲れ様でした。
paramiko(Python)から接続する際も、このid_ed25519鍵を指定し、ポート番号に50022を指定、password引数を渡さないようにすることで、無事接続できました。
WindowsのSSHサーバー設定は「アクセス許可」周りが少し独特でしたが、一度設定してしまえば安定して動いています。Set-Service で自動起動も設定したので、PCの電源さえ入っていればいつでも外から触れるようになり、大満足です。
あくまで私が行った一例ですが、誰かの参考になれば嬉しいです。