概要

Jamfを使っていて、個別のパッケージをアップデートするのに、installomaterというスクリプトが便利であることを数ヶ月前に実施したJamfのJumpStartで教えていただきました。

https://github.com/Installomator/Installomator

いままではAppStore or アップデータのファイルをアップロードし直したり、自動更新におまかせしていたりしたのですが、そろそろ制御もしたほうが良さそうとなり、本スクリプトに力を借りることにしました。

設定自体は下記サイトを参考に実施すればすんなりいきます。

Jamf ProとInstallomatorで常に最新のアプリケーションを配布する

が、インストールが失敗。
ログを見た所こんなエラー。

$ tail -f /var/log/Installomator.log
2021-07-26 13:52:26 zoomclient Downloading https://zoom.us/client/latest/Zoom.pkg to zoom.us.pkg
2021-07-26 13:52:33 zoomclient no more blocking processes, continue with update
2021-07-26 13:52:33 zoomclient Installing zoom.us
2021-07-26 13:52:33 zoomclient Verifying: zoom.us.pkg
2021-07-26 13:52:33 zoomclient Error verifying zoom.us.pkg
2021-07-26 13:52:33 zoomclient Deleting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.iVvoqo5E
2021-07-26 13:52:33 zoomclient App not closed, so no reopen.
2021-07-26 13:52:33 zoomclient ################## End Installomator, exit code 4

このエラーを解消するためにあれこれやったことをメモしておきます。

原因調査

ログを見る限りは2021-07-26 13:52:33 zoomclient Error verifying zoom.us.pkgとあるので、パッケージファイルの検証で死んでいる模様でした。
コケている箇所をしらべたところ、どうやら下記のコマンド実行でコケている様子。

https://github.com/Installomator/Installomator/blob/dev/Installomator.sh#L604-L607

    if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then
        printlog "Error verifying $archiveName"
        cleanupAndExit 4
    fi

spctlコマンドで調べると、どうやらGatekeeperというセキュリティ機能に付随するコマンドのようで失敗しているようです。

https://ja.wikipedia.org/wiki/Gatekeeper_(macOS)

Gatekeeper (ゲートキーパー)は、 macOSに備わったセキュリティ機能である[1][2]。コード署名を利用して、ダウンロードされたアプリケーションを実行する前に検証し、マルウェアを不注意に実行してしまう可能性を減らす。 Gatekeeperは、ファイル検疫に基づく。ファイル検疫機能は、Mac OS X Leopardで導入され、Mac OS X Snow Leopardで拡張された[3][4]。この機能は、最初にMac OS X Lionのバージョン10.7.3でコマンドラインユーティリティ spctlとして作られた[5][6]。グラフィカルユーザーインターフェイスがMac OS X Lion v10.7.5で追加された[7]。

GUIでアプリケーションのインストールをしようとした際にでるアレです。(下図)

GUIなら右クリックのコンテキストに開くが追加されますが、spctlではそうもいかない模様。
確かにセキュリティの設定上、下記のように設定していて、zoomのアプリケーションが検証できない(未登録ということでしょうか)状態で、spctlコマンドが失敗している様でした。

実際にCLIで状態を確認することができます。

$ spctl --status
assessments enabled

そして、有効、無効もsudo実行すれば簡単に可能です。

$ sudo spctl --master-disable
assessments disabled
$ sudo spctl --master-enable
assessments enabled

全開放するのは躊躇するのと、下記を見る限り有効にしないとアップデータが失敗する事例もあるとのことだったので、ただ単にdisabledにすれば良いというものでは無いということがわかりました。

https://applech2.com/archives/20190701-macos-catalina-can-still-open-anyway.html

Jamfの設定

そこで、少し複雑になりましたが、スクリプト実行時にのみdisabledになれば良いと判断し下記のように設定しました。
まず、disable_master_spctlという名前でスクリプトを登録します。
スクリプトの中身は下記のみ。

#!/bin/bash

spctl --master-disable

そして、installomaterを実行するポリシーにこのスクリプトを追加し、beforeとします。

installomaterはAfterとします。

そして、最後に Files and Processersspctl --master-enableを追加します。※sudo実行なのでsudoはつけなくても良さそう。

こうすることで、最初にdisableして、installomaterを実行し、最後にenableにするという風に実行できます。

結果

ログは下記のようになり、成功しました。

2021-07-26 14:44:07 zoomclient ################## Start Installomator v. 0.6.0
2021-07-26 14:44:07 zoomclient ################## zoomclient
2021-07-26 14:44:07 zoomclient BLOCKING_PROCESS_ACTION=prompt_user
2021-07-26 14:44:07 zoomclient NOTIFY=success
2021-07-26 14:44:07 zoomclient LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2021-07-26 14:44:07 zoomclient Changing directory to /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.HFCP73Ho
2021-07-26 14:44:07 zoomclient found packageID us.zoom.pkg.videmeeting installed, version 5.4.59780.1220
2021-07-26 14:44:07 zoomclient appversion: 5.4.59780.1220
2021-07-26 14:44:07 zoomclient Latest version not specified.
2021-07-26 14:44:07 zoomclient Downloading https://zoom.us/client/latest/Zoom.pkg to zoom.us.pkg
2021-07-26 14:44:10 zoomclient found blocking process zoom.us
2021-07-26 14:44:14 zoomclient telling app zoom.us to quit
2021-07-26 14:44:14 zoomclient waiting 30 seconds for processes to quit
2021-07-26 14:44:44 zoomclient no more blocking processes, continue with update
2021-07-26 14:44:44 zoomclient Installing zoom.us
2021-07-26 14:44:44 zoomclient Verifying: zoom.us.pkg
2021-07-26 14:44:44 zoomclient Team ID: BJ4HAAB9B3 (expected: BJ4HAAB9B3 )
2021-07-26 14:44:44 zoomclient Checking package version.
2021-07-26 14:44:44 zoomclient Downloaded package us.zoom.pkg.videmeeting version
2021-07-26 14:44:44 zoomclient Installing zoom.us.pkg to /
2021-07-26 14:44:50 zoomclient Finishing…
2021-07-26 14:45:01 zoomclient found packageID us.zoom.pkg.videmeeting installed, version 5.4.59780.1220
2021-07-26 14:45:01 zoomclient Installed zoom.us, version 5.4.59780.1220
2021-07-26 14:45:01 zoomclient notifying
2021-07-26 14:45:01 zoomclient Deleting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.HFCP73Ho
2021-07-26 14:45:01 zoomclient Telling app zoom.us.app to open
2021-07-26 14:45:01 zoomclient Reopened zoom.us.app as inamuu
2021-07-26 14:45:01 zoomclient ################## End Installomator, exit code 0

watch -d spctl --statusで監視しながら、SelfServiceで試した所見事、順番通りに実行してくれました。

感想

いままで雰囲気でJamfを使ってきたところがありますが、少し応用的なことができたので良かったかなと思います。
そもそも、disableとenableの実行方法が別というのがちょっと微妙なので、別のスクリプトにするのがいいのか悩ましいのですが、スクリプトの実行がbeforeとafterの制御のみだったのと、あとはアルファベットソートができる可能性はありましたが、アルファベットソートはわかりにくいのでこのような実装になりました。
もし本ブログを見て、もっとこうしたほうが楽だよとかありましたら、教えていただけると嬉しいです。

カテゴリー: JamfMac