Workgroup環境でSMB over QUICを試してみる

# 本記事について
本記事はQUICプロトコルを用いてSMBでのファイル共有をおこなうSMB over QUICを、簡単に構築できる環境でとりあえず試してみようという内容です。
本来であればADやパブリックな機関で発行した証明書を用いて、ドメイン参加したファイルサーバにKerberos認証でアクセスするというものですが、テスト環境でQUICを肌で感じたいという趣旨ですのでセキュリティはいったん置いておき以下の条件でSMB over QUICを実装していきます。
- ファイルサーバ、クライアントともにWorkgroup環境（NTLM認証）
- サーバ証明書は自己証明書
- ネットワークはインターネット経由
- ファイルサーバはWindows Server 2022 Azure Edition (Azure VM)
- クライアントはWindows 11 (Azure VM)

なお、運用環境を見据えたSMB over QUICの実装はMicrosoftの公式ドキュメントに詳細な手順が記載されていますので、そちらを参照しましょう。
[Microsoft社ドキュメント|SMB over QUIC](https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-over-quic)

また、Windows Server / Windows 11の次期バージョンではクライアントアクセスコントロールの機能が提供されるようです。
今回は試していませんが、こちらのMicrosoft社のドキュメントも参考になります。
[SMB over QUIC client access control now supported in Windows Insider](https://techcommunity.microsoft.com/t5/storage-at-microsoft/smb-over-quic-client-access-control-now-supported-in-windows/ba-p/3951938)

:::note info
上記2つのドキュメントにも記載されている通り、本記事の構成はセキュリティ面から推奨されれていません。
テスト用途以外の場合は自己証明書は避け、ADを用意してKerberos認証を利用できるように構成することをおススメします。
:::

# ファイルサーバの準備
## サーバ証明書作成
ファイルサーバとなるWindows Server 2022でサーバ証明書を作成します。
以下のコマンドの例では、2048bitのRSAにて有効期限が6か月間の証明書を作成しています。
証明書のKeyAlgorithm等はMicrosoft社ドキュメントに合わせて修正も可能です。

ポイントは"DnsName"です。Azure VMで構築している場合はパブリックIPアドレスでDNS名ラベルを設定しておきましょう。
```
# サーバ証明書の作成
$serverCert = New-SelfSignedCertificate -DnsName <ファイルサーバFQDN> -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddMonths(6) -KeyAlgorithm "RSA" -KeyLength "2048"
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/753c5417-8ac0-5f7f-ac2e-5b70fe358b90.png)


## SMB over QUIC設定
次にファイルサーバで証明書作成に続けて以下のコマンドを実行し、SMB over QUICの設定をおこないます。
証明書作成時に開いていたプロンプトを閉じてしまった場合は証明書マネージャーから証明書を開いて"Thumbprint"の値を確認して直接指定しましょう。

```
# サーバ証明書のマッピング
New-SmbServerCertificateMapping -Name <ファイルサーバFQDN> -Thumbprint $serverCert.Thumbprint -Store My
```
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/3cc2f4df-b8b5-70b7-ecaf-4543a7b448b5.png)


おそらく、上記によってファイルサーバのWindowsファイアウォールではUDP/443が許可されていると思いますが、許可されていない場合には環境に応じてパブリック、プライベート/ドメインの許可ルールを有効化しておきましょう。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/3d6695de-b731-8abb-b46b-4ee387e44472.png)


なお、Azure VMで作成していますのでNSGではUDP/443を許可しています。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/5bb59ebb-2e00-7059-42d9-5ebb870e9f86.png)


## 共有の作成
テスト用に適当なフォルダで共有を作成しておきます。
必要に応じてアクセス権も設定しておきましょう。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/a1572cfe-a73e-1097-0a06-f219a8f048a8.png)


## サーバ証明書のエクスポート
最後にクライアント端末側の準備のために、サーバ証明書をエクスポートしておきます。
秘密鍵は不要です。

# クライアントの準備・接続
## サーバ証明書のインストール
ファイルサーバからエクスポートしておいたサーバ証明書をクライアント側にコピーし、インストールをおこないます。
このとき"Current User"の証明書ストアではなく、"Local Computer"の証明書ストアにインストールしておかないと接続がうまくいきませんでした。
"Local Computer"の"Trusted Root Certification Authorities"にインストールしています。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/78bebe56-428a-fe86-2541-443dd84607b4.png)


## 接続
ここまでの準備ができていればファイルサーバにSMB over QUICで接続できるはずです。
SMBの挙動としてはまずはTCP/445で接続を試行し、成功しなかった場合はQUIC (UDP/443)に切り替えて接続をおこなうようです。
エクスプローラーから接続する場合は上記の挙動になりますが、net useコマンドやPowerShellでは最初からQUICを指定することも可能です。
以下のコマンドでQUICを指定して接続をおこないます。
```
# QUICで接続
New-SmbMapping -LocalPath 'Z:' -RemotePath '\\<ファイルサーバのFQDN>\share01' -TransportType QUIC -UserName <ファイルサーバのローカルユーザー名> -Password <ユーザーのパスワード>
```

成功すると以下のように指定したドライブにマウントされたことが確認できます。
接続に成功しない場合はFQDNでの名前解決ができているかどうか、証明書のストアに間違いがないか、NSGやファイアウォールでの許可に問題がないかを確認しましょう。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/4b3efd70-898d-ad0d-06b1-45069ff2bb2b.png)


New-SmbMappingコマンドでQUICを指定していることやNSGの許可ルールからQUICで接続していることに間違いはありませんが、ファイルサーバ側でパケットキャプチャを取るとQUICでの通信が確認できます。
※10.0.0.4はファイルサーバのプライベートIPアドレス、マスキング箇所はクライアントのグローバルIPアドレスです。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/6785cc8a-07c1-4481-9a6d-71bbfe701a16.png)


# まとめ
自己証明書を用いてWorkgroup環境でのSMB over QUICを試してみましたが非常にシンプルな作業で完了できました。
ドメイン環境であっても大きな流れは変わらないかと思います（KDCプロキシの設定などが入るケースはあるものの）。

次期バージョンのWindows ServerやクライアントOSではさらに機能強化やオンプレ側でのファイルサーバ実装が可能になるようですので引き続き注視していきましょう。