今更だけどAndroid Device Policyについて調べる

twitter

https://twitter.com/IKent1mm

## Android Device Policyってなんだ？
https://support.google.com/work/android/answer/12076837?hl=en#zippy=

https://support.google.com/work/android/answer/6192678

> Android Device Policy は、IT 管理者が Android Management API を使用する企業向けモバイル管理(EMM)プロバイダを介して Android デバイスを直接管理できるようにする組み込みの Device Policy Controller です。

>Device Policy Controller アプリでは、次のことを行います。
> * EMM ソフトウェアと通信して、プロファイルとデバイスの制限と設定を適用します
> * 管理対象の設定を実装し、デバイスが EMM のポリシーに準拠していることを確認します

Android Device Policyは、Android Management APIを用いてデバイスを管理下に置く働きをする機能
Device Policy Controllerは、例えば専用端末だったり画面ロックだったりといったデバイスの在り方をデバイスに適用する＆確認するシステムを指した名称

> 組織でサードパーティの EMM プロバイダをご利用の場合は、Device Policy Controller のインストールと Android デバイスのセットアップについて、管理者にお問い合わせください。

と書いてあるから、MDMとかを提供している会社だとDevice Policy Controllerのアプリを独自で作って、独自のコマンドとかそういうのを作っているんだろうか

すごい端的に言っちゃえば、Android Device PolicyというのはAndroidに初めから入っていて、Androidが提供しているデバイス管理する仕組みの名前ってことだと思う
<br>


<!--
debaisu-youken
https://www.android.com/intl/ja_jp/enterprise/recommended/requirements/

kannri
https://support.google.com/work/android/answer/6095397?hl=ja
https://support.google.com/work/android/topic/9563482?hl=en&ref_topic=13623456,6090502,6090491,&sjid=17126481283107526077-AP
-->

管理下に置く方法はおおきく3パターン
* 仕事用プロファイルを用いて管理下に置く（仕事用プロファイル）
* 完全管理対象を用いて管理下に置く（完全管理）
* 専用端末として管理下に置く（専用端末）

１つめは、BYODなどデバイスを個人利用もする状況に使う
２つめは、会社での利用や業務時間しか使えないようにするなど、管理者が意図した場合のみにデバイスを利用する状況で使う
３つめは、Posレジなどデバイスのアプリを固定して使用する状況で使う
というイメージ

https://support.google.com/work/android/topic/9621435?hl=ja&ref_topic=6151012,6090502,6090491,&sjid=545534662803504599-AP

~~(実はほかにもfully managed device with a work profileというのもあるが載ってない…
なくなったのかな…？)~~
以前はfully managed device with a work profile(COPE)やCOSEといったデバイス管理方法もあったようだが、今では非推奨になったらしい

https://developers.google.com/android/work/terminology?hl=ja#corporate-owned_single_use_cosu

<br>

## セットアップ方法
https://support.google.com/work/android/answer/9566881?hl=en&ref_topic=13624704&sjid=545534662803504599-AP#zippy=%2Center-an-emm-token-to-trigger-setup%2Ctransfer-setup-details-via-qr-code%2Cpush-setup-details-via-nfc-bump

https://androidenterprisepartners.withgoogle.com/emm/

セットアップ方法は６つ
セットアップによっては対応していない管理方法があるようです

* [EMMトークンを使用する方法](https://learn.microsoft.com/ja-jp/mem/intune/enrollment/android-dedicated-devices-fully-managed-enroll#enroll-by-using-a-token)
    * 完全管理
    * 専用端末管理
    * 仕事用プロファイル
* [QRコードを使用する方法](https://learn.microsoft.com/ja-jp/mem/intune/enrollment/android-dedicated-devices-fully-managed-enroll#enroll-by-using-a-qr-code)
    * 完全管理
    * 専用端末管理
    * 仕事用プロファイル
* [NFCを使用する方法](https://learn.microsoft.com/ja-jp/mem/intune/enrollment/android-dedicated-devices-fully-managed-enroll#enroll-by-using-near-field-communication-nfc)
    * 完全管理
    * 専用端末管理
* [ゼロタッチ登録を使用する方法](https://learn.microsoft.com/ja-jp/mem/intune/enrollment/android-dedicated-devices-fully-managed-enroll#enroll-by-using-google-zero-touch)
    * 完全管理
    * 専用端末管理
    * 仕事用プロファイル
* [Googleアカウントを使用する方](https://support.google.com/work/android/answer/9412115#zippy=%2Cset-up-a-new-device)
    * 仕事用プロファイル
    * 完全管理
* Google Playから管理アプリを入れる方法
    * 仕事用プロファイル

提供されているEMMによってセットアップの方法は指定されているので、上記のURLで確認すると良いらしい。
IntuneだとSamsungのKnox Mobile Enrollmentというセットアップ方法もあるみたい…
なんだそれ！気になる…！

<br>

## 2つの権限
https://source.android.com/docs/devices/admin/implement?hl=ja

Android Device Policyには2つの権限が大きくかかわっているらしい
* デバイス所有者(Device Owner)
* プロファイル所有者(Profile Owner)

Device Owner、Profile Ownerは前述したデバイス管理の方法に大きくかかわっており、
* 仕事用プロファイル -> Profile Owner
* 完全管理 -> Device Owner
* 専用端末 -> Device Owner

といったように権限が少し違っていたりします。
完全管理と専用端末に関しては、[公式ドキュメント](https://developer.android.com/work/dpc/dedicated-devices?hl=ja#where_are_dedicated_devices_used)でも
> 専用デバイス（以前は「会社所有の単一用途デバイス（COSU）」と呼ばれていました）は、特定の目的のためのフルマネージド デバイスです

と、近しい関係にあるっぽい


さらに、権限によってできることも異なり
Device OwnerのほうがProfile Ownerよりも多くの機能を操作できたりします

https://developer.android.com/work/dpc/device-management?hl=ja

| 機能 | Profile Owner | Device Owner |
|:-:|:-:|:-:|
| カスタムのロック画面メッセージを作成する |   | ✓ |
| データ ローミングを無効にする |   | ✓ |
| 設定がブロックされている場合に、<br>カスタマイズしたメッセージを表示する | ✓ | ✓ |
| 壁紙をロックダウンする | ✓ | ✓ |
| ユーザー アイコンのロックダウン | ✓ | ✓ |
| デバイスの健全性とステータスを<br>リモートでモニタリングする | ✓ | ✓ |
| Android デバイスをリモートで再起動する |   | ✓ |


(余談ですが、以前はデバイス管理者（Device Admin）の権限も大きくかかわっていたが、[Android10でほとんど廃止されたようです](https://support.google.com/a/answer/12010750?hl=en)）
（さらに余談、Device Owner権限は初期化のセットアップの際に設定する必要がある。そのため、前述した「Google Playから管理アプリを入れる方法」ではDevice Owner権限は付与することができないため、仕事用プロファイルのみの対応になっていたり…）

<br>

## Android Device Policyでできること
https://developers.google.com/android/work/requirements?hl=ja#4.-device-management_1

めっちゃあるので詳しく知りたい方は是非上記のリンクへアクセスしてみてください

ニーズがありそうなところ（主観）だと、以下のようなところでしょうか…？

* [デバイスのセキュリティ](https://developers.google.com/android/work/requirements?hl=ja#2.-device-security_1)
    * [パスワードの管理](https://developers.google.com/android/work/requirements?hl=ja#2.3.-advanced-passcode-management_1)
    * [デバイスを遠隔でロック](https://developers.google.com/android/work/requirements?hl=ja#2.5.-wipe-and-lock_1)
* [アカウントやアプリの管理](https://developers.google.com/android/work/requirements?hl=ja#3.-account-and-app-management_1)
    * [アプリの配信](https://developers.google.com/android/work/requirements?hl=ja#3.5.-silent-app-distribution_1)
* [デバイス管理](https://developers.google.com/android/work/requirements?hl=ja#4.-device-management_1)
    * [WiFiの管理](https://developers.google.com/android/work/requirements?hl=ja#4.3.-wi-fi-configuration-management_1)
    * [初期化の管理](https://developers.google.com/android/work/requirements?hl=ja#4.17.-factory-reset-protection-management_1)
    * [スクリーンキャプチャの管理](https://developers.google.com/android/work/requirements?hl=ja#4.19.-screen-capture-management_1)
    * [カメラを無効化](https://developers.google.com/android/work/requirements?hl=ja#4.20.-disable-cameras_1)
    * [デバイスを遠隔で再起動](https://developers.google.com/android/work/requirements?hl=ja#4.23.-reboot-device_1)

（あくまでAndroid Device Policyでできることというだけなので、独自でDevice Policy Controllerを作るとかすればもっといろいろできると思う）

<br>

## Android Device Policy触ってみる
:::note alert
EMMをやっていると簡単に文鎮化します
実機の際は用法・要領を守って慎重に調べながらやってください
:::

https://developers.google.com/android/management/quickstart?hl=ja

クイックスタートに従ってやってみましょう！
### 用意するもの
* Android 6.0以上のデバイス
* Android　Enterpriseに紐づいてないアカウント
    * [ここ](https://play.google.com/work/signin?continue=https://play.google.com/work/adminsettings)を開いてみて、
「managed Google Play ストアへのアクセス権限が会社からまだ付与されていません。」と出るアカウントなら大丈夫

## いろいろやっていく
* プロジェクトの作成　＆エンタープライズの紐付け
* ポリシーの作成
* ポリシーをデバイスに適用


### プロジェクトの作成　＆エンタープライズの紐付け
https://www.google.com/url?q=https%3A%2F%2Fconsole.cloud.google.com%2Fcloud-resource-manager

アクセスして「プロジェクトを作成」ボタンをクリック。
ダッシュボードへ移動して
![スクリーンショット 2024-06-19 10.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699725/6db8bd43-c524-ed7e-4566-6b5c6975f2a6.png)

なんでもいいので名前を付けて作成し、プロジェクトを開いてダッシュボードからプロジェクトIDをコンソールへ
コピペして実行
その後言われるがままにコードを実行して認証させます

その後も言われるがままにコードを実行し、お店の名前を雑につけてEnterpriseに登録

### ポリシーの作成
```
policy_json = '''
{
  "applications": [
    {
      "packageName": "com.google.samples.apps.iosched",
      "installType": "FORCE_INSTALLED"
    }
  ],
  "advancedSecurityOverrides": {
     "developerSettings": "DEVELOPER_SETTINGS_ALLOWED"
  }
}
'''
```

「ひとまずこれを実行してみてねー」とのこと。
実行してみましょう
その後のコードも実行。なんかQRコードが出てきた
これがQRコードでプロビジョニングするやつですね


一通り初期設定が終わったら設定アプリを開いて「Password＆Accounts」を開いてみましょう
すると、Account for Ownerの欄にManagedAccountと書いてある項目が
さらにすべてのアプリを見ると、普通の初期設定では入らないGoogle I/Oという知らないアプリも
| setting | All App |
|:-:|:-:|
| ![Screenshot_20240619-025715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699725/f5c67b40-1003-9dc0-74aa-991c7b11b060.png) | ![Screenshot_20240619-025852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699725/c2f252e7-53d0-fa7a-b851-ceeb47f0e9bb.png) |

アプリについて調べてみると[このアプリ](https://play.google.com/store/apps/details?id=com.google.samples.apps.iosched&hl=en)のようです

https://play.google.com/store/apps/details?id=com.google.samples.apps.iosched&hl=en



## ポリシーをいろいろいじってみる
https://developers.google.com/android/work/requirements/fully-managed-device?hl=ja

完全管理が一番操作しやすいので上記のサイトでまとめられているのを参考にいろいろいじってみましょう
あと、再度にはなるんですが結構簡単に文鎮化するので、本当に本当に気をつけてください
「フーン。アプリ非表示にできるのか…ランチャー非表示にするか」とか、そういう好奇心を持っている方は文鎮製造機の才能がある方なので注意してください
上級者向け（緑色の星がついている項目）をやらなければ、そういったことにはならないとは思いますが…
<br>
ひとまず、
* [Yahooアプリ](https://play.google.com/store/apps/details?id=jp.co.yahoo.android.yjtop&hl=en)も自動で入るようにする
* [カメラの無効化](https://developers.google.com/android/work/requirements?hl=ja#4.20.-disable-cameras_1)
* ~~[スクリーンキャプチャの無効化](https://developers.google.com/android/work/requirements?hl=ja#4.19.-screen-capture-management_1)~~
    * スクリーンキャプチャを無効化したらスクショ取れないの忘れてた（愚か）
* [パスワードの難しさを設定](https://developers.google.com/android/work/requirements?hl=ja#2.1.-device-security-challenge_1)
* [ロック画面にメッセージを出す](https://developers.google.com/android/work/requirements?hl=ja#5.4.-lock-screen-messages_1)
* [初期化できないようにする](https://developers.google.com/android/work/requirements?hl=ja#4.17.-factory-reset-protection-management_1)

をやってみましょう
<br>

するとこんな感じになるかなと思います

```
import json

policy_name = enterprise_name + '/policies/policy1'

policy_json = '''
{
  "passwordRequirements": {
  "passwordQuality": "ALPHABETIC",
  "passwordScope": "SCOPE_DEVICE"
  },
  "deviceOwnerLockScreenInfo": {
      "defaultMessage": "Hello World"
  },
  "applications": [
    {
      "packageName": "com.google.samples.apps.iosched",
      "installType": "FORCE_INSTALLED"
    },
    {
       "packageName": "jp.co.yahoo.android.yjtop",
      "installType": "FORCE_INSTALLED"
    }
  ],
  "cameraDisabled": true,
  "factoryResetDisabled": false,
  "advancedSecurityOverrides": {
     "developerSettings": "DEVELOPER_SETTINGS_ALLOWED"
  }
}
'''

androidmanagement.enterprises().policies().patch(
    name=policy_name,
    body=json.loads(policy_json)
).execute()

```
どうでしょうか、実際にその通りにキッティングされましたでしょうか？
されなかったらどっかにミスがあるので、頑張ってください（なげやり）

# まとめ

多くの会社で専用端末モード（KIOSK）のAndroidデバイスが用いられてます
SNSとかで「飲食店の端末いじったら、Androidのホーム画面いけたわｗｗｗ」
みたいなツイートを見かける時があると思いますが、まさにそれです

Android Device Policyは、趣味でアプリ開発だったりだとあまり使わないし、私物の普段使いのスマホで活用している人もほとんどいないんじゃないかなと思います
ですが、徐々に扱われるケースが増えていってるんじゃないかなと個人的には思います
（自分が扱うようになって目についてるだけな可能性が高いですがｗ）

簡易に試すだけならお手軽ですし、もし暇な時間があれば試しで見るのはどうでしょうか