Signer Lockdown
Signer Lockdown(lockdown/)は、Android 端末を署名専用機にするアプリです。Device Owner として動き、中に同梱した署名アプリを入れたうえで、署名に要らない機能を Android 自身に禁止させます。PC は Lockdown を端末に渡すだけなので、信頼しなければならない PC 側のコードは少なくて済みます。
Android 10 の端末で確認しています。
制限するもの
- 電波がつながる先を残さない。SIM カードがない時だけ適用でき、Bluetooth はオフ、Wi-Fi・テザリング・モバイルネットワーク・位置情報の設定は変えられない
- クイック設定を開けない。機内モードをオンに固定する手段は Android にないため、設定アプリからは解除できる。SIM も保存済み Wi-Fi もなければ、解除してもつながる先はない
- アカウントとユーザーの追加、提供元不明のアプリのインストール、設定画面でのアプリの有効・無効の切り替え、セーフモード、USB ファイル転送、USB デバッグ
- ユーザー補助と IME は端末に最初から入っているものだけ
- 署名アプリはアンインストールできない(端末に保存した seed を誤って消さないため)
lockdown/profiles/hide.txtに挙げたアプリのうち、端末にあるものを隠す(Google・AOSP・MediaTek のよくあるアプリ)- 選べば、保存済み Wi-Fi を消す
一時解除と Device Owner の解除は、画面ロックの認証が要ります。一時解除しても、制限を掛けた時点で Android がオフにしたもの(USB デバッグ、他アプリのインストール許可、音声入力 IME)はオンに戻りません。
QR で導入する
リリースには signer-lockdown-<version>.apk(署名アプリ同梱)と provisioning-<version>.png が付きます。端末がネットワークにつながるのは Lockdown をダウンロードする間だけで、まだ鍵は入っていません。PC は QR を表示するのに使うだけです。
- 端末を工場出荷リセットする。Device Owner はアカウントが1つもない端末にしか設定できない
- ようこそ画面の同じ場所を6回タップする。QR の読み取り画面が開く
- Wi-Fi につなぎ、
provisioning-<version>.pngを読む。端末はリリースから Lockdown をダウンロードし、QR に入っている SHA-256 と照合する。「This device belongs to your organization」の organization は Lockdown のこと。Next で進む - 画面ロックを設定する。Google アカウントは追加せず、Google Services の画面のスイッチはすべてオフにする
- Signer Lockdown を開き「署名アプリを入れる」
- SIM カードを抜き、機内モードをオンにして「制限を適用」。手順3の Wi-Fi は、チェックを外さなければ消える。外すと、機内モードを解除したときにその Wi-Fi へつながり直すので、チェックしたままにする
Android 12 以降は、Lockdown にまだない2つの画面(GET_PROVISIONING_MODE / ADMIN_POLICY_COMPLIANCE)が要ります。
ネットワークを使わずに導入する
端末を一度もネットワークにつなぎたくない場合です。Wi-Fi の代わりに、PC から USB で APK を渡します。
上の手順1と4と同じように端末を準備し、開発者向けオプションを出して(端末情報のビルド番号を7回タップ)、USB デバッグをオンにします。
続けて、PC の Chrome か Edge で次の手順を進めます。
- リリースから
signer-lockdown-<version>.apkをダウンロードする - 導入ページを開き、APK と同じリリースの
SHA256SUMSを選ぶ。ページが照合し、一致したときだけ入れられる - 端末をつなぎ、ブラウザのダイアログで端末を選び、端末で USB デバッグを許可する。PC で adb が動いていると USB を取り合うので、先に止める(
adb kill-server) - ページが Lockdown を入れて Device Owner にする。上の手順5から続ける。制限を適用すると USB デバッグは止まる
このページ(installer/)はこのリポジトリから、バージョンを固定した ya-webadb(MIT)でビルドしていて、WebUSB で端末と話します。つないでいる間は端末に対して adb のすべての操作ができるので、Lockdown の設定が済んだら閉じてください。
オフラインの PC で使うときは、一度オンラインでページを開き、ブラウザのアドレスバーからアプリとしてインストールしてください(Chrome か Edge)。インストールしたアプリはネットワークなしで開けます。どのバージョンがキャッシュされているかは、上部のバーのビルド ID で確認できます。
Lockdown なしで APK だけを入れるとき(署名アプリだけを使う場合など)は、ページ上部で「APK だけ入れる」を選んでください(URL の末尾に #apk を付けて開いても同じです)。APK を入れるだけで、Device Owner は設定しません。
Android の platform-tools が入っていれば、lockdown/install.sh <bithanko.apk> <signer-lockdown.apk> でも同じことができます。各手順の前に確認を求めます。
PC もネットワークも使わずに更新する
制限を掛けたまま、microSD か USB メモリに置いた APK で署名アプリと Lockdown を更新できます。
- リリースの APK をカードに写す
- Lockdown の「SD カードからアプリを更新」で APK を選ぶ
- 表示されたバージョンと SHA-256 をリリースページの
SHA256SUMSと照合して「更新」
受け付けるのは署名アプリと Lockdown のパッケージだけです。署名鍵が違う APK と古いバージョンは Android が拒みます(別の鍵で署名し直した APK が拒まれることを確認済み)。Lockdown は期待するハッシュを持たないので、署名アプリのリリースのたびに Lockdown を更新する必要はありません。
PC から USB で更新する
- Lockdown の「PC から USB でアプリを更新」を押し、画面ロックを解く。Lockdown は署名アプリを強制終了し(メモリに鍵が残っていても消える)、USB ファイル転送を許可する
- PC とつなぎ、端末の USB の通知で「ファイル転送」を選んで、リリースの APK を Download にコピーする
- 「APK を選ぶ」を押す。この時点でファイル転送はまた禁止される。あとは上の手順 3 と同じ
許可するのはファイル転送だけで、そのダイアログが出ているあいだだけです。USB デバッグは禁止したままです。ファイル転送で見えるのは共有ストレージだけです。署名アプリの保存した seed は署名アプリ専用の領域にあり、署名アプリの Keystore 鍵で暗号化されているので、PC からも Lockdown からも読めません。ダイアログが出たまま Lockdown が閉じたときは、次に Lockdown を起動したときにファイル転送を禁止し直します。
PC から確かめる
lockdown/audit.sh は adb で端末の状態を読むだけで、何も変えません。ブートと OS の健全性、無線、プロファイルに対して有効なアプリ、強い権限を持つアプリ、アカウント、バックアップ、ロック画面を見ます。USB デバッグが要るので、制限を掛ける前か一時解除した後に使います。
開発
lockdown/provision.sh <bithanko.apk>は debug の Lockdown をビルドし、QR を表示して APK を LAN に配信する。リリース workflow はリリースの URL を渡して同じスクリプトを使う- ビルドには JDK 25 と Android SDK が要る(
cd lockdown && ./gradlew assembleDebug) - メーカー独自のアプリは
lockdown/profiles/hide.txtに足す。署名アプリの画面を描くcom.google.android.webviewは残す