Android 10 のエンタープライズ向けの新機能

このページでは、Android 10 で導入された新しいエンタープライズ向け API、機能、動作変更の概要について説明します。

会社所有デバイスの仕事用プロファイル

Android 10 では、仕事用プロファイルのみを必要とする会社所有デバイス向けに、新しいプロビジョニングと構成証明の機能が導入されています。

仕事用プロファイル向けのプロビジョニング ツールの改善

QR コードまたはゼロタッチを使用して登録された Android 10 以降のデバイスに仕事用プロファイルをプロビジョニングできます。会社所有デバイスのプロビジョニング中に、新しいインテント エクストラにより、Device Policy Controller アプリ(DPC)が仕事用プロファイルまたは完全管理型セットアップを開始できます。仕事用プロファイルが作成されるか完全な管理が確立されたら、DPC はポリシー コンプライアンス画面を起動して初期ポリシーを適用する必要があります。

DPC のマニフェスト ファイルで、アクティビティの GET_PROVISIONING_MODE の新しいインテント フィルタを宣言し、BIND_DEVICE_ADMIN 権限を追加して、任意のアプリがアクティビティを開始できないようにします。次に例を示します。

<activity
    android:name=".GetProvisioningModeActivity"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <intent-filter>
        <action
            android:name="android.app.action.GET_PROVISIONING_MODE" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

プロビジョニング中に、システムはインテント フィルタに関連付けられたアクティビティを起動します。このアクティビティの目的は、管理モード(仕事用プロファイルまたは完全管理対象)を指定することです。

デバイスに適した管理モードを決定する前に、プロビジョニング エクストラを取得しておくと便利です。アクティビティは getIntent() を呼び出すと、以下を取得できます。

また、DPC は、新しい結果インテントを作成して、以下のエクストラを追加することもできます。

デバイスで管理モードを設定するには、putExtra(DevicePolicyManager.EXTRA_PROVISIONING_MODE,desiredProvisioningMode) を呼び出します。ここで、desiredProvisioningMode は次のとおりです。

  • 仕事用プロファイル: PROVISIONING_MODE_MANAGED_PROFILE
  • 完全管理型: PROVISIONING_MODE_FULLY_MANAGED_DEVICE

setResult(RESULT_OK, Intent) でプロビジョニングの詳細を設定に戻して、仕事用プロファイルまたはフルマネージドのプロビジョニングを完了し、finish() ですべてのアクティブな画面を閉じます。

プロビジョニングが完了すると、DPC で新しいインテントが利用可能になり、コンプライアンス画面を起動して初期ポリシー設定を適用できるようになります。仕事用プロファイル デバイスでは、仕事用プロファイルにコンプライアンス画面が表示されます。DPC は、ユーザーが設定フローから逃れた場合でも、コンプライアンス画面がユーザーに表示されるようにする必要があります。

DPC のマニフェスト ファイルで、アクティビティの ADMIN_POLICY_COMPLIANCE の新しいインテント フィルタを宣言し、BIND_DEVICE_ADMIN 権限を追加して、任意のアプリがアクティビティを開始できないようにします。次に例を示します。

<activity
    android:name=".PolicyComplianceActivity"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <intent-filter>
        <action android:name="android.app.action.ADMIN_POLICY_COMPLIANCE" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

DPC は、ACTION_PROFILE_PROVISIONING_COMPLETE ブロードキャストをリッスンするのではなく、この新しいインテントを使用する必要があります。

インテント フィルタに関連付けられたアクティビティは、getIntent() を呼び出して EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE を取得できます。ポリシーに準拠した後、ADMIN_POLICY_COMPLIANCEsetResult(RESULT_OK, Intent) を返し、finish() ですべてのアクティブな画面を閉じる必要があります。

完全管理対象デバイスの場合は、ホーム画面に戻ります。仕事用プロファイル デバイスは、ホーム画面に戻る前に個人アカウントを追加するようユーザーに求めます。

仕事用プロファイルのデバイス ID 構成証明

ゼロタッチ登録を使用してプロビジョニングされた仕事用プロファイルの管理者として設定された DPC は、IMEI やメーカーのシリアル番号など、セキュア ハードウェアで証明されたデバイス ID を取得できます。デバイスは、高信頼実行環境(TEE)やセキュア エレメント(SE)などのセキュア ハードウェアを含み、デバイス ID 構成証明とゼロタッチ登録に対応している必要があります。

仕事用プロファイルの管理コンポーネントは、DevicePolicyManager.generateKeyPair() を呼び出して、idAttestationFlags 引数に対して ID_TYPE_SERIALID_TYPE_IMEIID_TYPE_MEID の 1 つ以上を渡すことができます。

デバイス ID の抽出と検証について詳しくは、キー構成証明を使用してハードウェア格納型キーペアを検証するをご覧ください。

仕事用プロファイルの改善

新しい API を利用して、クロス プロファイル カレンダーの公開設定を行い、デバイス全体で提供元不明のアプリのインストールをブロックできるようになりました。

仕事用プロファイルを使用して提供元不明のアプリをデバイス全体で制限する

Google Play(または他の信頼できるアプリストア)以外の提供元からダウンロードされたアプリは、提供元不明のアプリと呼ばれます。Android 10 では、仕事用プロファイルの管理者が新しいユーザー制限 DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY を追加することで、どのユーザーまたはプロファイルもデバイス上の不明な提供元からアプリをインストールできないようにすることが可能です。ただし、この制限を追加した後でも、デバイスを使用しているユーザーは、adb を使用してアプリをインストールできます。

ユーザーが提供元不明のアプリが誤ってインストールするのを防ぐために、このユーザー制限を追加することをおすすめします(Google Play 開発者サービスのインストールが不要なため)。古いバージョンの Android をサポートする場合は、Google Play の管理対象設定の値を設定します。

許可対象の入力デバイスを仕事用プロファイルだけに制限する

仕事用プロファイルの管理者が DevicePolicyManager.setPermittedInputMethods() を呼び出すと、ユーザーはデバイス全体ではなく仕事用プロファイル内で、許可されている入力方法のみに制限され、デバイスの個人用側での入力方法を完全に制御できます。

仕事用プロファイルを通知せずにワイプする

DevicePolicyManager.wipeData()WIPE_SILENTLY フラグを追加しました。 このフラグが設定されている場合、wipeData() を使用して仕事用プロファイルがワイプされた後も、ユーザーには通知されません。

完全管理対象デバイスの新機能

Android 10 では、完全管理対象デバイス向けの新しい機能と API が導入されています。これには、手動システム アップデート、QR コードと NFC プロビジョニングの拡張(EAP Wi-Fi ネットワークの認証情報を含む)、DNS over TLS のサポートなどがあります。

手動によるシステム アップデートのインストール

Android 10 では、完全管理対象デバイスの管理者がシステム アップデート ファイルを使用してシステム アップデートをインストールできます。手動システム アップデートにより、IT 管理者は次のことができるようになります。

  • 全体にインストールする前に、少数のデバイスでアップデートをテストできます。
  • 帯域幅が制限されたネットワークで、ダウンロードの重複を回避できます。
  • インストールのタイミングをずらしたり、デバイスが使用されていないときだけにアップデートしたりすることができます。

まず、IT 管理者は延期されたシステム アップデート ポリシーを設定して、自動インストールを遅らせます(必要な場合)。次に、デバイスの DPC は、デバイス メーカーのシステム アップデート ファイルのパスを指定して installSystemUpdate() を呼び出します。デバイスの再起動前に発生したエラーをシステムが報告する際に使用できる InstallSystemUpdateCallback オブジェクトを渡します。問題が発生すると、システムは onInstallUpdateError() を呼び出してエラーコードを指定します。

デバイスが再起動した後、DPC はバージョン API(Build.FINGERPRINT など)を使用してインストールが正常に完了したことを確認する必要があります。更新が失敗した場合は、IT 管理者にエラーを報告します。

EAP Wi-Fi プロビジョニング

Android 10 では、デバイスのプロビジョニングに使用する QR コードと NFC データに、EAP の構成と認証情報(証明書を含む)を含めることができます。ユーザーが QR コードをスキャンするか NFC タグをタップすると、デバイスは EAP を使用してローカル Wi-Fi ネットワークに対して自動的に認証を行い、追加の手動入力なしでプロビジョニング プロセスを開始します。

EAP を使用して Wi-Fi を認証するには、EXTRA_PROVISIONING_WIFI_SECURITY_TYPE エクストラを追加し、値 "EAP" を指定します。EAP 認証を指定するには、次のプロビジョニング エクストラをインテントに追加できます。

プライベート DNS のサポート

組織は、DNS over TLS(Android デバイスでは「プライベート DNS」)を使用して、内部ホスト名の DNS クエリの漏洩を回避できます。完全管理対象デバイスの管理コンポーネントは、デバイスのプライベート DNS 設定を制御できます。限定公開 DNS モードを設定するには、次のコマンドを実行します。

DPC がこのいずれかのメソッドを呼び出すと、呼び出しが成功していれば、システムから PRIVATE_DNS_SET_NO_ERROR が返されます。失敗した場合はエラーが返されます。

デバイスに設定されている限定公開 DNS モードとホストセットを取得するには、getGlobalPrivateDnsMode()getGlobalPrivateDnsHost() を呼び出します。DISALLOW_CONFIG_PRIVATE_DNS ユーザー制限を追加すると、ユーザーがプライベート DNS 設定を変更できないようにすることができます。

VPN ロックダウン モードの適用除外

VPN ロックダウン モードを使用すると、DPC は VPN を使用しないネットワーク トラフィックをブロックできます。完全管理対象デバイスと仕事用プロファイルの管理者は、ロックダウン モードからアプリを除外できます。除外されたアプリはデフォルトで VPN を使用しますが、VPN が利用できない場合は他のネットワークに自動的に接続します。除外されたアプリが VPN へのアクセスも明示的に拒否されている場合は、他のネットワークのみを使用します。

アプリをロックダウン モードから除外するには、除外されるアプリ パッケージのリストを受け取る新しい DevicePolicyManager メソッド setAlwaysOnVpnPackage() を呼び出します。DPC によって追加されたアプリ パッケージは、このメソッドが呼び出されたときにデバイスにインストールする必要があります。アプリをアンインストールしてから再インストールした場合、アプリを再度除外する必要があります。以前にロックダウン モードから除外されたアプリを取得するには、getAlwaysOnVpnLockdownWhitelist() を呼び出します。

完全管理対象デバイスと仕事用プロファイルの管理者がロックダウン モードのステータスを取得できるように、Android 10 では isAlwaysOnVpnLockdownEnabled() メソッドが追加されています。

新しい委任スコープ

Android 10 では、DPC が他の専門的なアプリに委任できる機能のリストが拡張されています。Android は、タスクに必要な API メソッドをスコープにグループ化しています。スコープを委任するには、setDelegatedScopes() を呼び出して、次のスコープを 1 つ以上渡します。

Android 10 では、委譲アプリ用に新しいクラス DelegatedAdminReceiver が導入されています。システムは、このブロードキャスト レシーバを使用して、委任されたアプリに DPC のようなコールバックを送信します。ネットワーク アクティビティのロギングと証明書の選択が委任されたアプリは、このクラスを実装する必要があります。このコンポーネントをデリゲート アプリに追加する手順は次のとおりです。

  1. DelegatedAdminReceiver のサブクラスをデリゲート アプリに追加します。
  2. アプリ マニフェストで <receiver> を宣言し、コールバックごとにインテント フィルタ アクションを追加します。たとえば、ACTION_NETWORK_LOGS_AVAILABLEACTION_CHOOSE_PRIVATE_KEY_ALIAS です。
  3. BIND_DEVICE_ADMIN 権限でブロードキャスト レシーバを保護します。

次のスニペットは、ネットワーク ロギングと証明書選択の両方を処理する単一のデリゲート アプリのアプリ マニフェストを示しています。

<receiver android:name=".app.DelegatedAdminReceiver"
        android:permission="android.permission.BIND_DELEGATED_ADMIN">
    <intent-filter>
        <action android:name="android.app.admin.action.NETWORK_LOGS_AVAILABLE">
        <action android:name="android.app.action.CHOOSE_PRIVATE_KEY_ALIAS">
    </intent-filter>
    </receiver>

ネットワーク アクティビティ ログ

組織がマルウェアを検出して追跡できるように、DPC はシステムによる TCP 接続と DNS ルックアップをログに記録できます。Android 10 では、完全管理対象デバイスの管理者は、ネットワーク ロギングを専用のアプリに委任できます。

システムがバッチを利用可能にした後にネットワーク ログを取得するには、まず委任アプリが DelegatedAdminReceiver をサブクラス化する必要があります(前述の説明)。サブクラスで、ログを取得するのガイダンスに沿って onNetworkLogsAvailable() コールバックを実装します。

委任アプリは、次の DevicePolicyManager メソッドを呼び出すことができます(admin 引数に null を渡します)。

ログの損失を避けるため、別のアプリに委任する予定がある場合は、DPC でネットワーク ロギングを有効にしないでください。委任アプリは、ネットワーク ログを有効にして収集する必要があります。ネットワーク ロギングを委任した DPC は、onNetworkLogsAvailable() コールバックを受信しなくなります。

委任されたアプリからネットワーク アクティビティ ロギングを報告する方法については、デベロッパー ガイドのネットワーク アクティビティ ロギングをご覧ください。

証明書選択

Android 10 では、完全管理対象デバイス、仕事用プロファイル、セカンダリ ユーザーの管理者は、証明書の選択を専用のアプリに委任できます。

証明書エイリアスを選択するには、まず委任アプリが DelegatedAdminReceiver をサブクラス化する必要があります(前述の説明)。サブクラスで、onChoosePrivateKeyAlias() コールバックを実装し、優先証明書のエイリアスを返すか、ユーザーに証明書の選択を求めるには null を返します。

デバイス管理ポリシーのサポート終了

Android 10 では、アプリと DPC は従来のデバイス管理ポリシーを適用できません。お客様とパートナー様には、フルマネージド デバイスまたは仕事用プロファイルに移行することをおすすめします。以下のポリシーは、Android 10 をターゲットとするデバイス管理から呼び出されると、SecurityException をスローします。

アプリによっては、ユーザーのデバイス管理のためにデバイス管理コンポーネントを利用している場合があります。たとえば、紛失したデバイスのロックやワイプなどです。これを可能にするために、次のポリシーを引き続き使用できます。

これらの変更について詳しくは、デバイス管理のサポート終了をご覧ください。

アプリの新機能

Android 10 をターゲットとするアプリでは、機密データの表示や重要な機能の起動前に、デバイスに設定されている画面ロックの複雑さを照会できます。KeyChain API を呼び出すアプリは動作の改善によるメリットが得られますが、VPN アプリ用の新機能も使用可能です。

画面ロックの品質チェック

Android 10 以降では、画面ロックを必要とする重要な機能を備えたアプリは、デバイスまたは仕事用プロファイルの画面ロックの複雑さをクエリできます。より強力な画面ロックを必要とするアプリでは、システムの画面ロック設定にユーザーを誘導し、セキュリティ設定を更新することができます。

画面ロックの品質をチェックするには:

システムの画面ロック設定を起動するには、ACTION_SET_NEW_PASSWORD と追加の EXTRA_PASSWORD_COMPLEXITY を使用します。インテント エクストラで指定された複雑さを満たしていないオプションはグレー表示されます。ユーザーは利用可能な画面ロック オプションを選択するか、画面を終了できます。

ベスト プラクティス: システム画面ロック ページを起動する前に、アプリにメッセージを表示します。アプリが再開したら、DevicePolicyManager.getPasswordComplexity() を再度呼び出します。より強力な画面ロックが引き続き必要な場合は、ユーザーにセキュリティ設定の更新を何度も求めるのではなく、アクセスを制限します。

VPN アプリにおける HTTP プロキシのサポート

Android 10 では、VPN アプリは VPN 接続に HTTP プロキシを設定できます。HTTP プロキシを追加するには、VPN アプリが VpnService.Builder.setHttpProxy() を呼び出す前に、ホストとポートを指定して ProxyInfo インスタンスを構成する必要があります。システムや多くのネットワーキング ライブラリでこのプロキシ設定が使用されますが、システムがアプリに HTTP リクエストを強制的にプロキシすることはありません。

HTTP プロキシの設定方法を示すサンプルコードについては、ToyVPN サンプルアプリをご覧ください。

VPN サービスモード

VPN アプリは、常時接続の VPN によってサービスが実行されているかどうか、およびロックダウン モードがアクティブかどうかを検出できます。Android 10 で追加された新しいメソッドを使用して、ユーザー インターフェースを調整できます。たとえば、常時接続 VPN がサービスのライフサイクルを制御するときに、接続解除ボタンを無効にできます。

VPN アプリは、サービスに接続してローカル インターフェースを確立した後、次の VpnService メソッドを呼び出します。

  • isAlwaysOn()。常時接続 VPN が原因でシステムがサービスを開始したかどうかを示します。
  • isLockdownEnabled()。VPN を使用しない接続をシステムがブロックしているかどうかを確認します。

サービスの実行中、常時オンのステータスは同じままですが、ロックダウン モードのステータスは変更される可能性があります。

KeyChain の改善

Android 10 では、KeyChain API に関連する改善がいくつか導入されています。

アプリが KeyChain.choosePrivateKeyAlias() を呼び出すと、Android 10 以降のデバイスでは、呼び出しで指定された発行者と鍵アルゴリズムに基づいて、ユーザーが選択できる証明書のリストがフィルタされます。

たとえば、TLS サーバーが TLS handshake の一環として証明書リクエスト メッセージを送信し、ブラウザが KeyChain.choosePrivateKeyAlias() を呼び出した場合、証明書選択プロンプトには発行元パラメータに一致するオプションのみが表示されます。一致するオプションがない場合、またはデバイスに証明書がインストールされていない場合、選択プロンプトは表示されません。

また、KeyChain では、鍵または CA 証明書をインポートする前にデバイスで画面ロックを有効にする必要がなくなりました。