macOS Sierraとビルドアプリケーションの配付について

前のトピックを表示 次のトピックを表示 Go down

macOS Sierraとビルドアプリケーションの配付について

投稿 by miyako on 2016-11-16, 2:51 pm

mac OS 10.12 Sierraでは,GateKeeperの監視が強化され,ZIP圧縮したアプリケーションをインターネット(ブラウザ・メール・AirDropなど)経由で配付することに対する新しい制限が課せられるようになりました。

具体的には,そのようなアプリケーションを展開した後,ドラッグ&ドロップ操作で「アプリケーション」フォルダー内にユーザーがインストールしたのでない限り「どこだかわからない場所に移されて」「書き込み禁止の条件で」アプリケーションが起動されます。

これは,相対パスを悪用して,プログラムが勝手にシステムを書き換えることを防止するための措置だそうです。

"Starting with macOS Sierra, running a newly-downloaded app from a disk image, archive, or the Downloads directory will cause Gatekeeper to isolate that app at a unspecified read-only location in the filesystem. This will prevent the app from accessing code or content using relative paths."

https://developer.apple.com/library/content/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG17

注記:引用したAppleのテクニカルノートは「署名付き」のアプリケーションに言及したものですが,署名されていないアプリケーションも同じ措置が取られます。

そのようなわけで「相対パス」を使用していたり「データベースフォルダー内での読み書き」をするようなアプリケーションは,ローカルではうまく動作しても,ZIP圧縮して配付したユーザーの環境では正しく動作しないことが予想されます。

前述したように,これは展開したアプリケーションをドラッグ&ドロップ操作で「アプリケーション」フォルダー内に移動(インストール)することで回避することができます。

検疫との違い

アプリケーションを圧縮ファイルやディスクイメージに収録し,インターネット経由で配付した場合,最初の起動で「...はインターネットからダウンロードされたアプリケーションです。開いてもよろしいですか?」というダイアログが表示されます。これは,Appleの「検疫」拡張ファイル属性 (com.apple.quarantine) によるものです。

参考:下記のコマンドで「検疫」フラグを確認することができます。同じコマンドでフラグを解除することもできます。

xattr -p com.apple.quarantine /Users/miyako/Downloads/test.app
xattr -d com.apple.quarantine /Users/miyako/Downloads/test.app

すべてのFinder情報を消去するには

xattr -c -r /Users/miyako/Downloads/test.app



これはダウンロードしたアプリケーションをユーザーが不用意に起動することを防止するためのものです。

Sierraの場合,検疫のダイアログに続けて「ストラクチャがロックされています。」という4Dのアラートが表示され,データベースがロックされているために起動できない,というエラーが返されます。

アプリケーションがGatekeeperによって「どこだかわらない書き込み禁止の場所」に隔離されているためです。

コード署名との違い

GateKeeperは,ダウンロードしたアプリケーションに「コード署名」が不完全または不在の場合「ファイルが壊れています」あるいは「開発元が未確認のため開けません」というエラーを表示し,壊れていると判断した場合にはそのファイルをごみ箱に捨てることもします。これを回避するためには,Appleに年会費を支払ってデベロッパーIDを取得し,codesignツールを使用してアプリケーション(またはインストーラー)に署名するか,GateKeeperのセキュリティ基準を変更するしかありません。

セキュリティ基準は,システム環境設定の「セキュリティとプライバシー > ダウンロードしたアプリケーションの実行許可」で変更することができます。

署名がしてあれば,どのような方法でダウンロードされたとしても「確認済みの開発元からのアプリケーション」となるわけですが,Sierraでは「Mac App Store と確認済みの開発元からのアプリケーションを許可」という選択肢が画面から取り除かれ,「すべて」「Storeのみ」の二者択一となりました。

注記:ターミナルコマンドでGateKeeperを一時的に停止すればSierraでも「確認済みの開発元からのアプリケーションを許可」することができます。

http://osxdaily.com/2016/09/27/allow-apps-from-anywhere-macos-gatekeeper/

どのような方法でアプリケーションを配付するべきか

1. インストーラーパッケージ

ダンボール箱みたいなアイコンでおなじみのインストーラーを作成するツールがあります。

productbuild  --component sample.app /Applications/sample.app sample.pkg

#1引数は配付したいアプリケーション,#2引数はインストール先,#3引数は出来上がったパッケージのパスです。

ただし,この方法でインストーラーを作成する場合,アプリケーションだけでなく,インストーラーの署名も必要です。

注記:アプリケーション用とインストーラ用それぞれに証明書を発行してもらう必要があります。

証明書は,developer.apple.com でも管理できますが,Xcodeの環境設定で作成したほうが簡単です。(クリックするだけで良い)

https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html

アプリケーションに署名する

codesign -s "Developer ID Application: keisuke miyako (Y69CWUC25B)" sample.app

署名のチェックは

spctl --assess --type exec -vv sample.app

または

codesign --verify --deep --strict --verbose=2 sample.app

署名付きのインストーラーパッケージを作成する

まずアプリケーションを「アプリケーション」フォルダーに移動しておき,インストールされたアプリケーションを元にパッケージを作成します。

pkgbuild --component /Applications/sample.app --sign "Developer ID Installer: keisuke miyako (Y69CWUC25B)" /Users/miyako/Desktop/sample.pkg

注記:パッケージを作成する段階で元のアプリケーションが/Applications にインストールされている必要があります。

署名のチェックは

spctl --assess --type install -vv sample.pkg

または

pkgutil --check-signature sample.pkg

2. ZIP圧縮

署名したアプリケーションを圧縮するだけです。

3. ディスクイメージ

macOS 10.11.5以降であれば,codesign コマンドでディスクイメージ(dmg)に署名することができます。

ディスクイメージは「ディスクユーティリティ」で作成するのが基本ですが,コマンドラインで作成することもできます。

hdiutil create -srcfolder sample.app sample.dmg

参考:「かっこいい」インストーラーの作成を想定したスクリプトが公開されています。

https://github.com/andreyvit/create-dmg
https://pypi.python.org/pypi/dmgbuild

署名の方法はアプリケーション本体と同じです。

codesign -s "Developer ID Application: keisuke miyako (Y69CWUC25B)" sample.dmg

署名そのもののチェックは

codesign --verify --deep --strict --verbose=2 sample.dmg

でもできますが,Sierraであれば,ディスクイメージとしての署名をチェックすることができます。

spctl --assess --type open --context context:primary-signature -vv sample.dmg

まとめ

GateKeeperの設定次第では,署名がなくてもアプリケーションが実行できますが,原則的に,インターネット(ブラウザ・メール・AirDropなど)経由でアプリケーションを配付するのであれば,アプリケーションにコード署名を付けることが望ましいとされています。

SierraのGateKeeperはディスクイメージの署名もチェックします。ZIP圧縮ファイルを署名する必要はありません。

ディスクイメージやZIP圧縮ファイルを使用する場合,ユーザーは展開したアプリをドラッグ&ドロップ操作で「アプリケーション」フォルダーにインストールしなければなりません。Sierraでは,他の場所でアプリケーションを起動することに新しい制限が課せられているためです。インストーラーであれば,必然的に「アプリケーション」フォルダーにインストールされるので,この点は問題ありません。


最終編集者 miyako [ 2017-08-24, 9:17 am ], 編集回数 2 回

miyako

投稿数 : 206
登録日 : 2016/07/05

トップに戻る Go down

Re: macOS Sierraとビルドアプリケーションの配付について

投稿 by 矢嶋研一 on 2016-12-16, 6:33 pm

実際に試してみました。
データファイルを内包するスタンドアロンアプリケーションでアプリケーションに署名してあり、配布ファイルの.dmgには署名していない状態です。
これをダウンロードして、マウントし、アプリケーションをアプリケーションフォルダに手動でドラッグ&ドロップして起動しました。
ですが、GateKeeperの認証は問題なく通過したものの、「ストラクチャーが書き込み禁止」で「どこだかわからない場所」に移動されて正常に起動できませんでした。
もちろん、他のどこにインストールしても結果は変わりませんでした。
で、一旦、そのアプリケーションをどこか適当にコピーしたあと、それを違うフォルダに移動すると、なんと普通に起動しました。
ちなみに、アップデートのように既に運用されているアプリケーションフォルダ以外の適当なフォルダに古いアプリケーションに置き換えて、新しいアプリケーションをdmgイメージからコピーしても普通に起動します。
ちょっと、思っていたのとは違う動作です。
とりあえず回避方法がわかったので、困りませんが、これってdmgファイルを署名すると、また違うのでしょうかねぇ。時間があったら試験してみますが。

矢嶋研一

投稿数 : 9
登録日 : 2016/07/12

トップに戻る Go down

Re: macOS Sierraとビルドアプリケーションの配付について

投稿 by miyako on 2016-12-16, 7:22 pm

トランスローケーションの仕様では,
DMGまたはPKGが署名されていない限り,
READ-ONLYでどこだかわからない場所に移されることになっています。

ただ,対象はインターネットからダウンロードされたアプリだけなので,
USBとかでコピーしたものは,問題なく動くと思います。

ローカルで作成されたコピーも同じ扱いなのでしょう・・

miyako

投稿数 : 206
登録日 : 2016/07/05

トップに戻る Go down

Re: macOS Sierraとビルドアプリケーションの配付について

投稿 by Sponsored content


Sponsored content


トップに戻る Go down

前のトピックを表示 次のトピックを表示 トップに戻る


 
Permissions in this forum:
返信投稿: 不可