ความปลอดภัย

ฟีเจอร์ในคู่มือนี้จะอธิบายความสามารถในการจัดการความปลอดภัยที่คุณทำสิ่งต่อไปนี้ได้ ใช้ในแอปเครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) เอกสารนี้ มีตัวอย่างโค้ดและคุณยังใช้แอป Test DPC เป็น แหล่งที่มาของโค้ดตัวอย่างสำหรับฟีเจอร์ระดับองค์กรของ Android

แอป DPC สามารถทำงานในโหมดเจ้าของโปรไฟล์ในอุปกรณ์ส่วนตัวหรือในอุปกรณ์เจ้าของ ในอุปกรณ์ที่มีการจัดการครบวงจร ตารางนี้ระบุฟีเจอร์ที่พร้อมใช้งาน เมื่อ DPC ทำงานในโหมดเจ้าของโปรไฟล์หรือโหมดเจ้าของอุปกรณ์ ให้ทำดังนี้

ฟีเจอร์ เจ้าของโปรไฟล์ เจ้าของอุปกรณ์
ปิดการเข้าถึงแอป
บล็อกแอปจากแหล่งที่มาที่ไม่รู้จัก
จำกัดบัญชีใน Google Play
เปิดใช้การป้องกันการรีเซ็ตเป็นค่าเริ่มต้นสำหรับองค์กร
ตรวจสอบบันทึกกระบวนการขององค์กรและรายงานข้อบกพร่องระยะไกล
ให้สิทธิ์เข้าถึงและนำสิทธิ์เข้าถึงใบรับรองไคลเอ็นต์ออก
รีเซ็ตรหัสผ่านที่ปลอดภัย
การยืนยันตัวตนเพื่อความปลอดภัยของโปรไฟล์งาน

ปิดการเข้าถึงแอป

สำหรับองค์กรที่ต้องการบล็อกไม่ให้พนักงานเล่นเกมหรือรับชม YouTube บนอุปกรณ์ที่ใช้ระบบ Android ในช่วงเวลาใดเวลาหนึ่งของวัน หรือ บางวันของสัปดาห์ DPC สามารถปิดการเข้าถึงแอปชั่วคราวได้

หากต้องการปิดการเข้าถึงแอป ให้ใช้ DPC ที่ทำงานในโหมดเจ้าของอุปกรณ์หรือโหมดเจ้าของโปรไฟล์ กําหนดค่า setPackagesSuspended() จากนั้นแอปที่เลือกจะทําหน้าที่เสมือน ถูกปิดใช้ (Google Launcher จะทำให้แอปเป็นสีเทา) เมื่อผู้ใช้แตะแอป ผู้ใช้จะเห็นกล่องโต้ตอบของระบบแจ้งว่าแอปถูกระงับ

ขณะแอปถูกระงับ แอปจะเริ่มกิจกรรมและการแจ้งเตือนไปยัง แพ็กเกจที่ถูกระงับ แพ็กเกจที่ถูกระงับไม่ปรากฏในภาพรวม หน้าจอจะไม่แสดงกล่องโต้ตอบ (รวมถึงข้อความโทสต์และแถบแสดงข้อความ) และ ไม่สามารถเล่นเสียงหรือสั่นของอุปกรณ์

Launcher ตรวจสอบได้ว่ามีการระงับแอปหรือไม่โดยเรียกใช้ isPackageSuspended() สำหรับรายละเอียดเกี่ยวกับวิธีกำหนดค่าแอป การระงับ โปรดดู setPackagesSuspended

บล็อกแอปจากแหล่งที่มาที่ไม่รู้จัก

แอปที่ไม่ได้มาจาก Google Play (หรือ App Store อื่นๆ ที่เชื่อถือได้) จะ ที่เรียกว่าแอปจากแหล่งที่มาที่ไม่รู้จัก อุปกรณ์และข้อมูลอาจมีความเสี่ยงมากขึ้น เมื่อมีคนติดตั้งแอปเหล่านี้

เพื่อป้องกันไม่ให้ผู้อื่นติดตั้งแอปจากแหล่งที่มาที่ไม่รู้จัก คอมโพเนนต์ผู้ดูแลระบบของ อุปกรณ์ที่มีการจัดการครบวงจรและโปรไฟล์งานสามารถเพิ่ม ข้อจำกัดของผู้ใช้ DISALLOW_INSTALL_UNKNOWN_SOURCES

การจำกัดทั้งอุปกรณ์ของโปรไฟล์งาน

เมื่อผู้ดูแลระบบของโปรไฟล์งานเพิ่ม DISALLOW_INSTALL_UNKNOWN_SOURCES ข้อจำกัดดังกล่าวจะมีผลกับโปรไฟล์งานเท่านั้น แต่ผู้ดูแลงาน สามารถวางข้อจำกัด สำหรับทั้งอุปกรณ์ได้โดยการตั้งค่า การกำหนดค่าที่มีการจัดการสำหรับ Google Play ข้อจำกัดของทั้งอุปกรณ์คือ ใช้ได้ใน 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 ที่ติดตั้งไว้เป็นเวอร์ชัน 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 เป็น บัญชีที่จัดการบัญชีเดียวทันทีที่ DPC ทราบที่อยู่อีเมลของบัญชี CANNOT TRANSLATE สตริงว่าง จะป้องกันไม่ให้ผู้คนใช้บัญชีใดๆ ใน Google Play

เปิดใช้การป้องกันการรีเซ็ตเป็นค่าเริ่มต้นสำหรับองค์กร

องค์กรจะใช้การป้องกันการรีเซ็ตเป็นค่าเริ่มต้นสำหรับองค์กรได้ บัญชี Google สามารถจัดสรรอุปกรณ์ที่ได้รับการรีเซ็ตเป็นค่าเริ่มต้นได้

การป้องกันการรีเซ็ตเป็นค่าเริ่มต้นสำหรับผู้บริโภคได้รับการออกแบบมาเพื่อป้องกันการโจรกรรมอุปกรณ์ ก่อน การอนุญาตให้ผู้อื่นจัดสรรอุปกรณ์หลังจากการรีเซ็ตเป็นค่าเริ่มต้นโดยไม่ได้รับอนุญาต (เช่น เช่นเดียวกับการใช้ EMM) วิซาร์ดการตั้งค่าจะกำหนดให้ผู้ใช้ตรวจสอบสิทธิ์กับ บัญชี Google ที่เคยอยู่ในโปรไฟล์ส่วนตัวของอุปกรณ์

ในกรณีขององค์กร การรีเซ็ตเป็นค่าเริ่มต้นเป็นเครื่องมือสำคัญในการจัดการ อุปกรณ์ของพนักงานเมื่อพนักงานลาออกจากองค์กร อย่างไรก็ตาม หาก องค์กรไม่ทราบข้อมูลเข้าสู่ระบบบัญชีของพนักงาน ให้รีเซ็ตเป็นค่าเริ่มต้น อาจบล็อกความสามารถในการออกอุปกรณ์ให้เครื่องอื่นขององค์กร

ควบคุมการจัดสรรหลังจากรีเซ็ตเป็นค่าเริ่มต้น

เมื่อทำงานในโหมดเจ้าของอุปกรณ์ DPC สามารถใช้ setFactoryResetProtectionPolicy() เพื่อควบคุมบัญชีที่จะ ได้รับอนุญาตให้จัดสรรอุปกรณ์หลังจากการรีเซ็ตเป็นค่าเริ่มต้น หากการกำหนดค่านี้ ตั้งค่าเป็น null หรือตั้งค่าเป็นรายการว่างเปล่า บัญชีที่ได้รับสิทธิ์ให้จัดสรร อุปกรณ์หลังจากรีเซ็ตเป็นค่าเริ่มต้น คือบัญชีในโปรไฟล์ส่วนตัวของ อุปกรณ์

DPC สามารถกำหนดค่าบัญชีเหล่านี้ตลอดอายุการใช้งานที่มีการจัดการครบวงจร อุปกรณ์

  1. ผู้ดูแลระบบไอทีสามารถใช้เมธอด people.get จาก People API ได้ ด้วยค่าพิเศษ me การดำเนินการนี้จะดึงข้อมูล userId สำหรับ ลงชื่อเข้าใช้แล้ว ระบบจะแสดงผล userID ในคีย์ resourceName ใน รูปแบบ people/[userId] เป็นสตริงจำนวนเต็ม บัญชีที่สร้างขึ้นใหม่อาจ ไม่สามารถรีเซ็ตเป็นค่าเริ่มต้นได้เป็นเวลา 72 ชั่วโมง
  2. นอกจากนี้ คุณยังอาจต้องการอนุญาตให้ผู้ดูแลระบบไอทีอย่างน้อย 1 คนปลดล็อกอุปกรณ์ได้หลังจาก การรีเซ็ตเป็นค่าเริ่มต้น ให้ผู้ดูแลระบบไอทีแต่ละคนเข้าสู่ระบบบัญชี 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);

รุ่นเดิม

สำหรับอุปกรณ์ที่ใช้ 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);

รุ่นเดิม

สำหรับอุปกรณ์ที่ใช้ setFactoryResetProtectionPolicy() ไม่ได้ ขอแนะนำด้วย API ระดับ 30 DPC ของคุณจะใช้ setApplicationRestrictions เพื่อตั้งค่าคีย์ได้ ค่า true ใน disableFactoryResetProtectionAdmin ที่จัดการ การกำหนดค่าสำหรับแพ็กเกจ 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 ผู้ดูแลระบบจะตรวจสอบอุปกรณ์ที่มีการจัดการครบวงจรได้โดยใช้ Enterprise บันทึกการประมวลผลและรายงานข้อบกพร่องระยะไกล

บันทึกกิจกรรมของอุปกรณ์ขององค์กร

DPC ที่ทำงานในโหมดเจ้าของอุปกรณ์สามารถระบุกิจกรรมที่น่าสงสัยจากระยะไกล การติดตามกิจกรรมของอุปกรณ์ รวมถึงการเปิดแอป, Android Debug Bridge (adb) กิจกรรม และการปลดล็อกด้วยหน้าจอ บันทึกกระบวนการไม่จำเป็นต้องได้รับความยินยอมจากผู้ใช้

หากต้องการเปิดหรือปิดใช้การบันทึก ให้ DPC เรียกใช้ setSecurityLoggingEnabled()

เมื่อมีบันทึกกลุ่มใหม่ DeviceAdminReceiver จะได้รับพารามิเตอร์ การติดต่อกลับของ onSecurityLogsAvailable() ในการเรียกบันทึก (หลังจาก ได้รับการติดต่อกลับ) การโทรของ DPC retrieveSecurityLogs()

DPC ยังเรียกใช้ retrievePreRebootSecurityLogs() เพื่อดึงข้อมูลความปลอดภัยได้ด้วย บันทึกที่สร้างขึ้นในรอบการรีบูตก่อนหน้านี้ นี่คือช่วงเวลาระหว่าง การรีบูตอุปกรณ์ครั้งสุดท้ายและการรีบูตก่อนหน้า อุปกรณ์ที่ไม่รองรับ retrieveSecurityLogs() แสดงผล null หากแอปเรียกบันทึกโดยใช้ทั้ง 2 อย่าง retrievePreRebootSecurityLogs() และ retrieveSecurityLogs() คุณต้องดำเนินการ ตรวจหารายการที่ซ้ำกัน
หมายเหตุ: ฟีเจอร์นี้จะบันทึกกิจกรรมในอุปกรณ์ที่มีการจัดการครบวงจรเท่านั้น ผู้ใช้หรือผู้ใช้ที่เชื่อมโยงในอุปกรณ์ ฟีเจอร์นี้ใช้ไม่ได้ใน อุปกรณ์ส่วนตัว เนื่องจากบันทึกกิจกรรมของทั้งอุปกรณ์

การตั้งค่านี้มีประโยชน์ในการตรวจสอบหลังเหตุการณ์ความปลอดภัย เนื่องจากจะบันทึก ประเภทการดำเนินการต่อไปนี้

  • ทุกครั้งที่แอปเริ่มต้นใหม่ ซึ่งจะช่วยระบุได้ว่า มัลแวร์ที่เริ่มจากแอปที่ถูกบุกรุก
  • การปลดล็อกในอุปกรณ์ไม่สำเร็จ ข้อมูลนี้สามารถระบุได้ว่ามี ความพยายามปลดล็อกที่ไม่สำเร็จหลายครั้งในระยะเวลาสั้นๆ
  • คำสั่ง adb ที่อาจเป็นอันตรายเมื่อผู้ใช้เชื่อมต่อ อุปกรณ์กับคอมพิวเตอร์โดยใช้สาย USB

โปรดดูรายละเอียดเกี่ยวกับวิธีอ่านบันทึกที่ SecurityLog

ในระหว่างที่คุณพัฒนาและทดสอบ คุณสามารถบังคับให้ระบบดำเนินการ บันทึกความปลอดภัยที่มีอยู่ซึ่งใช้ได้กับ DPC ของคุณ คุณไม่จำเป็นต้องรอ กลุ่ม ใน Android 9.0 (API ระดับ 28) ขึ้นไป ให้เรียกใช้สิ่งต่อไปนี้ คำสั่ง Android Debug Bridge (adb) ในเทอร์มินัล

adb shell dpm force-security-logs

ระบบจะจำกัดความถี่ในการใช้เครื่องมือและรายงาน การชะลอโดยเจตนาในเอาต์พุตเทอร์มินัล หากมีบันทึกอยู่ ระบบจะดำเนินการ DPC จะได้รับการติดต่อกลับจาก onSecurityLogsAvailable()

ขอรายงานข้อบกพร่องจากระยะไกล

DPC ที่ทำงานในโหมดเจ้าของอุปกรณ์สามารถขอรายงานข้อบกพร่องให้ผู้ใช้จากระยะไกลได้ อุปกรณ์ที่มีผู้ใช้เพียงรายเดียวหรือผู้ใช้ที่เชื่อมโยงเท่านั้น รายงานข้อบกพร่องบันทึก กิจกรรมของอุปกรณ์ ณ เวลาที่ขอรายงานข้อบกพร่องทันที แต่ก็อาจ รวมกิจกรรมจากไม่กี่ชั่วโมงก่อนหน้านี้ โดยขึ้นอยู่กับความถี่ที่ Logcat และรีเฟรชบัฟเฟอร์

หากต้องการขอรายงานข้อบกพร่องจากระยะไกล การเรียก DPC requestBugreport() จะมีลักษณะดังนี้

  • หากผู้ใช้ยอมรับการแชร์รายงานข้อบกพร่อง DPC จะได้รับข้อบกพร่อง รายงานโดยใช้ onBugreportShared()
  • หากผู้ใช้ปฏิเสธการแชร์รายงานข้อบกพร่อง DPC จะได้รับการแชร์ ข้อความที่ถูกปฏิเสธคำขอโดยใช้ onBugreportSharingDeclined()
  • หากรายงานข้อบกพร่องไม่สำเร็จ DPC จะเห็น onBugreportFailed() ที่มี BUGREPORT_FAILURE_FAILED_COMPLETING หรือ BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE

ให้สิทธิ์เข้าถึงและนำสิทธิ์เข้าถึงใบรับรองไคลเอ็นต์ออก

หาก DPC ที่ทำงานอยู่ในโหมดเจ้าของโปรไฟล์หรือเจ้าของอุปกรณ์ให้สิทธิ์แอปของบุคคลที่สาม การจัดการใบรับรอง แอปก็สามารถให้สิทธิ์เข้าถึง ใบรับรองที่ติดตั้งโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ วิธีติดตั้ง ว่าแอปทั้งหมดในโปรไฟล์เข้าถึงได้ ให้ใช้ installKeyPair()

สำหรับพารามิเตอร์ที่จะกำหนดค่า โปรดดู installKeyPair() ฟีเจอร์นี้ ทำงานร่วมกับ API ที่มีอยู่สำหรับการจัดการใบรับรอง

สถานการณ์การติดตั้งใช้งาน

หากไม่มีเมธอด installKeyPair():

  • ผู้ใช้ต้องแตะชื่อใบรับรองแล้วแตะอนุญาตทุกครั้ง ที่ตนต้องการให้สิทธิ์เข้าถึงใบรับรอง
  • ผู้ใช้จะเห็นข้อความแจ้งเมื่อติดตั้งใบรับรองและต้องตั้งชื่อ ใบรับรอง

โดยใช้เมธอด installKeyPair():

  • ผู้ใช้ไม่จำเป็นต้องแตะอนุญาตทุกครั้งที่ต้องการให้สิทธิ์เข้าถึง ใบรับรอง
  • ผู้ใช้จะเปลี่ยนชื่อใบรับรองไม่ได้
  • ผู้ดูแลระบบสามารถควบคุมได้มากขึ้นว่าจะบล็อกใบรับรองสำหรับ แอปที่ไม่ควรมีสิทธิ์เข้าถึงใบรับรองบางรายการ

นำใบรับรองไคลเอ็นต์ออก

หลังจากให้สิทธิ์เข้าถึงใบรับรองไคลเอ็นต์แล้ว ในการนำไคลเอ็นต์ออกจากระยะไกล ใบรับรองที่ติดตั้งผ่าน installKeyPair() โทร removeKeyPair()

DPC ที่ทำงานในโหมดเจ้าของอุปกรณ์หรือโหมดเจ้าของโปรไฟล์ หรือที่ได้รับมอบอำนาจ โปรแกรมติดตั้งใบรับรองสามารถเรียกใช้ removeKeyPair() การดำเนินการนี้จะนำ ใบรับรองและคู่คีย์ส่วนตัวที่ติดตั้งภายใต้ชื่อแทนคีย์ส่วนตัวที่กำหนด

สถานการณ์การติดตั้งใช้งาน

ใช้ฟีเจอร์นี้หากองค์กรกำลังย้ายข้อมูลไปยังไคลเอ็นต์รูปแบบที่ปลอดภัยกว่า ใบรับรอง หากผู้ดูแลระบบเปิดตัวใบรับรองใหม่ และการเผยแพร่ใบรับรอง ต้องใช้เวลานานมาก ผู้ดูแลระบบสามารถเพิกถอน หลังจากการย้ายข้อมูลเสร็จสมบูรณ์

รีเซ็ตรหัสผ่านที่ปลอดภัย

DPC ของคุณสามารถรีเซ็ตรหัสผ่านของผู้ใช้โดยการให้สิทธิ์การเปลี่ยนแปลงด้วย โทเค็นที่ปลอดภัยที่ลงทะเบียนล่วงหน้า เจ้าของอุปกรณ์และเจ้าของโปรไฟล์จะโทรหาที่ปลอดภัยได้ API การรีเซ็ตรหัสผ่านเพื่อเปลี่ยนรหัสผ่านของอุปกรณ์และโปรไฟล์งาน ตามลำดับ การรีเซ็ตรหัสผ่านที่ปลอดภัยจะแทนที่ resetPassword() ด้วย การปรับปรุงต่อไปนี้

คุณควรใช้การรีเซ็ตรหัสผ่านที่ปลอดภัยหากบิลด์ DPC กำหนดเป้าหมายเป็น Android 8.0 (API ระดับ 26) ขึ้นไป การโทรหา resetPassword() จะขว้าง SecurityException ใน DPC ที่กำหนดเป้าหมายเป็น Android 8.0 ขึ้นไป คุณอาจ ต้องอัปเดต DPC

ตั้งค่าและเปิดใช้งานโทเค็น

DPC จะต้องตั้งค่าและเปิดใช้งานโทเค็นก่อนรีเซ็ตรหัสผ่าน เพราะ DPC ของคุณอาจใช้โทเค็นทันทีไม่ได้ คุณต้องตั้งค่าโทเค็น ก่อนที่ผู้ดูแลระบบไอทีอาจต้องใช้

โทเค็นรีเซ็ตรหัสผ่านเป็นค่าแบบสุ่มที่มีการเข้ารหัสที่รัดกุมและต้อง มีความยาวอย่างน้อย 32 ไบต์ สร้างโทเค็นสำหรับอุปกรณ์และโปรไฟล์แต่ละรายการ อย่าสร้าง ใช้ซ้ำหรือแชร์โทเค็นที่สร้างขึ้น

เราขอแนะนำให้จัดเก็บโทเค็น หรือวิธีการถอดรหัสโทเค็นที่เข้ารหัสไว้ เซิร์ฟเวอร์ DPC หากคุณจัดเก็บโทเค็นไว้ในพื้นที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบ รีเซ็ตรหัสผ่านไม่ได้จนกว่าผู้ใช้จะปลดล็อกอุปกรณ์หรือโปรไฟล์ หากคุณ จัดเก็บโทเค็นไว้ในพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ซึ่งจะถูกบุกรุก ผู้โจมตีอาจใช้โทเค็นเพื่อรับสิทธิ์เข้าถึงโปรไฟล์งานหรือโปรไฟล์หลัก ผู้ใช้

คุณสร้างโทเค็นใหม่ใน DPC หรือดึงข้อมูลโทเค็นจากเซิร์ฟเวอร์ได้ ตัวอย่างด้านล่างแสดง DPC ที่สร้างโทเค็นเองและรายงานไปยัง เซิร์ฟเวอร์:

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 ที่เริ่มต้น ยืนยัน อธิบายให้ผู้ใช้อุปกรณ์ทราบในอินเทอร์เฟซผู้ใช้ว่าทำไมคุณจึง เพื่อขอให้ตรวจสอบสิทธิ์ ข้อมูลโค้ดด้านล่างแสดงวิธีที่คุณอาจเปิดใช้งาน โทเค็นใน DPC

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 ของคุณก่อนที่อุปกรณ์จะรีบูต แอนดรอยด์ จัดเก็บโทเค็นที่ไม่ได้เปิดใช้งานในหน่วยความจำและจะไม่เก็บโทเค็นไว้หลังจาก รีบูต หากผู้ใช้รีบูตอุปกรณ์ก่อนเปิดใช้งานโทเค็น 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 ...
}

รีเซ็ตรหัสผ่าน

เมื่อผู้ดูแลระบบไอทีต้องการรีเซ็ตรหัสผ่าน โปรดโทร 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() เพื่อดูว่าฝ่ายไอที ผู้ดูแลระบบได้ตั้งข้อจำกัดด้านความยาว
  • ช่วงและความซับซ้อนของอักขระในรหัสผ่านมาบรรจบกัน ข้อจำกัด โทรติดต่อ getPasswordQuality() เพื่อสอบถามว่าฝ่ายไอที ผู้ดูแลระบบได้ตั้งค่าข้อจำกัดในการเรียบเรียง

หากข้อจำกัดด้านคุณภาพรหัสผ่านไม่กำหนดให้ต้องตั้งรหัสผ่าน ให้ทำดังนี้ ส่ง null หรือสตริงว่างไปยัง resetPasswordWithToken() เพื่อนำแอตทริบิวต์ รหัสผ่าน

การยืนยันความปลอดภัยของโปรไฟล์งาน

DPC ที่ทำงานในโหมดเจ้าของโปรไฟล์อาจกำหนดให้ผู้ใช้ระบุความปลอดภัยได้ สำหรับแอปที่ทำงานในโปรไฟล์งาน ระบบจะแสดงระบบความปลอดภัย เมื่อผู้ใช้พยายามเปิดแอปงาน หากผู้ใช้ดำเนินการสำเร็จ ดำเนินการตามมาตรการรักษาความปลอดภัยจนเสร็จสมบูรณ์ ระบบจะปลดล็อกโปรไฟล์งาน เพื่อถอดรหัสได้หากจำเป็น

วิธีการทำงานของคำถามเพื่อความปลอดภัยของโปรไฟล์งาน

  1. หาก DPC ส่ง Intent 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