ブログ

ご注意:
この情報は過去に書かれたブログ記事のキャッシュになります。最新の情報ではありませんのでご注意ください。
また、公開当時のキャッシュされたテキストのみを読めるようにした内容になっております。 公開当時の画像やデザイン情報がありませんので、デザイン上読みにくい部分がありますことをご了承ください。 なお、最新のブログはGitHubにて公開しています。

日付0000/00/00

MacにDeveloper ToolsまたはXcode(App Store以前はCHUDパッケージ)をインストールすると,『purge』というコマンドが使用できるようになります。purgeはディスクキャッシュを解放するコマンドで,特定の状況でMacの空きメモリを増量できるユーティリティです。コマンドは,4DのLAUNCH EXTERNAL PROCESS,あるいはAppleScriptの『do shell script』などで実行することができましたが,OS X 10.9 Mavericks以降,『sudo』つまりroot権限が求めれるようになりました。この記事では,OS X Mavericksでpurgeを実行する方法について説明しています。


AppleScriptの『do shell script』は,『with administrator privileges』オプションにより,root権限でプログラムを実行することができます。ただし,毎回,パスワードを入力しなければなりません。sudoは,権限の昇格に成功した後,5分間はパスワードの入力が省略できるようになっています。これを利用して,purgeのようなコマンドが実行できるかもしれません。しかし,こうした方法は,毎回,パスワードの入力が求められる,あるいはパスワードをそのまま引数で渡さなければならない,という点で問題を抱えています。

権限の昇格
Appleのドキュメントは,root権限で特定の操作を実行するさまざま方法,およびそれぞれの問題点を列挙した上で,最後に『Privileged Helper』を使用する方法を推奨しています。

概要
root権限で実行したいコマンドは,コード署名された簡単なコンソールプログラムに代行させます。このプログラムは,『Library/PrivilegedHelperTools/』にインストールされることになります(ヘルパーツール)。ヘルパーツールをインストールするときには,一度だけパスワードの入力を求められます。認証後,ヘルバーツールはlaunchdに登録され,以後,必要の応じて起動し,root権限のdaemon(常駐プログラム)として実行されることになります。

ヘルパーツールは,同じ信用情報でコード署名されたアプリケーションを使用してインストールすることができます。そのアプリケーションは,XPC(Cross Process Communication)により,ヘルパーツールと対話することができます。他のアプリケーションは,ヘルパーツールをインストールすることも,操作することもできません。本体のアプリケーションは,一般ユーザーの権限で実行されますが,認証されたヘルパーツールが介在することにより,特定の操作だけはroot権限で実行することができるというわけです。

root権限でpurgeを実行するためのプラグインを作成しました。

https://github.com/miyako/4d-plugin-purge

注記:プラグインは,v14のSDKを使用しており,v14の新しい形式に準拠しています。つまり,RSRファイルの代わりにコマンド名はJSON形式のmanifest.json,定数はXLIFF形式のconstants.xlfで記述されています。この形式のプラグインがロードできるのは,v14以降の4D Carbonおよび4D Cocoaです。v11-v13用に以前の形式でビルドされたプラグインは,『v11』フォルダー内に置かれています。プログラムの内容は同一ですが,v11版はIntel 32ビット専用となっています。v14版は,32/64ビットのUniversal Binaryとなっています。

プラグインコマンドの『PURGE DISK BUFFERS』により,purgeを実行することができます。引数『Purge request authorization』が渡された場合,あるいはヘルパーツールのインストール成功が確認できない場合(初回など)には,パスワード入力を求めるダイアログが表示されます。

注記:プラグインは,単純にアプリケーションを起動しているだけです。実際,4Dを経由しなくても,ダブルクリック等で直接,プラグインの内部に置かれている『Purge Helper』アプリケーションを使用することができます。引数『Purge request authorization』は,『--install』というオプションをアプリケーションに起動しているだけです。

この画面は,AuthorizationCreateに続けてSMJobBlessがコールされたことにより,システムが自動的に表示しています。パスワードを入力して『ヘルパーをインストール』をクリックすると,指定されたプログラム(この場合,『com.apple.bsd.purge.HelperTool』)がlaunchdに登録され,所定の場所にインストールされます。パスワードが間違っている場合,プログラムが有効なMac Developer 資格で署名されていない場合,あるいはそれぞれのプロパティリストの内容に不備がある場合など,必要な条件が満たされなければ,プログラムはインストールされません。

インストールされたヘルパーツールを操作できるのは,指定されたアプリケーションだけです。その関係は,アプリ側のプロパティリストに記述されています。Tools owned after installation,あるいはSMPrivilegedExecutablesというキーです。そこには,操作できるヘルパーツールと署名者が記されています。

identifier com.apple.bsd.purge.HelperTool and certificate leaf[subject.CN] = "Mac Developer: keisuke miyako (4W9UT59D3B)"
ヘルパーツール側のプロパティリストにも,同様の内容が含まれています。Clients allowed to add and remove toolまたはSMAuthorizedClientsというキー名です。

identifier com.apple.bsd.purgehelper and certificate leaf[subject.CN] = "Mac Developer: keisuke miyako (4W9UT59D3B)"
注記:ヘルパーツールをアンインストールするAPI(SMJobRemove)は10.10でdeprecateとなりました。

ヘルパーツールは,root権限で実行されるものなので,他のプログラムに乗っ取られないために,こうした関連付けが必要とされています。

ヘルパーツールは,アプリケーション(バンドル)ではないため,プロパティリストは本体に埋め込まれなければなりません。そのための指示は,ビルド設定の『Other Linker Flags』に記述されています。

インストールされたヘルパーツールとの対話には,XPCと呼ばれるプロセス間通信の仕組みが使用されています。プラグインの場合,『/usr/sbin/purge』という文字列がアプリケーションから送られ,ヘルパーツールはそのままsystem命令に渡しているだけです。『それではsudoを必要とするコマンドが何でも実行できてしまうのはないか』と思えるかもしれません。しかし,命令(purge)はハードコーディングされており,他のアプリケーションはヘルパーを制御することができないので大丈夫です。XPC/ヘルパーツール以前の仕組み(AuthorizationExecuteWithPrivileges)では,こうした面で不安がありました。実際,AuthorizationExecuteWithPrivilegesに関するドキュメントと例題は,すべてAppleのデベロッパーサイトから削除されています。

ヘルパーツールを操作するアプリケーションは,バックグラウンドで起動するように設定されています。具体的には,プロパティリストのApplication is background onlyまたはLSBackgroundOnlyというキーがYESになっており,Dockなどにアイコンが表示されないようになっています。また,ウインドウなどのユーザーインタフェースは存在しません。アプリケーションの起動と終了は,アクティビティモニターで確認することができます。

プラグインのContents/MacOSフォルダーには,ヘルパーツールおよび操作するためのアプリケーションが置かれています。前述したように,署名に関する情報は,プロパティリストにも含まれているため,プラグインを誤って別のDeveloper資格で署名してしまわないように気をつけてください。あるいは,プロパティリストを編集して再ビルドすることもできるでしょう。ただし,アプリケーションの名前やIDは,Xcodeプロジェクト内のさまざまな場所で参照されているため,プロジェクトの編集には細心の注意を払う必要があります。

まとめ
OS X 10.9以降,purgeコマンドの実行には一定の権限が求められるようになりました。sudo,またはAppleScriptのdo shell script with administrator privilegesを利用することもできますが,利便性,またセキュリティの面で問題があると思えるかもしれません。Appleが推奨するのは,ヘルパーツールのインストール,およびXPCによるツールとの対話です。ヘルパーツールは,インストール時にパスワードを求めることにより,以後,信用された常駐プログラムとしてroot権限で実行されるようになります。ヘルパーツールをインストールしたプログラムは,XPCにより,特定の操作を委任することができます。