セキュリティ

このガイドの機能では、セキュリティ管理機能について説明します。 Device Policy Controller(DPC)アプリに実装する必要があります。このドキュメント コードサンプルが含まれています。また、Test DPC アプリを Android のエンタープライズ機能のサンプルコードのソースがあります。

DPC アプリは、個人用デバイスまたはデバイス所有者のプロファイル所有者モードで実行できます 有効にする必要があります。以下の表に、利用可能な機能を示します。 DPC がプロファイル所有者モードまたはデバイス所有者モードで実行されている場合:

機能 プロファイル所有者 デバイスの所有者
アプリへのアクセスを無効にする
提供元不明のアプリをブロックする
Google Play でアカウントを制限する
企業向けの出荷時設定へのリセット保護機能を有効にする
企業のプロセスログとリモート バグレポートをモニタリングする
クライアント証明書へのアクセス権の付与と削除
安全なパスコード リセット
仕事用プロファイルのセキュリティに関する課題

アプリへのアクセスを無効にする

従業員がゲームをプレイしたり視聴したりできないようにしたい組織向け 1 日の特定の時間帯に Android デバイスで YouTube を視聴する DPC は特定の曜日にアプリへのアクセスを一時的に無効にできます。

アプリへのアクセスを無効にする場合、デバイス所有者モードまたはプロファイル所有者モードで実行されている DPC setPackagesSuspended() を設定すると、選択したアプリは 無効になっている(Google ランチャーでアプリがグレー表示になる)。ユーザーがアプリをタップすると アプリの停止を知らせるシステム ダイアログが表示されます。

アプリが一時停止されている間は、アクティビティを開始できず、 抑制されます。停止中のパッケージは概要に表示されない 画面ではダイアログ(トーストやスナックバーを含む)を表示できず、 音声を再生したりデバイスをバイブレーションしたりすることはできません。

ランチャーは、 isPackageSuspended() メソッドを使用します。アプリの構成方法について詳しくは、 停止する場合は、setPackagesSuspended をご覧ください。

提供元不明のアプリをブロックする

Google Play(または他の信頼できるアプリストア)からインストールされていないアプリは、 「提供元不明のアプリ」というアプリです。デバイスとデータのリスクが高まる可能性がある ユーザーがアプリをインストールする際に 自動的に適用されます

提供元不明のアプリのインストールを防止するために、 完全管理対象デバイスと仕事用プロファイルにより、 DISALLOW_INSTALL_UNKNOWN_SOURCES のユーザー制限。

仕事用プロファイルのデバイス全体に対する制限

仕事用プロファイルの管理者が DISALLOW_INSTALL_UNKNOWN_SOURCES を追加すると、次のようになります。 この制限は仕事用プロファイルにのみ適用されます。しかし、職場の管理者は デバイス全体に制限を適用する場合は、 Google Play の managed configuration。デバイス全体への制限は、 Android 8.0 以降で利用できます。ただし、インストール済みの Google Play アプリが バージョン 80812500 以降が必要です。

アプリのインストールを Google Play に制限する手順は次のとおりです。

  1. Google Play パッケージの管理対象設定バンドルを設定する com.android.vending
  2. バンドルで、変数のブール値を verify_apps:device_wide_unknown_source_block キー
  3. ENSURE_VERIFY_APPS ユーザー制限を追加します。

次の例は、Google Play がこの機能をサポートしていることを確認する方法を示しています。 設定し、値を true に設定します。

Kotlin

internal val DEVICE_WIDE_UNKNOWN_SOURCES = "verify_apps:device_wide_unknown_source_block"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
var existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS)
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)

Java

static final String DEVICE_WIDE_UNKNOWN_SOURCES =
    "verify_apps:device_wide_unknown_source_block";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS);
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);

システム設定のユーザー インターフェースは有効なままだが、システムがブロックする インストールできます。この制限は、以前のインストール インストール済みのアプリはデバイスに残ります。デバイスのユーザーは引き続きアプリをインストールできます Android Debug Bridge(adb)を使用して個人用プロファイルに追加します。

不明な配信元について詳しくは、他の配信方法に関する記事をご覧ください オプションをご覧ください。

Google Play でアカウントを制限する

組織によっては、ユーザーが個人の Google サービスを追加できるようにしたい場合があります。 (Gmail のメールを読むなどのために)個人用のパスワードは必要ないアカウント アプリをインストールします。DPC では、ユーザーが使用できるアカウントのリストを設定できます Google Play。

完全管理対象デバイスまたは仕事用プロファイルの管理コンポーネントは、 Google Play の管理対象設定で Google Play Console にアクセスできるようにします。アカウント インストールされている Google Play アプリのバージョンが 80970100 の場合、制限を利用できます 以上です。

Google Play でアカウントを制限する手順は次のとおりです。

  1. Google Play パッケージの管理対象設定バンドルを設定する com.android.vending
  2. バンドルで、カンマ区切りのメールアドレスを文字列値として allowed_accounts キーを押します。

次の例は、アカウントを制限する方法を示しています。

Kotlin

internal val ALLOWED_ACCOUNTS = "allowed_accounts"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
val googleAccounts = "ali@gmail.com,ali.connors@example.com"

// Supported in Google Play version 80970100 or higher.
val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

Java

static final String ALLOWED_ACCOUNTS = "allowed_accounts";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
String googleAccounts = "ali@gmail.com,ali.connors@example.com";

// Supported in Google Play version 80970100 or higher.
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Google Play を仕事用アカウントのみに制限するには、allowed_accounts を 単一の管理対象アカウントに直ちにリンクされます。「 空の文字列を使用すると、Google Play でどのアカウントも使用できなくなります。

企業向けの出荷時設定へのリセット保護機能を有効にする

企業向けの出荷時設定へのリセット保護機能を使用することで、組織は Google アカウントで、初期状態にリセットされたデバイスをプロビジョニングできます。

ユーザーによる出荷時設定へのリセット保護機能は、デバイスの盗難を阻止することを目的としています。変更前 不正な出荷時設定へのリセットが行われた後で、誰でもデバイスをプロビジョニングできる EMM を使用する場合など)、設定ウィザードで、ユーザーは 以前にデバイスの個人用プロファイルに登録されていた Google アカウント。

エンタープライズ環境では、出荷時設定へのリセットは 従業員向けデバイスを管理できます。ただし、 組織が従業員のアカウント認証情報を知らない場合、初期状態へのリセット デバイスを別のユーザーに発行する組織の機能をブロックできます。 あります。

初期状態へのリセット後にプロビジョニングを管理する

デバイス所有者モードで実行している場合、DPC は以下を使用できます。 setFactoryResetProtectionPolicy() - デバイスをプロビジョニングする権限があることを確認します。この構成が null または空のリストに設定されている場合、プロビジョニングが許可されたアカウント 初期状態にリセットされたデバイスの個人用プロファイルのアカウントは、 ダウンロードします

DPC は、フルマネージド サービスの有効期間全体を通じてこれらのアカウントを設定できます。 ダウンロードします

  1. IT 管理者は、People API の people.get メソッドを使用できます。 特殊な値 me。これにより、リクエストの userId が取得されます。 表示されます。userID は、resourceName キーで返されます。 整数文字列として people/[userId] の形式で指定します。新しく作成したアカウントは 初期状態へのリセットを目的として、72 時間保持することはできません。
  2. 1 人または複数の IT 管理者がデバイスをロック解除できるよう、 出荷時の設定にリセットします。それぞれの IT 管理者に Google アカウントにログインし、 これらを追加できるように、ステップ 1 に沿ってお子様の userId をあなたと共有します 次のステップでリストに userIds を追加します。
  3. DPC では、 setFactoryResetProtectionPolicy() は、次のタスクを許可する userId のリストを設定します。 初期状態にリセットしたデバイスをプロビジョニングします
  4. DPC により、工場出荷後にデバイスをプロビジョニングできるアカウントが有効になります。 ブロードキャストを送信してリセットします。 com.google.android.gms.auth.FRP_CONFIG_CHANGED(明示的インテントとして) バックグラウンド制限によるドロップを防止できます。

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
val accountIds = listOf("000000000000000000000")

dpm.setFactoryResetProtectionPolicy(
    adminName,
    FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build()
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
List<String> accountIds = new ArrayList<String>();
accountIds.add("000000000000000000000");

dpm.setFactoryResetProtectionPolicy(
    adminName,
    new FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build());

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Legacy

setFactoryResetProtectionPolicy() を使用できないデバイスの場合、 API レベル 30 の場合、DPC は setApplicationRestrictions を使用して 選択したアカウントを factoryResetProtectionAdmin の管理対象設定に追加します。 com.google.android.gms パッケージ。

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false)
newConfig.putString(FACTORY_RESET_PROTECTION_ADMIN, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false);
newConfig.putStringArray(FACTORY_RESET_PROTECTION_ADMIN,
        accountIds.toArray(new String[accountIds.size()]));
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

企業向けの出荷時設定へのリセット保護機能を無効にする

出荷時設定へのリセット保護機能を無効にするには、DPC に以下のコマンドを使用します。 setFactoryResetProtectionPolicy()null を渡します。

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Legacy

setFactoryResetProtectionPolicy() を使用できないデバイスの場合、 API レベル 30 の場合、DPC は setApplicationRestrictions を使用してキーを設定できます。 マネージド disableFactoryResetProtectionAdmin 内の true の値 com.google.android.gms パッケージの構成。

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true)

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true);

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

企業のプロセスログとリモートバグレポートを監視する

管理者は EMM コンソールで、エンタープライズ プロセスログやリモートバグレポートなどです

企業デバイスのアクティビティを記録する

デバイス所有者モードで実行されている DPC は、リモートで疑わしいアクティビティを特定できます デバイスのアクティビティ(アプリの起動、Android Debug Bridge(adb)など)を追跡する 画面ロック解除などですプロセスログではユーザーの同意は必要ありません。

ロギングを有効または無効にするには、DPC で setSecurityLoggingEnabled() を呼び出します。

新しいログのバッチが利用可能になると、DeviceAdminReceiveronSecurityLogsAvailable() コールバック。ログを取得するには コールバックを受信すると、DPC は retrieveSecurityLogs() を呼び出します。

DPC は retrievePreRebootSecurityLogs() を呼び出してセキュリティを取得することもできます。 が生成されます。これは、予測値と正解値の 前回のデバイスの再起動とその前の再起動の履歴。非対応のデバイス retrieveSecurityLogs()null を返します。両方を使用してログを取得する場合、 retrievePreRebootSecurityLogs()retrieveSecurityLogs() を使用するには、 重複エントリがないか確認します
注: この機能で記録されるのは、1 つのデバイスに 1 つの ユーザーまたはデバイスの関連ユーザー。この機能は デバイス全体のアクティビティを記録するため。

この設定は、セキュリティ イベント後の監査で役立ちます。 次のタイプのアクション:

  • アプリの初回起動時に毎回。これにより、 マルウェアから保護します
  • デバイスでのロック解除に失敗した。これにより、特定のリソースに 短時間に数回のロック解除に失敗した。
  • ユーザーが接続したときに有害な可能性がある adb コマンド USB ケーブルを使ってデバイスをパソコンに接続できます。

ログの読み方の詳細については、SecurityLog をご覧ください。

開発中やテスト中に、任意の構成をシステムに強制して、 既存のセキュリティ ログを DPC に表示できます。 使用します。Android 9.0(API レベル 28)以降では、次のコマンドを実行します。 Android Debug Bridge(adb)コマンドをターミナルで実行します。

adb shell dpm force-security-logs

このツールの使用頻度はシステムによって制限され、 意図的に遅くなる場合があります利用可能なログがある場合は、 DPC が onSecurityLogsAvailable() コールバックを受信します。

バグレポートをリモートでリクエストする

デバイス所有者モードで実行されている DPC は、ユーザーのバグレポートをリモートでリクエストできます ユーザーが 1 人または関連付けられたユーザーがいるデバイス。バグレポートには バグレポートをリクエストした瞬間にデバイスのアクティビティを確認できますが、 logcat の頻度によっては、直近の数時間のアクティビティが含まれる 発生します。

バグレポートをリモートでリクエストするには、DPC が requestBugreport() を呼び出します。

クライアント証明書へのアクセス権の付与と削除

プロファイル所有者モードまたはデバイス所有者モードで実行されている DPC でサードパーティ製アプリを許可する場合 権限がある一方で、アプリケーション自体に証明書へのアクセス権を付与し、 証明書を安全に管理できます。インストールの手順は次のとおりです。 プロファイル内のすべてのアプリがアクセスできる証明書が必要な場合は、installKeyPair() を使用します。

構成するパラメータについては、installKeyPair() をご覧ください。この機能 既存の API と連携して証明書を管理します。

デプロイ シナリオ

installKeyPair() メソッドを使用しない場合:

  • 毎回、証明書の名前をタップして [許可] をタップする必要があります。 許可したい場合もあるでしょう。
  • 証明書のインストール時にメッセージが表示され、 あります。

installKeyPair() メソッドの場合:

  • ユーザーは、アクセスを許可するたびに [許可] をタップする必要はない あります。
  • ユーザーは証明書の名前を変更できません。
  • 管理者は、組織向けの証明書をブロックしたり、 許可するアプリを制限できます。

クライアント証明書を削除する

クライアント証明書へのアクセスを許可した後、リモートでクライアントを削除する installKeyPair() を通じてインストールされた証明書、 removeKeyPair()

デバイス所有者モードまたはプロファイル所有者モードで実行されている、または委任された DPC 証明書のインストーラは removeKeyPair() を呼び出すことができます。これにより、 証明書と秘密鍵のペアが、特定の秘密鍵エイリアスにインストールされていることが通知されます。

デプロイ シナリオ

組織がより安全な形式のクライアントに移行する場合に、この機能を使用します。 あります。管理者が新しい証明書をロールアウトした場合とその配布 時間がかかる場合、管理者は非推奨の API を取り消すことができます。 管理すると便利です。

安全なパスコードのリセット

DPC は、 トークンです。デバイス所有者とプロファイル所有者は安全な通話が可能 デバイスと仕事用プロファイルのパスワードを変更するためのパスコード リセット API できます。安全なパスコード リセットは、resetPassword() を 次のような点が改善されています。

DPC ビルドが Android 8.0(API)をターゲットにしている場合は、安全なパスコード リセットを使用する必要があります。 レベル 26)以降である必要があります。resetPassword() を呼び出すと、 Android 8.0 以降をターゲットとする DPC では SecurityException になるため、 DPC の更新が必要です

トークンを設定して有効にする

DPC は、パスワードを再設定する前にトークンを設定して有効にする必要があります。なぜなら、 DPC がトークンをすぐに使用できない可能性がある場合は、 必要になる場合があります。

パスワード リセット トークンは暗号的に強いランダムな値であり、 長さが 32 バイト以上であること。デバイスとプロファイルごとにトークンを作成します。 トークンを再利用または共有できます。

トークン、または暗号化されたトークンを復号する手段は、 あります。トークンを認証情報暗号化ストレージにローカルに保存すると、 ユーザーがデバイスまたはプロファイルのロックを解除するまで、パスワードを再設定することはできません。もし トークンをデバイス暗号化ストレージにローカルに保存すると、 攻撃者は、トークンを使用して仕事用プロファイルやプライマリ アカウントへのアクセス権を取得する できます。

DPC で新しいトークンを生成するか、サーバーからトークンを取得できます。「 以下の例は、DPC がトークン自体を生成し、それを server:

Kotlin

val token = ByteArray(32)

// Generate a new token
val random = SecureRandom()
random.nextBytes(token)

// Set the token to use at a later date
val success: Boolean
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(context), token)

// Activate the token and update success variable...

// Store the token on a server
if (success) {
 sendTokenToServer(token)
}

Java

byte token[] = new byte[32]; // Minimum size token accepted

// Generate a new token
SecureRandom random = new SecureRandom();
random.nextBytes(token);

// Set the token to use at a later date
boolean success;
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(getContext()), token);

// Activate the token and update success variable ...

// Store the token on a server
if (success) {
 sendTokenToServer(token);
}

ほとんどの場合、DPC はトークンを設定した後に有効にする必要があります。ただし、 ユーザーがロック画面のパスワードを持っていない場合、 使用できますトークンを有効にするには、認証情報を確認するようユーザーに依頼します。 DPC から KeyguardManager メソッドを呼び出すことができる createConfirmDeviceCredentialIntent()Intent 表示されます。ユーザー インターフェースでデバイスのユーザーに、 認証を求められます。以下のスニペットは、コンバージョン アクションを 追加することをおすすめします。

Kotlin

// In your DPC, you'll need to localize the user prompt
val ACTIVATE_TOKEN_PROMPT = "Use your credentials to enable remote password reset"
val ACTIVATE_TOKEN_REQUEST = 1

// Create or fetch a token and set it in setResetPasswordToken() ...
val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(null, ACTIVATE_TOKEN_PROMPT)

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST)
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

Java

// In your DPC, you'll need to localize the user prompt
static final String ACTIVATE_TOKEN_PROMPT =
 "Use your credentials to enable remote password reset";
static final int ACTIVATE_TOKEN_REQUEST = 1;

// Create or fetch a token and set it in setResetPasswordToken() ...

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
Intent confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(
  null, ACTIVATE_TOKEN_PROMPT);

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST);
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

デバイスの再起動前に、DPC で設定したトークンを有効にする必要があります。Android アクティブ化されていないトークンをメモリに保存し、 再起動します。トークンを有効にする前にユーザーがデバイスを再起動すると、DPC は 同じトークンを再度設定するか、新しいトークンを生成してください。

DPC は、次の呼び出しによってトークンが有効であることを確認できます。 isResetPasswordTokenActive()。結果を確認すると true になります。

DPC がトークンを設定して有効にした後、そのトークンは、DPC で削除または有効化されるまで有効です。 がトークンを置き換えます(またはデバイスが出荷時設定にリセットされます)。トークンは、トレーニングの 暗号化され、ユーザーがパスワードを変更または消去しても影響を受けません。

トークンを削除する

clearResetPasswordToken() を呼び出すと、DPC によって送信されたトークンを削除できます。 使用します。侵害されたトークンを取り消す必要がある場合や、 パスワードを再設定できないようにします。以下のサンプルは、 これを DPC に追加します。

Kotlin

val dpm = getDpm()
val admin = DeviceAdminReceiver.getComponentName(requireActivity())

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

Java

DevicePolicyManager dpm = getDpm();
ComponentName admin = DeviceAdminReceiver.getComponentName(getActivity());

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

パスワードをリセットする

IT 管理者がパスワードを再設定する必要がある場合は、 resetPasswordWithToken() を選択し、DPC が設定して有効にしたトークンを渡します。 事前:

Kotlin

val token: ByteArray = getTokenFromServer()
val newPassword = "password"

try {
 val result: Boolean = dpm.resetPasswordWithToken(
 DeviceAdminReceiver.getComponentName(requireContext()),
 newPassword,
 token,
 0
 )

 if (result) {
 // The password is now 'password'
 } else {
 // Using 'password' doesn't meet password restrictions
 }
} catch (e: IllegalStateException) {
 // The token doesn't match the one set earlier.
}

Java

byte token[] = getTokenFromServer();
String newPassword = "password";

try {
 boolean result = dpm.resetPasswordWithToken(
  DeviceAdminReceiver.getComponentName(getContext()), newPassword, token, 0);

 if (result) {
 // The password is now 'password'
 } else {
 // Using `password` doesn't meet password restrictions
 }
} catch (IllegalStateException e) {
 // The token doesn't match the one set earlier.
}

resetPasswordWithToken() を呼び出すと false が返されますが、パスワードは返されません。 新しいパスワードが次の制約を満たさない場合、変更されます。

  • 文字数が最小パスワード長の制約を満たしている。発信 getPasswordMinimumLength(): IT 部門が 長さの制約を設定しました。
  • パスワードの文字の範囲と複雑さが構成を満たしている あります。getPasswordQuality() に電話して、IT 部門が 構成の制約を設定しました。

パスワードの品質の制約によりパスワードの設定が不要な場合は、 null または空の文字列を resetPasswordWithToken() に渡して、 あります。

仕事用プロファイルのセキュリティ チャレンジ

プロファイル所有者モードで実行されている DPC では、ユーザーにセキュリティの指定を求めることができます。 仕事用プロファイルで実行されているアプリのチャレンジもあります。セキュリティは ユーザーが仕事用アプリを開こうとしたときに確認メッセージが表示されます。ユーザーが セキュリティ チャレンジを完了すると、仕事用プロファイルのロックが解除され、 必要に応じて復号されます。

仕事用プロファイルのセキュリティ チャレンジの仕組み

  1. DPC が ACTION_SET_NEW_PASSWORD インテントを送信すると、次のプロンプトが表示されます。 セキュリティ チャレンジを設定できます。
  2. DPC は、ACTION_SET_NEW_PARENT_PROFILE_PASSWORD デバイスロックを設定するようユーザーに促すインテントです。

DPC は、仕事用プロファイルの要求とは異なるパスワード ポリシーを 適用できます。たとえば、長さの最小値を デバイス チャレンジ応答の長さは、他のアプリケーションに必要な長さと できます。DPC は、通常の DevicePolicyManager メソッド(setPasswordQuality()setPasswordMinimumLength()

考慮事項

  • DPC は仕事用プロファイルのパスワードを再設定できますが、 パスワードも取得できます。ユーザーが仕事用と個人用のパスワードを設定することを選択した場合 同じ場合、仕事用プロファイルの resetPassword() で パスワードは仕事用プロファイルでのみ再設定する必要があり、同じパスワードは デバイスのロック画面用として設定します。
  • DPC は、以下を使用して仕事用チャレンジの認証情報画面をカスタマイズできます。 setOrganizationColor()setOrganizationName()
  • デバイス管理者は resetPassword() を使用してパスワードの消去や変更を行うことはできません。 すでに設定されているものを確認できますデバイス管理者がパスワードを設定できますが、 デバイスにパスワード、PIN、またはパターンが設定されていない場合。

詳細については、getParentProfileInstance() とリファレンス DevicePolicyManager のドキュメントをご覧ください。