タイトル通りのことをやろうとして約1日かかってしまったので備忘録として残します。SSH接続カンタンに見えてムズカシイ...
環境
- ・macOS Montrey 12.2.1
- ・Windows 11 home 21H2
- ・OpenSSH (Windows)
- ・iTerm (mac)
- ・PowerShell (Windows)
ルーター側の設定
まずはルーターの設定です。使用するルーターによって設定画面が異なりますが、「ポート開放」あるいは「ポートフォワーディング」なる設定をする必要があります。
自分の例(Buffaloルーター)ですが、「セキュリティー」->「ポート変換」に移動して、
を設定します。WindowsのローカルIPは
ipconfig
で出力されるIPv4アドレス
という箇所で確認できます。
OpenSSHクライアントのインストール
ここからWindowsの設定をしていきます。
Windowsをサーバー化するには「OpenSSHクライアント」のインストールが必要です。
Windowsをサーバー化するうえで、今回は「OpenSSHクライアント」を利用します。インストール済みかどうかは「設定」->「アプリ」->「オプション機能」で確認できます。
ここにOpenSSHクライアントがなければ、オプション機能の一番上にある「オプション機能を追加する」の「機能を表示」ボタンをクリックすればインストールが可能な機能が表示されます。ここでOpenSSHを探してインストールしましょう。
OpenSSHの設定
まずは「Windowsツール」->「サービス」に移動。
「OpenSSH SSH Server」を開いて
- ・「サービスの種類」を「自動(遅延開始)」に変更
- ・「サービスの状態」の「開始」をクリック
サーバー側のSSH設定
まずはサーバー側(Windows)でSSHの設定を行っていきます。
PowerShellを管理者として起動します。
参考 - 【Windows】PowerShellを管理者権限で起動するコマンド
Start-Process PowerShell.exe -Verb runas
1. .ssh
ディレクトリの作成
SSH接続には.ssh
というディレクトリが必要ですので、ない場合は事前に作成しておきます。
.ssh
ディレクトリは、自身のホームディレクトリC:\Users\<ユーザー名>
の直下に置くのが一般的かと思いますので、今回は以下の場所にあることを想定して進めていきます。
C:\Users\<ユーザー名>\.ssh
なお、.ssh
がない場合は以下の2種類のコマンドを実行して作成します。
New-Item "C:\Users\<ユーザー名>\.ssh" # .sshディレクトリ作成
icacls "C:\Users\<ユーザー名>\.ssh" /remove Everyone # 閲覧権限からEveryoneを削除(これをしないとSSH接続できない)
同様に、クライアント側(mac)にも.ssh
ディレクトリを作成しておきます。クライアント側の.ssh
の場所はどこでも大丈夫です。
2. サーバー側のsshd_config
ファイルの書き換え
まずはsshd_config
ファイルのあるディレクトリに移動します。
Set-Location "C:\ProgramData\ssh"
そしてテキストエディタ(メモ帳など)で内容を編集します。書き換えるファイル名はssh_config
ではなく sshd_config
なのでお間違えの無いよう。
notepad ".\sshd_config"
ファイルが開けたら、その中の PubkeyAuthentication yes
と Match User
および AuthorizedKeysFile
それぞれの行頭の#
を削除します(コメントでない状態とします)。
AuthorizedKeysFile
の箇所にはSSH接続時に使用する公開鍵のパスを記載します。デフォルトで.ssh/authorized_keys
となっており、このままでも問題ありません(この設定の場合、後述するauthorized_keys
ファイルは.ssh
ディレクトリ直下に置くことになります)。
なお、最後の2行に
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
という記述がありますが、administratorsというGroupを使うことはないので、私は不具合のないようコメントアウトしました。
以上でサーバー側でのSSH設定は完了です。
クライアント側(mac)でのSSH設定
1. macで公開鍵と秘密鍵を生成
macのコマンドプロンプトを開いて、.ssh
ディレクトリをアクセス制限をかけつつ作成します。
cd <.sshを格納したいディレクトリ>
mkdir .ssh
chmod 700 .ssh # .sshにはファイル所有者しかアクセスできないようにする
.sshに移動して公開鍵と秘密鍵を作成します。
cd .ssh
ssh-keygen -t ed25519 # Ed25519というアルゴリズムで生成
最初に「どのディレクトリに作成するか」を聞かれます。何も入力せずにEnterを押せば質問文右の()内のパスに鍵が作成され、任意のディレクトリ(絶対パス)を入力すればそこに作成されます。id_ed25519
ファイルが秘密鍵、id_ed25519.pub
ファイルが公開鍵です。
続いてパスフレーズの入力が求められます。パスフレーズを設定したくない場合はそのままEnter、入力すればパスフレーズが設定されます。以上で鍵の作成が完了します。
2. 公開鍵の中身をサーバーに登録
作成出来たら、以下コマンドにて公開鍵id_rsa.pub
の中身をWindowsに登録します。
以下コマンド実行後,公開鍵の内容が自動的にWindows上にauthorized_keys
として登録されます.
ssh-copy-id -i <公開鍵のパス> <Windowsのユーザー名>@<WindowsのローカルIP>
# 例)ssh-copy-id -i ~/.ssh/id_ed25519.pub hoge@192.168.123.45
接続してみる
以上でSSH接続を行うための準備が完了です!試しに接続してみましょう。
クライアント側(mac)のコンソール上で.sshのあるディレクトリまでcd
コマンドで移動したら、以下のコマンドを実行します。
ssh -i .ssh/id_ed25519 <Windowsのユーザー名>@<WindowsのローカルIP>
これで無事接続出来たら
<Windowsのユーザー名>@<Windowsの名前>
上記のような表示に切り替わるはずです。
ただし、サーバーのある場所をローカルIPで指定しているこの方法では、同じLANに接続していないとSSH接続できません。ので、次はWANから接続する方法を説明します。
SSH接続をより安全なものにする
ここまでくるとSSH接続ができる状態になっていると思いますが、セキュリティ面ではまだ不安が残っていることも事実です。
ここでは
- SSH接続は公開鍵認証のみ受け付ける(パスワードでのログインを許可しない)
- root(管理者)としてログインできないようにする
sshd_config
の設定
サーバー側(Windows)のsshd_config
ファイルを修正するだけで安全な接続ができるようになります。
sshd_config
は管理者権限でのみ変更が可能なので、まずはPowerShellを管理者として実行します。
実行出来たらsshd_config
ファイルのあるディレクトリに移動
Set-Location "C:\ProgramData\ssh"
メモ帳などのエディタでsshd_config
を編集します。
notepad sshd_config
ファイルが開いたら、以下の文を追加します。
PubkeyAuthentication yes # 公開鍵認証の許可
PasswordAuthentication no # パスワード認証を許可しない
PermitRootLogin no # rootとしてのログインを禁止
保存したらsshdを再起動します。
net stop sshd
net start sshd
これでより安全にSSH接続が行えるようになります!