🗝️

macOS Gatekeeper周りのまとめ

2020/11/29に公開

macOSで、ダウンロードしてきた実行ファイルの実行時に確認を出したり、開発者の検証がされてないから閉じるね、みたいな機能を実現するのがGatekeeper。昔からあったが、最近は「すべてのアプリを許可する」がGUIではできなくなり、着々と強化されています。

調べると少し古いと思われる情報もネット上には多い(というか、現状となんか挙動が違う)ので、11.0のBigSurで確認したことをまとめます。ただ、推測な部分もまだまだ多いです。

x86_64とarm64の対応の違い

また、これまでの互換性への配慮からか、M1 macでは、x86のコードはゆるく、新しいarm64の方が厳しくなっているようです。M1なMacBook Pro上で、Go処理系で簡単なhello worldなアプリを実装して実験した結果です。処理系のバグかもしれませんが、それだとコアダンプが表示されそうで、でもされないのでこのあたりなのかなと。実際、署名が必要というissueも立っていたりはします。

  • amd64版Go処理系でビルドし、amd64版バイナリを作成→実行成功
  • arm64版Go処理系でビルドし、arm64版バイナリを作成→実行失敗(zsh: killed ./main)

ダウンロード周り

ファイルをダウンロードすると、いつどのブラウザでダウンロードしたかの情報が拡張属性に格納されます。

$ xattr -l ~/Downloads/EOSWebcamUtility-MAC1.0.pkg
:
com.apple.quarantine: 0081;5fc259e6;Chrome;674BAC19-05E7-44EB-BAE7-D442C13B720E

このcom.apple.quarantineがダウンロードファイルだから気をつけろよ、という印です。次のコマンドでこのフラグを外して確認が行われないようになりますが、まあ安全のための機能なので無闇やたらと使わない方が良いコマンドです。実行できないときの原因調査でステータス確認で-lを使いましょう。

$ xattr -d com.apple.quarantine ~/Downloads/EOSWebcamUtility-MAC1.0.pkg

コード署名

署名を確認するには次のようにタイプします。問題なければ何も出ないはずだが、何か出力されたら問題があったということだと思います。

# 簡単な方法
$ codesign -v ./実行ファイルパス
./実行ファイルパス: invalid signature (code or signature have been modified)
In architecture: arm64

# こちらでも良い
$ spctl -av ./実行ファイルパス
:
./実行ファイルパス: invalid signature (code or signature have been modified)

署名するには証明書をまずは発行します。必要最小限の自己署名で zoom の 仮想カメラ (mac-obs-virtual-camera) を使えるようにしてみた。の説明がわかりやすいです。

「キーチェーンアクセス」→「証明書アシスタント」→「証明書を作成」の順に選択し、出てきたページで、「固有名のタイプ: 自己署名ルート」「証明書のタイプ: コード署名」を選択します。名前はわかりやすい名前であればなんでも良いです。ここでは自分でローカルでビルドしたアプリ用なので「my-local-app」にしました。最後に「作成」を選択します。

作成後に次のコマンドを叩くとこんな感じの内容が出てきます。この1)とかの直後の16進数な文字列が大切なようです。

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
  1) 0123456789ABCDEFGH "Apple Development: yoshiki@example.com (-------)"
  2) 1123456789ABCDEFGH "my-local-app" (CSSMERR_TP_NOT_TRUSTED)
     2 identities found

あとは次のコマンドでいけるはずですが、手元ではうまくいっていません。

$ sudo codesign -s 1123456789ABCDEFGH -f ./実行ファイルパス
./実行ファイルパス: replacing existing signature
./実行ファイルパス: the codesign_allocate helper tool cannot be found or used

codesign_allocateは、そのありかにパスを通す・実行ファイルへのシンボリックリンクをPATHの通った場所におく、CODESIGN_ALLOCATEの環境変数にパスを設定する、あたりがソリューションとして見つかった方法ですが、どれを実行しても今のところうまくいってません。ちなみに、僕の環境では以下のパスにありました。

  • Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate

だれか詳しい人教えてください。

謎なポイント

Apple製のclangやそのリンカでアプリを作成すると(MacPortsなどで)、正しく実行できるということは、証明書をわざわざ作ったりしなくても大丈夫な気がします。でもこの手順だと証明書が必要です。ウェブ出てくる事例はだいたいiOSアプリ開発でプログラムを頒布するというユースケースなので、これだと確かに開発者を証明するための署名は必要だと思います。「M1 Big Surで厳しくなったチェックを回避する」という事例にダイレクトにマッチする情報は見つけられていません。

ゲートキーパーのまるごとの有効化・無効化

動作確認を行っていて、問題がゲートキーパーの設定なのか、実装のミスかを判断するにはゲートキーパーをまるごと無効化してみると良いかもしれません。

# 有効化
$ sudo spctl --master-enable 

# 無効化
$ sudo spctl --master-disable 

まとめ

まだきちんと動かす方法に辿り着けていないのですが、もろもろ調べた情報の備忘録として残しておきます。やはり、この手の新しい環境の構築を手探りでやろうとするといろいろ知見が溜まっていきますね。

参考

Discussion