> ## Documentation Index
> Fetch the complete documentation index at: https://docs.folta.co.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# Jamf Proで導入する

> Jamf ProでFoltaのmobileconfigを配布し、Chrome・Edge・Foltaの端末登録まで確認する手順です。

Jamf ProからFoltaをMacへ配布し、Chrome / Edgeへの反映と端末登録を確認する手順です。

## まず結論

FoltaのmacOS向け無人配布では、PKGやシェルスクリプトではなく、セットアップキットに含まれる `folta-mdm-mac.mobileconfig` を**Computer Level・Install Automatically**で配布します。

この1ファイルに、Chrome / Edgeの強制インストールと、Foltaへ自己登録するためのManaged Storageが含まれます。Intel MacとApple Siliconで手順は同じです。

> \*\*検証状況：実機検証待ち。\*\*Chromeの強制配布とManaged Storage、Edgeの強制配布、JamfのアップロードとPayload Variablesは公式仕様で確認済みです。Edgeの拡張機能別Managed Storage、Jamf取り込み後の4 payload保持、端末上での変数置換、既存プロファイルとの競合は、最初の実機で確認してください。

## 仕組みを30秒で理解する

```text theme={null}
Jamf Pro
  ↓ 構成プロファイルを自動配布
folta-mdm-mac.mobileconfig
  ├─ Chrome / EdgeへFoltaを強制インストール
  └─ 登録トークンと端末情報をManaged Storageへ設定
       ↓
Folta拡張機能が自分で端末登録
       ↓
端末ごとの認証情報をブラウザ内へ保存
```

Jamfが行うのはプロファイル配布と端末情報の差し込みです。Foltaへの端末登録は、プロファイルを読んだChrome / Edge拡張機能が行います。

## このプロファイルに含まれるもの

`folta-mdm-mac.mobileconfig` には4つの設定が入っています。

1. FoltaをChromeへ強制インストール
2. Chrome用Managed Storage
3. FoltaをEdgeへ強制インストール
4. Edge用Managed Storage

Managed Storageには次の値が含まれます。

```text theme={null}
apiBaseUrl
enrollmentToken
deviceId       = $SERIALNUMBER
deviceHostname = $COMPUTERNAME
deviceUsername = $USERNAME
```

`clientId` と `clientSecret` はプロファイルに含まれません。拡張機能が登録トークンを使ってFoltaへ登録し、端末固有の認証情報を取得します。

## 事前準備

* Folta管理者権限
* Jamf Pro管理者権限
* Jamf ProのMDM管理下で、Computer Levelの構成プロファイルを配信できるテスト用Mac 1〜5台（ChromeとEdgeの両方を同時に検証する場合は4台以下）
* 旧来のユーザー主導登録を含む環境では、InventoryでUser Approved MDMの状態も確認する
* Jamf InventoryのComputer Name、Serial Number、User and Locationが正しいこと
* Chrome / Edgeはプロファイルより先にインストールされている必要はないが、反映とFolta登録を確認する時点までに対象ブラウザをインストールし、一度起動する
* Folta API、拡張機能の更新情報、CRX配信先へHTTPS接続できること
* Folta管理画面の［セットアップ］から取得した最新macOS用セットアップキット

Jamfの `$USERNAME` は、現在Macへログインしているローカルユーザーではなく、Jamf Proでそのコンピュータに関連付けられたユーザー名です。配布前にInventoryを確認してください。

また、既存の構成プロファイルが `com.google.Chrome` または `com.microsoft.Edge` を管理していないか確認します。同じ設定を複数プロファイルで競合させず、必要なら既存の管理元へFolta設定を統合してください。

登録トークンの有効期限は発行から90日です。期限内に未登録端末が残る場合は、新しいセットアップキットを取得します。

## 1. セットアップキットを準備する

Folta管理画面の左サイドメニューで、［端末］から［セットアップ］を開きます。

<Frame caption="左サイドメニューの［端末］にある［セットアップ］を選択します。">
  <img src="https://mintcdn.com/folta/rSS0uvnLXHE2zFHF/images/admin/setup-navigation-spotlight-v1.png?fit=max&auto=format&n=rSS0uvnLXHE2zFHF&q=85&s=cb86caaec88a8dcde9a7b8fb9ad8bfa6" alt="Folta管理画面の左サイドメニューで、端末配下のセットアップが選択されています。" width="1555" height="1012" data-path="images/admin/setup-navigation-spotlight-v1.png" />
</Frame>

「macOS」を選ぶと、macOS用セットアップキットのダウンロードボタンが表示されます。

<Frame className="docs-focus-frame docs-focus-frame--setup-download" caption="macOSを選択し、macOS用セットアップキットをダウンロードします。">
  <img src="https://mintcdn.com/folta/rSS0uvnLXHE2zFHF/images/admin/setup-macos-mdm-download-spotlight-v1.png?fit=max&auto=format&n=rSS0uvnLXHE2zFHF&q=85&s=72355918e3ddd58b0fbf82df38d47dfe" alt="Folta管理画面のセットアップ画面で、macOSタブと［macOS用をダウンロード］ボタンが表示されています。" width="1050" height="800" data-path="images/admin/setup-macos-mdm-download-spotlight-v1.png" />
</Frame>

<Info>
  ダウンロードには編集権限が必要です。ブラウザの配布設定が完了していない場合は、ダウンロードボタンが無効になります。
</Info>

1. ［macOS用をダウンロード］を押します。
2. ZIPを管理者Macで展開します。
3. `folta-mdm-mac.mobileconfig` を確認します。

`setup.sh` は利用者操作を伴う手動導入用です。Jamf Proからの無人配布には使用しません。

次のコマンドは、登録トークンなどの実値を表示せず、プロファイルの形式と4つの設定名だけを確認します。

```bash theme={null}
PROFILE="./folta-mdm-mac.mobileconfig"

/usr/bin/plutil -lint "$PROFILE"
/usr/libexec/PlistBuddy -c 'Print :PayloadDisplayName' "$PROFILE"
/usr/libexec/PlistBuddy -c 'Print :PayloadIdentifier' "$PROFILE"

for index in 0 1 2 3; do
  /usr/libexec/PlistBuddy \
    -c "Print :PayloadContent:${index}:PayloadDisplayName" \
    "$PROFILE"
done
```

4つの表示名が出ることを確認します。

```text theme={null}
Folta Chrome Forcelist
Folta Chrome Managed Storage
Folta Edge Forcelist
Folta Edge Managed Storage
```

## 2. Jamf Proへアップロードする

Jamf Proで次へ進みます。

```text theme={null}
Computers
→ Configuration Profiles
→ Upload
```

`folta-mdm-mac.mobileconfig` を選び、次のとおり設定します。

| 設定                  | 値                                               |
| ------------------- | ----------------------------------------------- |
| Level               | **Computer Level**                              |
| Distribution Method | **Install Automatically**                       |
| Scope               | 最初はテスト用Mac 1〜5台だけ。ChromeとEdgeの両方を同時に検証する場合は4台以下 |
| Exclusions          | 必要な除外端末を指定                                      |

Self Serviceではなく自動インストールを使います。利用者の操作を導入条件にしないためです。

## 3. プロファイルは署名せずに使う

Foltaのプロファイルは、対象Macへのインストール時にJamfが `$SERIALNUMBER`、`$COMPUTERNAME`、`$USERNAME` を置換できるよう、未署名のままアップロードします。

* 署名済みプロファイル：Jamfが内容を変更しないため、Jamf Payload Variablesを利用できない
* 未署名プロファイル：変数置換できるが、Jamfが認識できない設定を欠落・変換する可能性がある

未署名だから必ず設定が欠落するわけではありません。ただし、Jamfが認識できないPayloadTypeやkeyが含まれる場合、設定が欠落したり、意図どおりインストールされなかったりする可能性があります。アップロード時にunknown keyの警告が表示されても、`Remove unknown keys` は押さないでください。この削除は元に戻せません。次の再ダウンロード確認と実機パイロットの両方を行います。

構成プロファイルのCMS署名と、アプリやPKGのnotarizationは別の仕組みです。この手順ではPayload Variablesを利用するため、構成プロファイルを未署名でアップロードします。

## 4. Jamfから再ダウンロードして確認する

アップロード直後に、対象プロファイルをJamf ProからDownloadします。ここで確認するのはJamf Proに保存された配布テンプレートです。Jamf変数が端末ごとの実値へ置換されるのは、対象Macへインストールされる時点です。

```text theme={null}
Computers
→ Configuration Profiles
→ 対象プロファイル
→ Download
```

Jamfから取得したファイルに次が残っていることを確認します。

* PayloadContentが4件ある
* 4つの表示名が残っている
* `com.google.Chrome`
* `com.google.Chrome.extensions.<拡張機能ID>`
* `com.microsoft.Edge`
* `com.microsoft.Edge.extensions.<拡張機能ID>`
* `ExtensionInstallForcelist`
* `apiBaseUrl`
* `$SERIALNUMBER`、`$COMPUTERNAME`、`$USERNAME`
* ChromeとEdgeの登録トークンが同じ

元ファイルと再ダウンロードしたファイルは、UUIDやキー順序が変わる場合があります。ファイル全体の一致ではなく、4つの設定内容を比較してください。

登録トークンを比較するときは、値を画面へ表示したりチャットへ貼ったりせず、安全な管理者端末内でハッシュを比較します。次のコマンドはpayloadの固定順ではなく、表示名からChrome / Edgeの対象を探します。

```bash theme={null}
ORIGINAL="./folta-mdm-mac.mobileconfig"
JAMF_EXPORT="./jamf-downloaded.mobileconfig"
EXTENSION_ID="ここに拡張機能ID"

/usr/bin/plutil -lint "$ORIGINAL" && /usr/bin/plutil -lint "$JAMF_EXPORT"

payload_index() {
  file="$1"
  display_name="$2"
  for index in 0 1 2 3; do
    current=$(/usr/libexec/PlistBuddy \
      -c "Print :PayloadContent:${index}:PayloadDisplayName" \
      "$file" 2>/dev/null)
    if [ "$current" = "$display_name" ]; then
      printf '%s\n' "$index"
      return 0
    fi
  done
  return 1
}

token_hash() {
  file="$1"
  display_name="$2"
  domain="$3"
  index=$(payload_index "$file" "$display_name") || return 1
  /usr/libexec/PlistBuddy \
    -c "Print :PayloadContent:${index}:PayloadContent:${domain}:Forced:0:mcx_preference_settings:enrollmentToken" \
    "$file" | /usr/bin/shasum -a 256
}

for file in "$ORIGINAL" "$JAMF_EXPORT"; do
  printf '%s Chrome ' "$file"
  token_hash "$file" "Folta Chrome Managed Storage" \
    "com.google.Chrome.extensions.${EXTENSION_ID}"
  printf '%s Edge   ' "$file"
  token_hash "$file" "Folta Edge Managed Storage" \
    "com.microsoft.Edge.extensions.${EXTENSION_ID}"
done
```

4行のハッシュが同じであれば、元ファイル／Jamf保存後とChrome／Edgeの登録トークンが一致しています。実際のハッシュ値も外部へ共有しないでください。コマンドがpayloadを見つけられない場合も欠落として調査します。

## 5. 最初の1〜5台へ配布する

Scopeをテスト用Static GroupまたはSmart Groupだけに設定し、保存します。ChromeとEdgeの両方を同時に検証する場合は4台以下にします。

対象Macでプロファイルが配布されたら、Chrome / Edgeを完全終了して再起動します。ブラウザが起動してプロファイルを読むと、Foltaへの自己登録が行われます。

## 重要：一括配布せず、登録リクエスト数で分ける

現行Foltaは同じ登録トークンからの新規登録を**10リクエスト／5分**に制限しています。同一送信元IPにも**20リクエスト／5分**の制限があります。

ChromeとEdgeを両方起動すると、1台から最大2件の新規登録が発生します。現行拡張機能は429応答の `Retry-After` を使った定時再試行を行わないため、次を安全側の基準にします。

| 利用ブラウザ             |    1回の対象 |   次の配布まで |
| ------------------ | -------: | -------: |
| ChromeまたはEdgeの一方だけ |     8台以下 |     5分以上 |
| ChromeとEdgeの両方     | **4台以下** | **5分以上** |

最初は1〜5台、ChromeとEdgeの両方なら4台以下でパイロットし、その後もScopeを段階的に広げます。以下はJamf Proの仕様ではなく、Foltaの現行実装に基づく段階配布の目安です。

## 6. 正常導入を確認する

Jamfの `Completed` だけではFoltaの導入成功とは判断しません。次の3か所をすべて確認します。

### ① Jamf Pro / macOS

* Configuration Profile Statusが `Completed`
* 対象Macが現在もMDM管理下である
* Mac上に `jp.folta.mdm.<拡張機能ID>` のプロファイルがある
* 配布されたプロファイルに4つの設定が残っている
* Jamf変数が実値へ置換されている

MacのMDM登録状態とプロファイル識別子は次のように確認できます。

```bash theme={null}
/usr/bin/profiles status -type enrollment

sudo /usr/bin/profiles list -type configuration |
  /usr/bin/grep -F "jp.folta.mdm."
```

`profiles show` の全文には登録トークンが含まれる可能性があります。結果全文をサポートチケットやチャットへ貼らないでください。

Jamfの `Completed` は配布履歴です。端末が後からunmanagedになっても履歴が残る場合があるため、現在のMDM管理状態も必ず確認します。

macOS 11以降では `profiles` コマンドでプロファイルをインストールできません。`sudo profiles install ...` は使用せず、JamfのMDM配布を使います。

### ② Chrome / Edge

Chrome:

* `chrome://policy` で［Reload policies］を実行する
* `ExtensionInstallForcelist` のStatusが `OK`
* Sourceが `Platform`、Applies toが `Machine`
* `chrome://extensions` でFoltaが組織によって管理されている
* 利用者が拡張機能を無効化・削除できない

Edgeを利用する場合:

* `edge://policy` でポリシーを再読み込みする
* `ExtensionInstallForcelist` がエラーなしで表示される
* `edge://extensions` でFoltaが組織によって管理されている
* Folta管理画面への端末登録まで確認できる

Edge用Managed StorageのPreference Domainは現行Foltaが生成する設定ですが、Microsoft公式資料に同じ形式の明示を確認できていません。Edge対応は実機パイロットの必須項目です。

また、既存の `ExtensionSettings` が `ExtensionInstallForcelist` を上書きし得るため、Chrome / Edgeの既存ポリシーも確認してください。

### ③ Folta管理画面

* 端末一覧に対象Macが表示される
* Serial Number、Computer Name、Usernameが想定どおり
* BrowserがChromeまたはEdgeとして正しい
* テスト用ポリシーで検知・警告・ブロックが動作する
* 管理画面へログが届く

ここまで確認できて、初めて導入完了です。

## アップロード時に設定が欠落した場合

Jamf Proの `Application & Custom Settings` で、次の4つのPreference Domainを個別に登録します。

```text theme={null}
com.google.Chrome
com.google.Chrome.extensions.<拡張機能ID>
com.microsoft.Edge
com.microsoft.Edge.extensions.<拡張機能ID>
```

画面:

```text theme={null}
Computers
→ Configuration Profiles
→ New
→ General
→ Application & Custom Settings
→ Upload
```

各項目には、対象domainの設定キーだけをrootの `<dict>` に持つ通常のPLISTをアップロードします。元のmobileconfig全体や、外側の `com.apple.ManagedClient.preferences` wrapperをそのまま各項目へアップロードしません。Foltaの元プロファイルから4 domainを分け、もう一度1〜5台のScopeで検証します。実際の登録トークンを汎用マニュアルへ転記しないでください。

## 更新・緊急停止・撤去

トークン更新や設定変更を既存端末へ届ける場合、pilot後にJamfの配布対象を既存端末にも届く設定にします。`Distribute to Newly Assigned Devices Only` を選ぶと、既存対象端末へ更新が届きません。`Distribute to All` では旧profile削除後に新profileが入るため、一時的に設定が空く可能性を考慮して少数端末で先に確認します。

次のいずれかが発生したらScopeを広げず、次の配布を止めます。

* 4 payloadの欠落またはunknown keyの削除が見つかった
* Jamfは `Completed` だが、Mac上のprofile、ブラウザ、Foltaのどれかで確認できない
* Jamf変数が実値へ置換されない
* EdgeがManaged Storageを読めず、Foltaへ登録されない
* 429または既存ポリシーとの競合が発生した

Scopeから外した際にprofileが対象Macから削除されること、Chrome / Edgeの管理設定が消えることを、まずpilotで確認してください。プロファイル削除だけではFolta管理画面の端末登録が自動revokeされるとは扱わず、必要に応じてFolta側でも対象端末をrevokeします。

## トラブルシューティング

### JamfでPendingのままになる

* 対象MacのMDM登録とUser Approved状態を確認する
* Macがオンラインか確認する
* ScopeとExclusionsを確認する
* APNs / MDM commandの状態を確認する

### CompletedだがFoltaのポリシーが出ない

* Chrome / Edgeを完全終了して再起動する
* `chrome://policy` / `edge://policy` を確認する
* 再ダウンロードしたプロファイルに4つの設定があるか確認する
* 既存のChrome / Edgeプロファイルとの競合を確認する
* 拡張機能更新先とCRX配信先への通信を確認する

### Foltaには登録されたが端末名が不自然

`$SERIALNUMBER` などが置換されず、Folta拡張機能がランダムUUIDや生成名へフォールバックした可能性があります。Jamfから再ダウンロードしたプロファイルと、対象端末のJamf Inventoryを確認します。

### Usernameが想定と違う

Jamf ProのUser and Locationに関連付けられたユーザー名を確認します。現在ログイン中のローカルユーザー名とは限りません。

### 一部端末だけFoltaに登録されない

短時間に登録が集中して429になった可能性があります。最後の配布から5分以上空け、未登録端末だけを小さいScopeに分けて再確認します。すでに登録済みの端末まで無条件に再配布しないでください。

### Chromeは成功したがEdgeだけ登録されない

* `edge://policy` と `edge://extensions` を確認する
* EdgeのManaged Storageが実機で取得できるか確認する
* 既存のEdgeポリシーとの競合を確認する
* Edgeを正式対応に含める前に、Folta管理画面への登録とポリシー動作までmust-passにする

## やってはいけないこと

* `setup.sh` をJamf Policyから無人実行する
* Folta用PKGを作って配布する
* Jamf変数を使うプロファイルへ署名する
* アップロード後の内容確認をせず全社Scopeへ割り当てる
* unknown key警告で `Remove unknown keys` を押す
* Chrome / Edge両方を使う端末を5分以内に5台以上ずつ新規登録する
* Jamfの `Completed` だけで導入成功と判断する
* `profiles show` の全文、登録トークン、Managed Storageの認証情報を共有する
* `sudo profiles install ...` を使う

## 全社展開前チェック

* [ ] Jamf InventoryのComputer Name、Serial Number、Usernameを確認した
* [ ] 既存のChrome / Edgeプロファイルとの競合を確認した
* [ ] 元のmobileconfigに4つの設定がある
* [ ] Jamfから再ダウンロードして4つの設定を確認した
* [ ] 1〜5台でJamf / ブラウザ / Foltaの3層確認を完了した
* [ ] ChromeとEdgeを使う場合は両方で端末登録を確認した
* [ ] 配布単位と5分以上の間隔を決めた
* [ ] 429発生時の未登録端末だけを切り分けられる
* [ ] Apple Siliconで検証した
* [ ] Intel Macをサポートする場合はIntelでも検証した
* [ ] 緊急停止、Scope解除後のprofile削除、Folta側revokeをpilotで確認した

## 公式情報

* [Jamf Pro：macOS構成プロファイル](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Computer_Configuration_Profiles)
* [Jamf Pro：構成プロファイルのアップロード](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Uploading_a_Configuration_Profile_macOS)
* [Jamf Pro：Payload Variables](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Payload_Variables_for_macOS_Configuration_Profiles)
* [Jamf Pro：Application & Custom Settings](https://learn.jamf.com/r/en-US/technical-articles/Deploying_Custom_Computer_Configuration_Profiles_Using_the_Application_and_Custom_Settings_Payload)
* [Apple：構成プロファイルの競合を避ける](https://support.apple.com/guide/deployment/plan-your-configuration-profiles-dep9a318a393/web)
* [Chrome：ExtensionInstallForcelist](https://chromeenterprise.google/policies/extension-install-forcelist/)
* [Chrome：Managed Storage](https://developer.chrome.com/docs/extensions/reference/api/storage)
* [Microsoft Edge：ExtensionInstallForcelist](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies/extensioninstallforcelist)
* [Jamf Pro：構成プロファイルのStatus](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Viewing_the_Status_of_a_Configuration_Profile)
* [Jamf Pro：設定・Scope変更時の配布](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Editing_the_Settings_or_Scope_of_a_Configuration_Profile_macOS)
