図解で、Windows共有フォルダにSSH接続（SMB over SSH）

# 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のみ許可する。
【１】パソコンを起動したら、Putty（SSHクライアント）を起動してWindowsサーバーにSSH接続する。
【２】Windowsエクスプローラーを立ち上げて、ネットワークドライブを割り当てする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ab71b345-9f91-fdf5-9868-6e3275a9ae6f.png)

### 自宅PC側のエクスプローラー
Windows10のエクスプローラーでファイルを保存、読み取り、書き換え、削除できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ede34489-6493-e42f-bded-d4b9ae062b5c.png)

### 参考サイト
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で共有フォルダに接続可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ed7e7a2d-96a2-deb4-de79-5be4354c354c.png)

セキュリティグループ(ファイアウォール)はtcp22のみで可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/d72e96c4-1725-af3e-2da4-13d423a18a09.png)

## 1. Windows サーバー側の設定

### 1-1. ユーザー（アカウント）を作る
共有フォルダにアクセスするにはWindows Server のユーザ名とパスワードが必要です。共有フォルダ用に作ります。このユーザ名とパスワードは、共有フォルダにアクセスするときの認証に使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/2efa7f26-0eff-ce20-5240-9c162bffe6ba.png)

### 1-2. フォルダを共有する
フォルダを右クリックしてプロパティの［共有］タブを選ぶ。最初は「共有されていません」と表示される。
［共有(S)...］をクリックして、Windows Server側のユーザーを選ぶ（この例では、BatMobileさん）。
次の画面へ進むと「ユーザーのフォルダーは共有されています」と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/debca74b-521b-6da5-522b-bdf8607edb80.png)

フォルダを共有できたので、ファイル書き込み・読み取りをテストする。まずはテスト用ファイルを作成してみて...。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/2f9cdb42-875a-d0f7-c9b6-f86040d7323c.png)

### 1-3. SMBv2/v3を有効にする
SSH接続した後の話だが「ネットワークの場所の追加　入力したフォルダーは有効ではないようです。別のフォルダーを選択してください」とエラーが表示される場合がある。Windows Server 2019はSMBv1がデフォルトでは無効になっているのでサーバー側でネットワークドライブとしてマウントできない様だ。SMBv1は脆弱性があるので非推奨。従ってSMBv2/v3を有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/c7e7a333-3b73-3289-0335-4ba217c989db.png)
サーバーの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]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/8b746900-e9c7-583b-fd36-03d594800176.png)

### 2-3. ループバックアダプタの初期設定
[ネットワークと共有センター]を開く。先ほど追加したループバックアダプタのイーサネット(たぶん2)が追加されているはず。そのイーサネット2をクリックしてプロパティを２箇所変更します。
【１】ネットワーク用ファイルとプリンター共有のチェックを外します。
【２】IPv4のプロパティでIPアドレスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/03f6a591-2a4f-8665-b79f-9b9282a3274e.png)
IPv4のIPアドレスにDHCPや固定割り当てしていない、空いているローカルIPアドレスを設定する。
【３】［詳細設定］をクリックして、[NetBIOS over TCP]を無効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/aeacdba2-1121-3974-f190-765aa9333b41.png)

### 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
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/256f46e0-e38d-369a-a448-7434523f6921.png)


### 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)の両方ができるように設定してある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/3da45638-8a77-4547-3c05-ea65ad94d5c6.png)

## 共有フォルダ(SMB)を使う手順
パソコン Windows10 の ファイルエクスプローラーを起動して、「ネットワークドライブの割り当て」もしくは「ネットワークの場所の追加」を実行する。接続先は、ループバックアダプタに設定したローカルIPアドレス。源ポート(TCP 44445)にアクセスするとクラウドのサーバー(Windows Server 2019 on IBM Cloud)へポートフォワードされ共有フォルダ(TCP 445)に転送される。

### ネットワークの場所の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/c6ead941-2ec5-93bf-f98a-f57e3982d73a.png)

### ネットワークドライブの割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/32a30e6c-8ebf-967f-be9e-7b995910c0d9.png)


### （参考）パソコン側のSMBポートフォワード待ち受けの検査
ループバックアダプタのIPアドレスが[192.168.255.2]の場合、Puttyを起動してSSHセッションを開く。DOSプロンプトを起動して、クライアントPCが源ポート44445をリッスン（待ち受け）していることをCLIコマンド「netstat -an | find "192.168.255"」で検査する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/3cbd6ffb-4e3d-d3e1-606d-e182f6694ad0.png)

### （参考）Windows10, SMBv1が無効になっている事
コントロールパネル　>　プログラム　>　プログラムと機能　>　Windows の機能の有効化または無効化
Windows機能の［SMB1.0］を無効にします。「SMB1.0/CIFS ファイル共有のサポート」のチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/2d2256e8-dcc4-5e79-12cb-7cc18490c71f.png)