くらめその情シス:IntuneでMacにシェルスクリプトでアプリをインストール

2020.07.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

どうも、情シスの徳道です。

前回の記事、MacOSでのIntuneアプリ登録で社内標準ソフトのうち、実は1本が入っていない状態でした。

Windows編から見ていると気付いた方もいるかと思いますが、ESET Securtity Management Center エージェントです。今回の記事ではこのアプリのインストールについて紹介させていただきます。

【この記事の目的】

PCサポートでMacマシンの標準インストールとするアプリのうち、.pkgファイルで配布されないものを設定をします。

  • ESET Security Management Center エージェント
  • Google Chromeブラウザ

※Chromeブラウザについては、.pkg版もあるのですが、Webからダウンロードしてインストール方法について題材として取り上げました。

【ご注意ください】

このシリーズでは以下の条件を満たしAzureを既に利用できていることが前提になっています。

  • Office365などでAzureでライセンス管理が利用可能であること
  • AzureADにユーザー、グループ情報があること(AzureAD Connector連携含む)
  • Azureのグローバル管理者アカウントの権限を持っていること

シェルスクリプトでインストールするアプリについて

業務用アプリはどのようなものでも.pkgファイルが提供されているわけではありませんし、インストール時に付加情報が必要なものもあります。

今回の弊社標準アプリであればESET Security Management Center Agent(以下、ESMCエージェント)が該当します。

Windows版ではAllinOneパッケージを管理サーバで作成することでWin32アプリとしてインストールすることができましたが、こちらはシェルスクリプトで管理サーバから設定とパッケージをダウンロードしてインストールするタイプです。

結論から書きますと、Intuneではシェルスクリプトを登録することでサーバからファイルをダウンロードし、インストールを実行することができます。

実行可能なものにはいくつか条件があります。

  1. インストールファイルがネットワークのサーバ上に展開され、curlコマンドなどでダウンロードできること
  2. サイレントインストールができること(GUIによる対話的インストールが必須のアプリはうまくいかない可能性があります)
  3. シェルスクリプトで既存インストールがされているなどの条件をハンドリングできること

今回の題材としている2つのアプリは1、2の条件をクリアできそうだったので3は簡易な方法でインストール済みであることを検出することにしました。

アプリインストール用のシェルスクリプトを準備(ESMCエージェント)

利用するシェルスクリプトをチェック

まず従来セットアップで利用しているESMCエージェントインストーラーをのぞいてみます(結構長いシェルスクリプトのため、詳細は割愛)。

確認点は以下のポイントです。

  • 他のシェルスクリプトを呼び出していたり、再帰的に実行されていないこと
  • パッケージのダウンロードに特殊なコマンドやプロトコルを使っていないこと
  • ユーザーとの対話操作がない、または削っても問題ないこと
  • 管理サーバ接続のユニーク情報が含まれる
  • 特定環境に依存したものがないこと

【サンプルスクリプト】

#!/bin/sh -e
# ESET Security Management Center
# Copyright (c) 1992-2018 ESET, spol. s r.o. All Rights Reserved
set +e
~中略~
eraa_server_hostname="xxxxxxxx.classmethod.jp" 
eraa_server_port="xxxxxx"
eraa_peer_cert_b64="エンコードされた情報"
eraa_peer_cert_pwd="暗号化された情報"
eraa_ca_cert_b64="エンコードされた情報"
eraa_product_uuid=""

↑ 管理サーバへのURL、接続の情報

arch=$(uname -m)
if $(echo "$arch" | grep -E "^(x86_64|amd64)$" 2>&1 /dev/null)
then
eraa_installer_url="http://repository.eset.com/v1/com/eset/apps/business/era/agent/v7/7.0.448.0/agent_macosx_x86_64.dmg"
eraa_installer_checksum="xxxxxxxxxxxxxxxxxxxxxxxx"
fi

↑ ダウンロードサーバ接続の情報

echo "Downloading installer image '$eraa_installer_url':"

eraa_http_proxy_value=""
if test -n "$eraa_http_proxy_value"
then
export use_proxy=yes
export http_proxy="$eraa_http_proxy_value"
(curl --connect-timeout 300 --insecure -o "$local_dmg" "$eraa_installer_url" || curl --connect-timeout 300 --noproxy "*" --insecure -o "$local_dmg" "$eraa_installer_url") && echo "$local_dmg" >> "$files2del"
else
curl --connect-timeout 300 --insecure -o "$local_dmg" "$eraa_installer_url" && echo "$local_dmg" >> "$files2del"
fi

↑ダウンロードはcurl(OS標準コマンド)

local_mount="$(mktemp -q -d /tmp/EraAgentOnlineInstaller.mount.XXXXXXXX)" && echo "$local_mount" | tee "$dirs2del" >> "$dirs2umount"
echo "Mounting image '$local_dmg':" && sudo -S hdiutil attach "$local_dmg" -mountpoint "$local_mount" -nobrowse

local_pkg="$(ls "$local_mount" | grep "\.pkg$" | head -n 1)"

echo "Installing package '$local_mount/$local_pkg':" && sudo -S installer -pkg "$local_mount/$local_pkg" -target /

↑インストーラーをキック

幸いにもユーザーと対話的操作を求めるものはありませんでした。アプリのダウンロード、インストール、管理サーバ接続に必要な情報が1つのシェルスクリプトに集約されている形です。

ざっと見たところ、ダウンロード・インストール処理そのものに問題はなさそうです。

複数回実行を抑制する

実は一つだけシェルスクリプト側で解決しておくべき問題があります。

IntuneのMacOSシェルスクリプトの実行動作は、Cronのように一定の時間指定で繰り返し行われます。これではインストーラーがバックエンドで何度も実行されることになりかねず、無用のトラブルになりかねません。

簡単な回避策として、すでにアプリがインストール済みであることをチェックして、インストール済みであればスキップする処理を追加してみました。

【サンプルコード】

#Check Installed ESMC Agent
ls "/Applications/ESET Remote Administrator Agent.app/Contents/Info.plist"
if [ $? -eq 0 ]; then
exit 0
fi
#Check Section End

やってることは至極単純でして、MacOSのアプリ領域にあるInfo.plistの有無をチェックしているだけです。バージョンのチェックで上書きさせたい、というような場合はアプリの情報を取得して条件付けをすれば可能だと思います。

このアプリの場合はサーバからのタスク指示でバージョンアップできるので、ひとまずIntuneのインストールスクリプトの多重起動を抑制できればいい、ということになります。

アプリインストール用のシェルスクリプトを準備(GoogleChromeブラウザ)

インストールパッケージをチェック

さて、もう一つのアプリ、GoogleChromeブラウザ用のシェルスクリプトの準備をします。

題材としてChromeブラウザを選んだのは、以下の条件のアプリのインストールサンプルとしてです。

  • ダウンロードサイトがある
  • .dmgファイル内に.pkgが含まれていない

即ちpkgファイルが存在しないアプリの場合でも、.dmgなどでダウンロードサイトを準備できればIntuneで自動インストールできる可能性がある、ということですね。

Chromeブラウザのインストール方法をチェック

Chromeブラウザは.dmgファイルで提供されています。前回の記事:dmgファイルから.pkgファイルを取り出す と同じく.dmgファイルをマウントして中身を見てみます。

GUIでのインストールはChromeブラウザのアイコンをアプリフォルダにドラッグすることでインストールされますね。

ではマウントされたボリュームをターミナルで見てみましょう。

>cd "Volumes/Google Chrome"
>ls -l
total 4
lrwxr-xr-x@ 1 tokumichi.keiichi staff 13 6 2 10:24 -> /Applications
drwxr-xr-x@ 3 tokumichi.keiichi staff 102 6 2 09:39 Google Chrome.app

>ls "Google Chrome.app"/
Contents
>ls "Google Chrome.app/Contents/"
CodeResources    PkgInfo
Frameworks      Resources
Info.plist      _CodeSignature
MacOS           embedded.provisionprofile

構造は/Applications ディレクトリの内容がそのままになっています。ならばこれをそのままコピーすればインストールされるはずですね。

sudo cp -r "/Volumes/Google Chrome/Google Chrome.app" /Applications/

単純にこれでイケました。。

インストール用のシェルスクリプトを作成する

ではシェルスクリプトを作っていきましょう。

含める処理は以下となります。

  1. Chromeブラウザがインストール済みかチェック
  2. dmgパッケージファイルをダウンロード
  3. dmgパッケージファイルをマウント
  4. /Applicationsにコピー
  5. dmgパッケージファイルをアンマウント
  6. cpコマンドの戻り値0で終了

【サンプルコード】

#!/bin/sh
#GoogleChrome CommandLine Download & Installer by Classmethod

#Check Installed GoogleChrome
ls "/Applications/Google Chrome.app/Contents/Info.plist"
if [ $? -eq 0 ]; then
exit 0
fi
#Check Section End

#Make Download Directory

mkdir /Users/Shared/GoogleChromePkg
cd /Users/Shared/GoogleChromePkg

#Download Google Chrome
curl -O https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg

#Install Google Chrome
hdiutil mount googlechrome.dmg -nobrowse
sudo cp -r "/Volumes/Google Chrome/Google Chrome.app" /Applications/

returncode=$?

hdiutil detach "/Volumes/Google Chorme"

exit $returncode

 

これで準備はOKです!

Intuneにシェルスクリプトを登録

ではIntuneに登録していきましょう。

Microsoft Endpoint Manager admin center にログオンし、「デバイス」→「MacOS」→「シェル スクリプト」と進みます。

シェルスクリプトの追加と設定

上メニューの「追加」をクリックします。まずは名前の設定から。

スクリプト設定では先ほど準備したシェルスクリプトファイルを指定します。

アプリのインストールに使うため、「サインインしたユーザーとしてスクリプトを実行」では「いいえ」を指定しておきます。これでroot権限で実行されるようになります。

「デバイスでスクリプトの通知を非表示にする」は「はい」にしておきましょう。構成しておかないとスクリプトが実行されるたびに通知領域にメッセージが出てしまいます。

スクリプトの頻度は設定できる最短の「15分ごと」としておきました。インストール作業の時間に余裕があればもっと頻度を下げてもいいかもしれません。

失敗した場合の再試行回数も1~3回を選択できますが、ここでは1回だけにしました。

グループの割当

グループ割り当てを行います。こちらもMacOSでのアプリインストール同様、デバイスグループを指定するほうが安定動作するようです。

他の設定同様に最後に内容を確認して作成します。

実行結果の確認

実機でアプリがインストールが実行されることを確認しましょう。

15分に1回、シェルスクリプトが実行されるのでマシンを起動したままにします。複数アプリを設定している場合は最後のアプリがインストールされるまで待ちましょう。

Endpoint Manager admin centerのシェル スクリプトのモニターでも成功か失敗か結果を確認することができます。

さいごに

ちょっとしたシェルスクリプトを記述することで正式にIntuneがサポートしてないアプリや自作プログラムを自動追加できるようになります。

なお、MacOS Catalina以降は開発者署名と公証がないアプリはマルウェアとみなされるようなので、どんなものでも入れられるわけではないことにご注意ください。

.pkgファイルを作成できれば一番いいのですが、こうした方法も可能です、ということですね。

それではまた次の記事でお会いしましょう。

AzureAD&Intuneに関するまとめ記事

AzureAD&Intuneに関して、以下リンクから参照できます。

くらめその情シス:AzureADとIntuneを使ってPC管理を効率化してみた