ABM、Jamf Proを使ってゼロタッチキッティングする

# 概要
metapsではwindows、Mac共にintuneを使って自社の端末管理をしており、windows端末のみ部分的にキッティングの自動化をしていました。
ただ、割合としてはMac端末の利用率の方が高いため、Macのキッティングを自動化したいという課題がありゼロタッチキッティングの検証をしてみました。

# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/1345293b-2ce1-5413-93c0-b66cede2e3e4.png)

* ABM(Apple Business Manager)
    * Apple製品を会社組織で管理するためのツールです。ABM上でMDMとしてJamf PROを紐付けることで、会社のMacに対して設定配布やアプリのインストールができます。
* Jamf Pro（Moblie Device Management)
    * Apple製品の端末を一元管理するツールです。端末の利用開始から終了まで設定配布や状況の可視化ができます。
* DEP　Notify
    * Jamf Proに登録して使う、設定を順番通り実行できるツールです。スクリプトで会社で必要なアプリのインストールなどを指定することで、初回起動時にインストール状況を可視化することができます。
* Installmeter
    * 最新バーションのアプリをインストール・アップデートするために使う[スクリプト](https://github.com/scriptingosx/Installomator)です。本来Jamf Proでインストールするアプリは個々にpkgファイルを作成してアップロードする必要がありますが、バージョン管理する上で課題があります。Installmeterを使うことで端末に常に最新のバージョンを指定してインストールできます。

# キッティング時の様子
端末を起動し、ローカルアカウントを追加してログインすると、以下のような会社のロゴ入りのウィンドウが表示されてキッティングがスタートし、プログレスバーを表示させることができます。
![IMG_4323.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/3ea920b9-faaf-7a85-dc5c-dcc6470ca4eb.jpeg)

# 手順
## ABM
D-U-N-S Numberなどの会社情報を確認し、ABMアカウントを作成します。アカウント作成後、端末をABMに自動で紐づけるためにはADE（Automated Device Enrollment）登録が必要となるので販売会社を登録します。
端末をリースで調達している場合は、調達方法を変更する必要があるので事前にADEが可能か確認が必要です。

開設後はABMでJamf ProをMDMとして登録するために、証明書をアップロードします。
[Apple Push Certificats Portal](https://identity.apple.com/pushcert/)にて、Jamf Accountで作成した署名済証明書署名要求(CSR)をアップロードします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/298a520a-3b53-c6c8-6dfa-4319d4b3204a.png" width=70%>

Apple Push Certificats Portalでプッシュ証明書(.pem)を作成してダウンロードし、今度はJamf Accountにアップロードします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/74adaf86-1b43-3ede-d722-d7a8eb6090d7.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/17599e85-cab8-4431-2540-160164b2fc01.png" width=70%>

ABM側でMDMサーバの設定を追加し、Jamf Proで作成した公開鍵をアップロードします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/75863d61-6e1f-8562-48a2-78aaa135c02b.png" width=70%>

アップロードが完了すると、ABMとJamf PROを紐づけできます。

## Jamf Pro関連
### Composer
pkgファイルを作成するためのツールとなります。
今回はDEP Notifyで表示させる会社のロゴをpkg化するために利用します。

Jamf accountから[ツール一式をダウンロード](https://account.jamf.com/products/jamf-pro/download)して解凍し、composerを起動します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/065df4e2-4d5d-528c-e852-fd42a6f01476.png" width=70%>

例として、端末の`private/tmp/`配下に会社のロゴのpngファイルを展開するだけのpkgを作成します。
ロゴのファイルを配置してComposerにドラッグ&ドロップし、DEP　Notifyで実行できるようにOwnerはroot、Groupはwheel、Xにチェックをして`Build as PKG`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/abc9ad15-20a3-88c9-a1a9-fe787528d7a9.png)

pkgファイルが作成できたら、Jamf Proにパッケージとしてアップロードします。

### Prestage Enrollmentの作成
端末をJamf Proに登録するための設定をPrestageEnrollmentで行います。ローカルの管理アカウント作成（メンテナンス用途など）など、初期起動時に指定したい設定をしておきます。

### Smart Computer Groupsの作成
自動登録される端末を管理するために、ADE_macのような名前でグループを作成します。クライテリアとして`Enrollment Method: PreStage enrollment　is {PreStage enrollment名}`と設定しておくと、PreStage enrollmentで登録する端末をグループとして管理できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/7da7ad35-bbd8-4811-896c-2c45b1117abd.png" width=90%>

### scriptの作成

#### Rosetta２
端末にM1 Macがありintel用のアプリをインストールする必要がある場合、Rosetta２をインストールするスクリプトを作成します。
このスクリプトはDEP Notifyの起動より先にインストールする必要があるので01_rossetaのような名前で登録します。
```
sudo softwareupdate --install-rosetta　--agree-to-license
```

#### DEPNotirfy
DEPNotify.pkgとDEPNotify.shを[ダウンロード](https://gitlab.com/Mactroll/DEPNotify)し、pkgはそのままJamf Proにパッケージとしてアップロードします。DEPNotify.shは以下のようにキッティング中に表示させたい内容やアプリに応じて変数を指定してからスクリプトとしてアップロードします。
この内容がキッティング時に表示されます。

```
~一部抜粋~

BANNER_IMAGE_PATH="/private/tmp/company_logo.png"　
ORG_NAME="会社名"
BANNER_TITLE="Welcome to $ORG_NAME"
SUPPORT_CONTACT_DETAILS="問い合わせ先アドレス"
MAIN_TEXT='新しいMacを使い始める前に、いくつかのアプリケーションと設定を自動で行います。この作業は10分から20分ほどかかる予定です。'

INITAL_START_STATUS="設定を開始します。"
INSTALL_COMPLETE_TEXT="設定が完了しました！"

POLICY_ARRAY=(
    "Installing Adobe Reader,adobeReader"
    "Installing Chrome,chrome"
    "Installing Zoom,zoom"
    "Installing Slack,slack"
    "Installing Micorosoft Office,office"
  )
```
POLICY_ARRAYは"インストール中に表示する文章,ポリシーで指定するカスタムトリガー名"になります。

### Installomator
[Installomator.shをダウンロード](https://github.com/scriptingosx/Installomator)し、`DEBUG=1`項目を`DEBUG=0`にしてJamf Proにスクリプトとしてアップロードします。
そして、後述するポリシーのパラメータとして指定するためのアプリの名前を検索して控えておきます。
例えば、Adobe readerの場合は(2022年末現在)`adobereaderdc-install`となります。

```
~一部抜粋~
adobereaderdc-install)
    name="Adobe Acrobat Reader DC"
    type="pkgInDmg"
    printlog "Changing IFS for Adobe Reader" INFO
```

### policyの作成
DEP Notifyを会社ロゴを表示させて実行するために、0_logo、1_DEPNotifyのようにプレフィックスをつけて順番を指定するポリシーを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/ff435d35-bdb4-79a3-a98d-e45935399892.png" width=80%>
頻度はongoing、トリガーはEnrollmentとします。

その他必要なアプリは、installmeterをスクリプトとして登録し、application Lebelsにパラメータとしてアプリ名を入力します。
トリガーにはカスタムトリガーを指定し、DEP NotifyのPOLICY_ARRAYの値と紐付けます。

Adobe readerの場合は以下の通りです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/493a6a0f-2f8b-292b-359b-892c0edd0975.png" width=80%>

必要なアプリの数だけ同じくポリシーを作成します。スコープはSmart Computer Groupsで作成したグループとします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/19672a0e-d4a9-9dbd-6c94-acdab98ea68b.png" width=80%>

ここまで設定して実際に端末を起動すると、キッティングが自動で開始されます。

## ハマった点
全て設定した後に、初回ログイン後にキッティングが開始されず何も起きないという事象が起きました。
確認したところ、Jamf Proにアップロードに成功したはずDEP Notify.pkgがクラウド配布ポイントに無いということがありました。(https://テナント名.jamfcloud.com/cloudDistributionPoint.html)

アップロードし直したところ、初回ログイン後に正常にDEPNotifyが開始され、アプリのインストールに成功しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/f5dea73c-4990-3f9f-d281-16cf77bf9971.png" width=80%>

# 結果
ローカルアカウントの作成方法などはマニュアルが必要ですが、ゼロタッチキッティングが出来ることを確認しました。

# 参考にした記事

https://qiita.com/soh19/items/b28537a71e46038934a8
https://note.com/yasuym1/n/n8770a9b42a1c
https://zenn.dev/coconala/articles/8afdb1bf838601
https://dev.classmethod.jp/articles/jamf_dep-notify_configuration/
https://atraetech.hatenablog.com/entry/2021/08/23/102749