Mac-アプリケーションの配布(署名なしPKG)

### はじめに...

調査した内容を時系列にまとめた資料なので、その点ご了承ください。

## 目次

1. 実行環境
1. 実現したいこと
1. 概要
1. barrierアプリの入手
1. barrierアプリの変換
1. barrierアプリをwebサーバへ配置
1. [参考]スクリプト
1. barrierアプリ配信用スクリプトの配置
1. まとめ
1. 参考資料

--------

### 1. 実行環境

|  項目  |  情報 |
| ---- | ---- |
|  OS  |  macOS 11.3.1  |
|  HW  |  MacBook Air (11-inch, Mid 2013)   |
|  MDM環境  |  microsoft intune  |

### 2. 実現したいこと

**最終目標**

- GUIの操作なしにmacのセットアップが行える環境を整備したい
― ※ただし、ユーザが選択する部分を除く


**今回の目標**

- intuneに参加しているmac端末に署名されたpkg以外のアプリを配布したい

### 3. 概要

intuneでmacOSのアプリを配信するには、署名されたpkgファイルを使う必要がある。しかし、署名されたpkgがない場合には、ライセンス上署名なしに配信する必要がある。

今回は、テストとしてsynergyからフォークした、barrierというアプリを配信する。

また、dmgがマウントできない(デバイス制御されている)環境も考慮し、dmg形式を署名なしpkg形式に変換し、変換したファイルをローカルのwebサーバに配置/配布する。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0575

### 4. barrierアプリの入手

barrierは、以下githubから入手する。

https://github.com/debauchee/barrier/releases

### 5.  barrierアプリの変換

4.で取得したファイルを署名なしのpkg形式に変換し、最後にzip圧縮しておく。
※dmgからpkgへの変換手順は、Microsoft社の手順を参考

example)
> hdiutil attach  _< app.dmg >_
​ pkgbuild --install-location /Applications --component /Volumes/_< appname >_/_< appname >_.app _< pkgname_1 >_.pkg
> productbuild --synthesize --package _< pkgname_1 >_.pkg _< distribution >_.xml
​productbuild --distribution _< distribution >_.xml --package-path _< pkgname_1 >_.pkg _< pkgname_2 >_.pkg​ 
> hdiutil detach /Volumes/_< appname >_
​ cp _< pkgname_2 >_.pkg​ _< pkgname >_.pkg​
> zip _< pkgname >_.zip _< pkgname >_.pkg  


```console
mkdir ~/barrier
cp ~/Downloads/Barrier-2.3.3-release.dmg ~/barrier
hdiutil attach ~/barrier/Barrier-2.3.3-release.dmg
pkgbuild --install-location /Applications --component /Volumes/Barrier/Barrier.app ~/barrier/barrier_1.pkg
productbuild --synthesize --package ~/barrier/barrier_1.pkg ~/barrier/distribution.xml​ productbuild --distribution ~/barrier/distribution.xml​ --package-path ~/barrier/barrier_1.pkg ~/barrier/barrier_2.pkg 
Cp ~/barrier/barrier_2.pkg ~/barrier/barrier.pkg
zip ~/barrier/barrier.zip ~/barrier/barrier.pkg
```

### 6.  barrierアプリをwebサーバへ配置

今回はテストのため、localhostにファイルを配置する

http://127.0.0.1:8080/barrier.zip

### 7.  [参考]スクリプト

参考にスクリプトを添付する。実装した機能としては
・Mac端末からサーバにアクセスできるかチェック
・アプリがインストール済みであるかの判定
・ファイルのダウンロード
・ダウンロードしたファイルのshaによるチェック
・アプリのインストール

<details><summary>スクリプト本体</summary><div>


```console
#!/bin/bash

SHA="4a066d7004417dc7ec65d2bcf428af59c6645740"
SERVER_FQDN="localhost"
SERVER_IP="127.0.0.1"
BARRIER_APP="/Applications/Barrier.app"
DOWNLOAD_PKG_URL="http://${SERVER_FQDN}:8080/barrier.zip"
PKG_FILE=/tmp/barrier.pkg
ZIP_FILE=/tmp/barrier.zip

#
# check location
echo "0000 -- check location"
nslookup ${SERVER_FQDN} | grep ${SERVER_IP} 2>&1
if [ $? -eq 0 ]; then
  echo "location check is success"
else
  echo "location check is not success"
  exit 1
fi

#
# barrier install check
echo "0001 -- barrier install check"
if [ -d "$BARRIER_APP" ]; then
  echo "barrier is installed"
  exit 0
else
  echo "barrier is not installed"
fi

#
# download 
echo "0002 --  download pkg file"
curl -fsSL ${DOWNLOAD_PKG_URL} -o ${ZIP_FILE}

#
# check sha
echo "003 -- check sha1"
SHA_CALC="$(shasum ${ZIP_FILE} | cut -d " " -f 1)"

echo "SHA      : ${SHA}"
echo "SHA_CALC : ${SHA_CALC}"

if [ "$SHA" = "$SHA_CALC" ]; then
  echo "download succeeded"
else
  echo "download error re-try"
  curl -fsSL ${DOWNLOAD_PKG_URL} -o ${PKG_FILE}
  SHA_CALC="$(shasum ${ZIP_FILE} | cut -d " " -f 1)"
  if [ "$SHA" = "$SHA_CALC" ]; then
    echo "download succeeded(2)"
  else
    echo "download error(2) stop it"
    exit 1
  fi
fi

#
# unzip pkg file
unzip -B ${ZIP_FILE} -d /tmp

#
# install barrier
echo "005 -- install pkg"
sudo installer -pkg ${PKG_FILE} -target /Applications 

if [ $? -eq 0 ]; then
  echo "install succeeded"
  exit 0
else
  echo "install error"
  exit 1
fi

```


</div></details>


### 8.  barrierアプリ配信用スクリプトの配置

Microsoft Endpoint Manager Admin Centerにログインし、
デバイス > macOS > シェルスクリプトを開き、追加ボタンをクリック

![barrier-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461335/4ba6efd4-f447-0a90-8a56-fa4267121d9d.png)

今回は、以下のようにポリシーを作成/適用。

![barrier-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461335/c028d5a3-5494-97ce-8eaa-5c8ef1866cd2.png)


### 9.  まとめ
- dmg形式以外のファイルを配布することができた
- スクリプトについて必要最低限の機能を実装したが、必要に応じて、追加機能が必要と思われる
- 注意-ファイルのダウンロード元をlocalhostと指定しているため、実行タイミングによっては、エラーになることがあるため、注意が必要

### 10.  参考資料

https://techcommunity.microsoft.com/t5/intune-customer-success/how-to-deploy-dmg-or-app-format-apps-to-intune-managed-macs/ba-p/1503416

https://techcommunity.microsoft.com/t5/intune-customer-success/deploying-macos-apps-with-the-intune-scripting-agent/ba-p/2298072