Windows Server 2019 に "SMB over SSH" でマウントする
要件
自宅PCのエクスプローラーに、クラウド側Windowsサーバーの共有フォルダをネットワークドライブとして割り当てする。ユースケースは、Windowsサーバーを保守するときにファイルを保存・読み取りするのだが、訳あってscpやsftpを使わずに普段使っているWindowsエクスプローラーを使う。
実現手法
SSH接続(SSH鍵)してWindowsエクスプローラー経由でファイルを保存・読み取りする。
セキュリティ
ランサムウェアの攻撃を避けるためTCP 445ポートを防御しなければならない。そのためインターネット向けに許可するのはSSH(TCP22)だけとし、TCP 445は許可しない。共有フォルダにアクセスできるのはSSH秘密鍵を持っているユーザだけになる。
環境
- ネットワーク経路:自宅PC → インターネット → クラウドのサーバー(IBM Cloud)
- 自宅PC : Windows 10, SSHクライアント(Putty), vNIC(ループバックアダプタ)
- サーバー: Windows Server 2019, Windows機能(SMBv2/v3, OpenSSH)
- 接続手段: SMB over SSH
- セキュリティ: TCP ポートは22番のみ(TCP 445は攻撃の為のスキャンされるのでSSH鍵を持つPCに限定する)
- 前提: 前提条件として、Windows Server側のOpenSSH(TCP22)が設定済み、Puttyを使ってSSH接続が出来ていること。この説明は省きます。まだの人はWindows ServerにSSH接続する(→)を参照方(https://qiita.com/1Kano/items/ea018abaae7ce5edbf73)。
ネットワーク構成(IBM Cloud の場合)
クラウド側ファイアウォール(セキュリティグループ)はTCP 22のみ許可する。
【1】パソコンを起動したら、Putty(SSHクライアント)を起動してWindowsサーバーにSSH接続する。
【2】Windowsエクスプローラーを立ち上げて、ネットワークドライブを割り当てする。
自宅PC側のエクスプローラー
Windows10のエクスプローラーでファイルを保存、読み取り、書き換え、削除できる。
参考サイト
Mounting home directory using SSH for Windows 10 (https://www.nikhef.nl/~janjust/CifsOverSSH/Win10Loopback.html)
クラウドのサーバーをNAS的に使う
ランサムウェア対策のためインターネット経路はSSH接続(TCP22)のみとしSSH鍵を併用する。今回用意したサーバーはIBM CloudのVPC仮想サーバー。ファイアウォール(セキュリティグループ)周辺の設定が異なるかもしれないが他のクラウド(AWS/Azureなど)でもSMB over SSHで共有フォルダに接続可。
セキュリティグループ(ファイアウォール)はtcp22のみで可。
1. Windows サーバー側の設定
1-1. ユーザー(アカウント)を作る
共有フォルダにアクセスするにはWindows Server のユーザ名とパスワードが必要です。共有フォルダ用に作ります。このユーザ名とパスワードは、共有フォルダにアクセスするときの認証に使います。
1-2. フォルダを共有する
フォルダを右クリックしてプロパティの[共有]タブを選ぶ。最初は「共有されていません」と表示される。
[共有(S)...]をクリックして、Windows Server側のユーザーを選ぶ(この例では、BatMobileさん)。
次の画面へ進むと「ユーザーのフォルダーは共有されています」と表示される。
フォルダを共有できたので、ファイル書き込み・読み取りをテストする。まずはテスト用ファイルを作成してみて...。
1-3. SMBv2/v3を有効にする
SSH接続した後の話だが「ネットワークの場所の追加 入力したフォルダーは有効ではないようです。別のフォルダーを選択してください」とエラーが表示される場合がある。Windows Server 2019はSMBv1がデフォルトでは無効になっているのでサーバー側でネットワークドライブとしてマウントできない様だ。SMBv1は脆弱性があるので非推奨。従ってSMBv2/v3を有効にする。
サーバーのSMB v2/v3を有効にする(PowerShellを管理者権限で実行すること)。
■有効なのか無効なのか、確認する
PS C:\Windows\system32> Get-SmbServerConfiguration | Select EnableSMB2Protocol
EnableSMB2Protocol
------------------
False
■有効にする
PS C:\Windows\system32> Set-SmbServerConfiguration -EnableSMB2Protocol $true
■有効になったことを確認する
PS C:\Windows\system32> Get-SmbServerConfiguration | Select EnableSMB2Protocol
EnableSMB2Protocol
------------------
True
■SMBv1, SMBv2が有効か無効なのか、確認する
PS C:\Windows\system32> Get-SmbServerConfiguration
EnableSMB1Protocol : False
EnableSMB2Protocol : True
2. パソコン(Windows10)側の設定
2-1. 前提(SSH接続)
繰り返しになるがPuttyでWindowsサーバーにSSH接続できていること。
まだの場合はこちら→(https://qiita.com/1Kano/items/ea018abaae7ce5edbf73)
2-2. ループバックアダプタ(仮想NIC)を追加
パソコンのLANやwifiとは別のネットワークドライブ接続用のIPアドレスが必要なので、下図の流れでマイクロソフトの[KM-TEST Loopback Adapter]を追加する。
[コントロールパネル] → [ハードウェアとサウンド] → [デバイスとプリンター] → [デバイスマネージャー] → [レガシーハードウェアの追加] → [インストール方法:一覧から選択] → [ネットワークアダプター] → [Microsoft KM-TEST Loopback Adapter]
2-3. ループバックアダプタの初期設定
[ネットワークと共有センター]を開く。先ほど追加したループバックアダプタのイーサネット(たぶん2)が追加されているはず。そのイーサネット2をクリックしてプロパティを2箇所変更します。
【1】ネットワーク用ファイルとプリンター共有のチェックを外します。
【2】IPv4のプロパティでIPアドレスを設定します。
IPv4のIPアドレスにDHCPや固定割り当てしていない、空いているローカルIPアドレスを設定する。
【3】[詳細設定]をクリックして、[NetBIOS over TCP]を無効にする。
2-4. Windows10 [LanmanServer]ドライバの調整
ループバックアダプタのIPアドレスが[192.168.255.2]の場合、DOSプロンプトでTCP 445の待ち受けを設定する。
▼[LanmanServer]ドライバーを調整する。
自動起動を無効にする(空白の位置に注意)
> sc config lanmanserver start= delayed-auto
▼[iphlpsvc]は起動時に実行する。
> sc config iphlpsvc start= auto
▼TCPポート445を
> netsh interface portproxy add v4tov4 listenaddress = <vNICのアドレス> listenport = 445 connectaddress = <vNICのアドレス> connectport = 44445
つまりこの例では
> netsh interface portproxy add v4tov4 listenaddress = 192.168.255.2 listenport = 445 connectaddress = 192.168.255.2 connectport = 44445
2-5. PuttyにSMBポートフォワードを設定
[RDP over SSH]の要領で、[SMB over SSH]を実現するよう設定する。
PuttyのSSHトンネル設定にポートフォワードを追加する。
■源ポート:192.168.255.2:44445
■送り先:10.244.128.4:445
[追加]する
下図の場合、Windows Server にSSH接続後、RDP接続(RDP over SSH, TCP 445)とSMB接続(SMB over SSH, TCP 3389)の両方ができるように設定してある。
共有フォルダ(SMB)を使う手順
パソコン Windows10 の ファイルエクスプローラーを起動して、「ネットワークドライブの割り当て」もしくは「ネットワークの場所の追加」を実行する。接続先は、ループバックアダプタに設定したローカルIPアドレス。源ポート(TCP 44445)にアクセスするとクラウドのサーバー(Windows Server 2019 on IBM Cloud)へポートフォワードされ共有フォルダ(TCP 445)に転送される。
ネットワークの場所の追加
ネットワークドライブの割り当て
(参考)パソコン側のSMBポートフォワード待ち受けの検査
ループバックアダプタのIPアドレスが[192.168.255.2]の場合、Puttyを起動してSSHセッションを開く。DOSプロンプトを起動して、クライアントPCが源ポート44445をリッスン(待ち受け)していることをCLIコマンド「netstat -an | find "192.168.255"」で検査する。
(参考)Windows10, SMBv1が無効になっている事
コントロールパネル > プログラム > プログラムと機能 > Windows の機能の有効化または無効化
Windows機能の[SMB1.0]を無効にします。「SMB1.0/CIFS ファイル共有のサポート」のチェックを外します。