Cloudflare Zero Trust の Windows マルチユーザ対応を実装する

# 目的
このドキュメントにある手順で、Cloudflare Zero Trust の Windows マルチユーザ対応を実装して確認します。

元々の前提として、Cloudflare Zero Trust では 1 OS 1 ユーザで使用する想定で考えられていますが、Windows デバイスで 1 OS 複数ユーザでの使用が Beta となりました。

:::note info
2024 年 12 月 26 日時点で、機能の有効化は、Cloudflare アカウントチームに連絡しておこなってもらう必要があります。
:::

https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/windows-multiuser/

```mermaid
%%{init: {'themeCSS': 'img {width: 48px; height:48px;}'}}%%
graph LR

subgraph Windows
a["Each WARP Session<br>(Sign out > Sign in)"]:::transparent
User1[User 1]
User2[User 2]
a -.-> User1 & User2
end

Cloudflare["<img src='https://cf-icons.pages.dev/logo-cloud.svg' width='48' height='48'/><br>Cloudflare Zero Trust"]:::transparent

User1 & User2 ---> |Enroll + Login|Cloudflare

classDef hidden display: none;
classDef transparent fill-opacity:0,stroke-opacity:0;
```

# WARP バージョン
以下のリンクから `Version 2024.12.326.1` をインストールします。

- [Cloudflare WARP Windows Beta | App Center](https://install.appcenter.ms/orgs/cloudflare/apps/1.1.1.1-windows/distribution_groups/beta)

# MDM ファイル
以下の記事を参考にします。 

https://qiita.com/khayama/items/9f675bef0a4d7e1721d7

MDM ファイル `mdm.xml` を `C:\ProgramData\Cloudflare` フォルダに配置します。

今回は以下のようなパラメータ設定を使います。

```xml:C:\ProgramData\Cloudflare\mdm.xml
<dict>
  <key>multi_user</key>
  <true/>
  <key>configs</key>
  <array>
    <dict>
      <key>organization</key>
      <string>org1</string>
      <key>display_name</key>
      <string>org1</string>
      <key>service_mode</key>
      <string>warp</string>
      <key>onboarding</key>
      <false />
      <key>auto_connect</key>
      <integer>0</integer>
      <key>switch_locked</key>
      <false />
    </dict>
    <dict>
      <key>organization</key>
      <string>org2</string>
      <key>display_name</key>
      <string>org2</string>
      <key>service_mode</key>
      <string>warp</string>
      <key>onboarding</key>
      <false />
      <key>auto_connect</key>
      <integer>0</integer>
      <key>switch_locked</key>
      <false />
    </dict>
  </array>
</dict>
```

# ユーザ 1 登録
Cloudflare WARP を開くと、初回登録時のログインが要求されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5ffd263b-0f76-c384-843e-76e1b5ef8b33.png"><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1f9f400e-b3aa-a104-107a-5dcad9643687.png">

# ユーザ切り替え
ユーザを切り替えるにはサインアウトします。

:::note warn
ユーザーは、別のアカウントに切り替える前に、Windowsアカウントからログアウトする必要があります。ユーザーは、画面をロックして別のアカウントにログインしたり、Windowsの［ユーザーの切り替え］オプションを使用したり、その他のタイプの同時セッションを行ったりすることはできません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/42f32566-f617-a9a4-4e78-bf3799ea0cf5.png)

# ユーザ 2 登録
同様に、Cloudflare WARP を開くと、初回登録時のログインが要求されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5ffd263b-0f76-c384-843e-76e1b5ef8b33.png"><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1f9f400e-b3aa-a104-107a-5dcad9643687.png">

# デバイス情報
ダッシュボードでデバイス情報を確認します。

- https://one.dash.cloudflare.com/?to=/:account/team/devices

1 OS 複数ユーザで使用すると、1 デバイスあたりのアクティブな登録が `2` になっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/0f64e033-480c-2f25-e9dd-693272e80100.png)

また、1 OS 複数ユーザで使用すると、デバイス ID とは別に、ユーザごとの登録 ID が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/ba985f12-f3fa-e1de-0cff-52477193eba0.png)

```json:multi-user-registration.json
[
        {
            "created_at": "2024-12-25T02:03:13.460621Z",
            "device": {
                "client_version": "2024.12.326",
                "id": "37258415-a819-4dd6-abb3-a73f76baff7a",
                "name": "DESKTOP-xxx"
            },
            "id": "62ac311a-c264-11ef-b604-d64e8457e8d2",
            "key": "xxx",
            "key_type": "secp256r1",
            "last_seen_at": "2024-12-25T11:43:20.033544Z",
            "tunnel_type": "masque",
            "updated_at": "2024-12-25T11:43:20.033544Z",
            "user": {
                "email": "user1@exmaple.jp",
                "id": "0039a95b-1abf-5788-b35e-1c419178fa92",
                "name": ""
            }
        },
        {
            "created_at": "2024-12-25T01:58:55.569566Z",
            "device": {
                "client_version": "2024.12.326",
                "id": "37258415-a819-4dd6-abb3-a73f76baff7a",
                "name": "DESKTOP-xxx"
            },
            "id": "cbf46df3-c263-11ef-a9fb-160fa4b248be",
            "key": "xxx",
            "key_type": "secp256r1",
            "last_seen_at": "2024-12-25T15:36:10.598786Z",
            "tunnel_type": "masque",
            "updated_at": "2024-12-25T15:36:10.598786Z",
            "user": {
                "email": "user1@example.com",
                "id": "4b79fcad-0452-41be-99c0-73f777b31a6f",
                "name": ""
            }
        }
    ]
```

参考までに、1 OS 1 ユーザで使用する場合には、デバイス ID と登録 ID は同じ値です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/d6f4d9cf-d8de-1c93-ab97-62cc6c43ab56.png)

```json:single-user-registration.json
[
        {
            "created_at": "2024-11-26T03:58:26.471953Z",
            "device": {
                "client_version": "2024.11.309",
                "id": "b04ec591-abaa-11ef-bafb-f2745cbd2ba2",
                "name": "DESKTOP-xxx"
            },
            "id": "b04ec591-abaa-11ef-bafb-f2745cbd2ba2",
            "key": "xxx",
            "key_type": "curve25519",
            "last_seen_at": "2024-11-26T03:58:47.075436Z",
            "tunnel_type": "wireguard",
            "updated_at": "2024-11-26T03:58:47.075436Z",
            "user": {
                "email": "user1@example.com",
                "id": "4b79fcad-0452-41be-99c0-73f777b31a6f",
                "name": ""
            }
        }
    ]
```

# HTTP 通信ログ

1 OS 複数ユーザで使用すると、デバイス ID とは別に、ユーザごとの登録 ID が確認できましたが、ログのデバイス ID `DeviceID` フィールドとしては、登録 ID の値が使用されます。

## ユーザ 1 の通信ログ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/6aa2c482-000a-de6b-09e6-477766cc8793.png)

```json:user1-log.json
{
  "AccountID": "xxx",
  "Action": "allow",
  "ApplicationIDs": [],
  "ApplicationNames": [],
  "BlockedFileHash": "",
  "BlockedFileName": "",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "",
  "CategoryIDs": [
    7,
    122
  ],
  "CategoryNames": [
    "Entertainment",
    "News & Media"
  ],
  "Datetime": "2024-12-25T15:34:08Z",
  "DestinationIP": "23.62.20.42",
  "DestinationIPContinentCode": "AS",
  "DestinationIPCountryCode": "JP",
  "DestinationPort": 443,
  "DeviceID": "62ac311a-c264-11ef-b604-d64e8457e8d2",
  "DeviceName": "DESKTOP-xxx",
  "DownloadMatchedDlpProfileEntries": [],
  "DownloadMatchedDlpProfiles": [],
  "DownloadedFileNames": [
    "<unknown file name>"
  ],
  "Email": "user1@exmaple.jp",
  "FileInfo": {
    "files": []
  },
  "ForensicCopyStatus": "none",
  "HTTPHost": "assets.msn.com",
  "HTTPMethod": "GET",
  "HTTPStatusCode": 200,
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "",
  "PolicyName": "",
  "PrivateAppAUD": "",
  "ProxyEndpoint": "",
  "Quarantined": false,
  "Referer": "https://www.msn.com/",
  "RequestID": "24a00d4bfe0000e0a8873ce400000001",
  "SessionID": "24a00d3a960000e0a8c1f78400000001",
  "SourceIP": "x.x.x.x",
  "SourceIPContinentCode": "AS",
  "SourceIPCountryCode": "JP",
  "SourceInternalIP": "",
  "SourcePort": 54686,
  "URL": "https://assets.msn.com/xxx.js",
  "UntrustedCertificateAction": "none",
  "UploadMatchedDlpProfileEntries": [],
  "UploadMatchedDlpProfiles": [],
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
  "UserID": "0039a95b-1abf-5788-b35e-1c419178fa92",
  "VirtualNetworkID": "604aa865-1642-405c-a745-3d448f69b8f1",
  "VirtualNetworkName": "default"
}
```

## ユーザ 2 の通信ログ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/71819542-0581-531a-fe19-ddee215b4b85.png)

```json:user2-log.json
{
  "AccountID": "xxx",
  "Action": "allow",
  "ApplicationIDs": [],
  "ApplicationNames": [],
  "BlockedFileHash": "",
  "BlockedFileName": "",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "",
  "CategoryIDs": [
    7,
    122
  ],
  "CategoryNames": [
    "Entertainment",
    "News & Media"
  ],
  "Datetime": "2024-12-25T15:36:19Z",
  "DestinationIP": "204.79.197.203",
  "DestinationIPContinentCode": "NA",
  "DestinationIPCountryCode": "US",
  "DestinationPort": 443,
  "DeviceID": "cbf46df3-c263-11ef-a9fb-160fa4b248be",
  "DeviceName": "DESKTOP-xxx",
  "DownloadMatchedDlpProfileEntries": [],
  "DownloadMatchedDlpProfiles": [],
  "DownloadedFileNames": [
    "<unknown file name>"
  ],
  "Email": "user1@example.com",
  "FileInfo": {
    "files": [
      {
        "direction": "download",
        "file_name": "<unknown file name>",
        "file_size": 0,
        "content_type": "image/gif",
        "action": "none"
      }
    ]
  },
  "ForensicCopyStatus": "none",
  "HTTPHost": "srtb.msn.com",
  "HTTPMethod": "GET",
  "HTTPStatusCode": 204,
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "",
  "PolicyName": "",
  "PrivateAppAUD": "",
  "ProxyEndpoint": "",
  "Quarantined": false,
  "Referer": "https://ntp.msn.com/",
  "RequestID": "24a00f49510000af5567454400000001",
  "SessionID": "24a00f46500000af558e691400000001",
  "SourceIP": "x.x.x.x",
  "SourceIPContinentCode": "AS",
  "SourceIPCountryCode": "JP",
  "SourceInternalIP": "",
  "SourcePort": 54837,
  "URL": "https://srtb.msn.com/notify/served?rid=xxx",
  "UntrustedCertificateAction": "none",
  "UploadMatchedDlpProfileEntries": [],
  "UploadMatchedDlpProfiles": [],
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
  "UserID": "4b79fcad-0452-41be-99c0-73f777b31a6f",
  "VirtualNetworkID": "604aa865-1642-405c-a745-3d448f69b8f1",
  "VirtualNetworkName": "default"
}
```

# まとめ

Cloudflare Zero Trust の Windows マルチユーザ対応を実装して、確認することができました。

サインアウト・サインインによって、Windows デバイスで 1 OS 複数ユーザでの使用ができるのはありがたいです。

展開時には MDM パラメータ `multi_user` を設定するだけでよく、すぐに使い始められそうです。

ユーザ体験はマルチユーザで同じで、ログの区別も問題なさそうでよかったです。