0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自宅Windows機(RTX 4070)に外部からSSH接続できるようにした備忘録(ed25519 + パスワード無効化)

Posted at

0. やりたかったこと

こんにちは。自宅にRTX 4070を積んだそこそこ強いPCがあるのですが、外からこのPCのリソース(特にGPU)を使いたいとずっと思っていました。

ただ、外部(インターネット)にPCを公開するのはセキュリティが怖い。

そこで、自分の中で以下の3つのルールを決めて、外部から安全にSSH接続できる環境を構築してみました。

  1. パスワード認証は絶対に許可しない(ブルートフォース攻撃対策)。
  2. 認証は公開鍵(ed25519)のみを許可する。
  3. PCを再起動しても、SSHサーバーは自動で立ち上がってほしい。

この記事は、私が実際に試行錯誤して「あ、これで動いた」となった手順をまとめた個人的なメモです。あくまで一例として、同じことをしたい方の参考になれば幸いです。

私の作業環境(仮)

  • サーバーPC (自宅): Windows 11 / ユーザー名 myuser (←仮のユーザー名)
  • サーバーPCのIP: 192.168.1.100ipconfig で確認した 仮のIP
  • ルーター: 192.168.1.1ipconfig のデフォルトゲートウェイ)

ステップ1: 【接続元PC】まず、合鍵(ed25519)を作る

最初に、接続「する」側のPC(私はMacBookを使いました)で、SSH用の「鍵のペア」を作りました。

  1. Macのターミナルで以下のコマンドを実行。

    ssh-keygen -t ed25519
    
    • ed25519が最近の主流っぽいので、これを選びました。
    • 保存場所やパスフレーズは、全部Enterで(パスフレーズなしに)進めました。
  2. これで id_ed25519秘密鍵・門外不出)と id_ed25519.pub公開鍵・サーバーに置く用)ができました。

  3. サーバーに設置するために、公開鍵(.pub)の中身をクリップボードにコピーしておきます。

    # 表示された "ssh-ed25519 AAAA..." の文字列をまるごとコピー
    cat ~/.ssh/id_ed25519.pub
    

ステップ2: 【サーバーPC】SSHサーバー導入と「自動起動」の設定

次に、自宅のWindows機での作業です。

  1. PowerShellを「管理者として」実行しました。

  2. 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はファイルの「アクセス許可」に一手間必要でした。

  1. 管理者PowerShellで、authorized_keys ファイルを作ります。

    # ユーザー "myuser" のホームディレクトリに移動 (ご自身のユーザー名に合わせてください)
    # $HOME は自動的に C:\Users\myuser のようなパスに展開されます
    cd $HOME 
    
    # .ssh フォルダ作成 (すでにあればエラーが出ますが無視してOK)
    mkdir .ssh 
    
    # .ssh フォルダに移動
    cd .ssh
    
    # authorized_keys ファイルを空で作成
    New-Item authorized_keys
    
  2. メモ帳で今作ったファイルを開き、ステップ1でコピーした公開鍵の文字列ssh-ed25519 AAAA...)を貼り付けて、上書き保存します。

    notepad $HOME\.ssh\authorized_keys
    
  3. 【最重要】 アクセス許可の絞り込み
    この 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】パスワード認証の無効化(セキュリティのキモ)

これが今回の一番の目的です。パスワードでのログインを完全に禁止します。

  1. sshd_config というSSHサーバーの「大本の設ファイル」をメモ帳で開きます。

    # ProgramData は隠しフォルダなのでパスを直打ち
    notepad "C:\ProgramData\ssh\sshd_config"
    
  2. 開いたファイルで、以下の2箇所を検索して書き換えました。

    • #PubkeyAuthentication yes $\to$ PubkeyAuthentication yes#を消して、公開鍵認証を明示的に有効化)
    • #PasswordAuthentication yes $\to$ PasswordAuthentication no#を消して、パスワード認証を無効化
  3. 設定を変更したので、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。最後に、家の「大門」であるルーターの設定です。

  1. ブラウザで http://192.168.1.1 を開き、ルーターの管理画面にログイン。

  2. 「ポートフォワーディング」(BUFFALOだったので「ポート変換」でした)の項目を探しました。

  3. 世界中のボットがスキャンしてくる22番ポートをそのまま使うのは嫌だったので、外部ポートは適当な数字(50022)にしました。

    • プロトコル: TCP
    • 外部ポート (WAN側): 50022 (← 自分で決めた番号)
    • 内部IPアドレス: 192.168.1.100 (サーバーPCの仮のIP
    • 内部ポート (LAN側): 22 (← SSHサーバーが待ってるポート)

    「外部から 50022 宛に来た通信を、192.168.1.10022 番に繋いでね」という意味ですね。なるほど。

ステップ7: 【接続元PC】接続テスト!

長かったですが、これで全部の設定が終わったはず。

  1. まず、サーバーPC(自宅PC)のグローバルIPを調べます。

    # サーバーPCのPowerShellで実行
    curl ifconfig.me 
    # 表示された本物のIPアドレス(例: 203.0.113.10 など)を控える
    

    (注意) ここで表示されるIPは本物なので、絶対に記事などには書かないように!

  2. いよいよ、接続元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の電源さえ入っていればいつでも外から触れるようになり、大満足です。

あくまで私が行った一例ですが、誰かの参考になれば嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?