MagicOnionのStreamingHub使用時のパケットのやり取りをみてみました。あと、.NETのSecurity Code Scanを使ってみました

# MagicOnionのStreamingHub使用時のパケットのやり取りをみてみました。あと、.NETのSecurity Code Scanを使ってみました

## 最終目標
- メタバースクライアントと連携可能かつ既存の攻撃手法に対して安全なバックエンドサーバーが構築できるようになること
    - MagicOnionとか.NETとか、なんならhttpsやらUnityすら覚束ない駆け出しエンジニアの独学記録です

## 目次
- [MagicOnionのStreamingHub使用時のパケットのやり取りをみてみました。あと、.NETのSecurity Code Scanを使ってみました](#magiconionのstreaminghub使用時のパケットのやり取りをみてみましたあとnetのsecurity-code-scanを使ってみました)
  - [最終目標](#最終目標)
  - [目次](#目次)
    - [本記事の目的](#本記事の目的)
    - [本記事での開発環境](#本記事での開発環境)
    - [今回の概要](#今回の概要)
    - [作業内容](#作業内容)
    - [わかったこと](#わかったこと)
      - [WireShark + http](#wireshark--http)
      - [Security Code Scan](#security-code-scan)
    - [次やりたいこと](#次やりたいこと)
    - [参考文献](#参考文献)

### 本記事の目的
- バックエンドサーバー構築、ネットワークセキュリティ、サーバーセキュリティに関する能力の向上を目指した勉強の動機付けと、備忘録
    - 今回はMagicOnionのStreamingHubのパケットのやり取りを追ってみて、.NETの静的コードスキャンツールを利用してみた

### 本記事での開発環境
- クライアント側
  - Unity2021.2.14f1
    - Project Settings内Playerの項目でAPI Compatibility Level: .NET Standard2.1
  - Grpc.Net.Client v2.51.0
- サーバー側
  - Grpc.AspNetCore v2.49.0
  - MagicOnion.Server v5.1.0
  - SecurityCodeScan.VS2019 v5.6.3
- 共有
  - MagicOnion.Abstractions v5.1.0
- 他
  - WireShark v4.0.3

### 今回の概要
　以下のことについてなんとなくわかったことを記載していく
- gRPC,MagicOnionのStreaming機能においてクライアントサーバ間で送受信されているデータ
- ~~Unityのhttps対応~~
  - 延期
- .NETの静的コードスキャンツールのSecurity Code Scanを使ってみる

### 作業内容
1. Unity+MagicOnionでチャットアプリを作成して、送受信されるパケットをWireSharkで確認
   - この段階ではhttpなので平文のパケットが飛ぶ
   - 以下のような感じ
     ![UnityChatClientSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685620/64047ce8-3d99-4922-e62c-bbeb4b65b8b0.png)


1. ~~httpsに設定を変更して同じことを行い、TLSで暗号化されていることを確認する~~
   - ~~.NETの開発用の証明書を使用してローカルで実験~~
   - Unityクライアントではクライアント側にも自己署名証明書が必要らしいので延期
     - PCに実験用のルート証明書が残ったりするのかわからないので仮想環境を立ててやってみる
     - <cite>[これ](https://docs.unity3d.com/Packages/com.unity.renderstreaming@2.0/manual/jp/https.html)</cite>がわかりやすそうだったので、これを参考にするつもり
2. .NETのSecurity Code Scanをしてみる
    - DevSecOpsに関連しそうな中で一番導入が簡単そうだから

### わかったこと

#### WireShark + http
　作成したチャットアプリでサーバーにチャットを投げてみて、それをWireSharkで確認した
1. http/1.1で通信していた
   - 当然、以下のように平文でやり取りしていた(SampleAという入力内容が見えている)
   ![UnityChatPlainText.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685620/a63d908f-faa3-0ca2-690e-61249a5e17af.png)

   - gRPCはhttp/2のみサポートしているはず
   - .NETが気を利かせた？
     - ```dotnet new grpc``` でプロジェクト作るとデフォルトでhttpの設定になっている(httpsではない)
   - とにかくこの状態ではTLSも使用していなかったのでデータが平文で送受信されていたので実運用では上で触れた設定ファイルをいじる必要がある
     - （そのおかげでMagicOnionのStreamngHubの理解が深まった）
1. MagicOnion の StreamingHub は以下のように呼び出されていた
   - チャットを一回送信するときのやり取りは以下のNo47からの８パケット
    ![UnityChatSingleProcess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685620/b0bd1a83-32e8-2a43-64dc-cad269286947.png)

  1. [PSH,ACK] クライアントが引数を投げる
  2. [ACK] サーバーが受理
  3. [PSH,ACK] サーバーが参加しているクライアントにストリーミングしていいか確認
  4. [ACK] クライアントが受理
  5. [PSH,ACK] サーバーがストリーミングする
  6. [ACK] クライアントが受理
  7. [PSH,ACK] サーバーがストリーミング終了の報告
  8. [ACK] クライアントが受理
      - データを見る限り、私の頭ではそう解釈するしかなかったというだけで合っているかはわからない
      - 実際のストリーミングはもっと大きいデータをストリーミングすると思うので、複数パケットに分けて送信する可能性も考慮して確認をするようになっているのだと思う

#### Security Code Scan
1. 導入は簡単
  - 公式サイトからコマンドをコピペして実行するだけでプロジェクトに導入できる(https://www.nuget.org/packages/SecurityCodeScan.VS2019/5.6.3)
  - スタンドアロン形式のものもあるらしいがそっちは今回は対象外
1. 利用も簡単
  - ビルドするだけ(dotnet build)
  - 今回のコードではC#特有の警告のみが出てきた
    - MagicOnionというかgRPCの実装の都合上仕方なさそうなもの
      - クライアントがawaitしてるが、asyncがサーバーに分離しているために発生している警告
      - プロジェクトレベルでasync-warningは切っておいた方が良いとのこと(MagicOnion公式のGithubより)

### 次やりたいこと
1. 延期したローカルテスト環境でのhttps化
1. security-code-scanで引っかかりそうな実装をあえてやってみたい
2. pythonでペンテストとか自作のサーバーを攻撃したりしたい

### 参考文献
- アプリ構築において以下の記事を参考にしました。
  - <cite>[Unity+MagicOnionで超絶手軽にリアルタイム通信を実装してみた](https://qiita.com/mitchydeath/items/cecf01493d1efeb4ae55)</cite>
  - <cite>[Amazon Linux 2 上に .NET 5 と MagicOnion を使ったゲームサーバー開発環境作ってみた #csharp](https://dev.classmethod.jp/articles/create-dev-env-for-dotnet-5-and-magiconion-on-amazon-linux-2-ec2/)</cite>
- また、Security Code Scanの導入において以下の記事を参考にしました。
  - <cite>[.NET で静的セキュリティコード検査 (Security Code Scan 編)](https://zenn.dev/masakura/articles/5d8525f9ffcf3e)</cite>![UnityChatClientSample.png]