ฟีเจอร์ในคู่มือนี้จะอธิบายความสามารถในการจัดการความปลอดภัยที่คุณทำสิ่งต่อไปนี้ได้ ใช้ในแอปเครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) เอกสารนี้ มีตัวอย่างโค้ดและคุณยังใช้แอป Test DPC เป็น แหล่งที่มาของโค้ดตัวอย่างสำหรับฟีเจอร์ระดับองค์กรของ Android
แอป DPC สามารถทำงานในโหมดเจ้าของโปรไฟล์ในอุปกรณ์ส่วนตัวหรือในอุปกรณ์เจ้าของ ในอุปกรณ์ที่มีการจัดการครบวงจร ตารางนี้ระบุฟีเจอร์ที่พร้อมใช้งาน เมื่อ DPC ทำงานในโหมดเจ้าของโปรไฟล์หรือโหมดเจ้าของอุปกรณ์ ให้ทำดังนี้
ปิดการเข้าถึงแอป
สำหรับองค์กรที่ต้องการบล็อกไม่ให้พนักงานเล่นเกมหรือรับชม 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 ให้ทำตามขั้นตอนต่อไปนี้
- ตั้งค่าแพ็กเกจการกำหนดค่าที่มีการจัดการสำหรับแพ็กเกจ Google Play
com.android.vending
- ในแพ็กเกจ ให้ใส่ค่าบูลีนสำหรับพารามิเตอร์
verify_apps:device_wide_unknown_source_block
- เพิ่มข้อจำกัดผู้ใช้
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 ให้ทำดังนี้
- ตั้งค่าแพ็กเกจการกำหนดค่าที่มีการจัดการสำหรับแพ็กเกจ Google Play
com.android.vending
- ในกลุ่ม ให้ป้อนที่อยู่อีเมลที่คั่นด้วยคอมมาเป็นค่าสตริงสำหรับ
คีย์
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 สามารถกำหนดค่าบัญชีเหล่านี้ตลอดอายุการใช้งานที่มีการจัดการครบวงจร อุปกรณ์
- ผู้ดูแลระบบไอทีสามารถใช้เมธอด
people.get
จาก People API ได้ ด้วยค่าพิเศษme
การดำเนินการนี้จะดึงข้อมูลuserId
สำหรับ ลงชื่อเข้าใช้แล้ว ระบบจะแสดงผลuserID
ในคีย์resourceName
ใน รูปแบบpeople/[userId]
เป็นสตริงจำนวนเต็ม บัญชีที่สร้างขึ้นใหม่อาจ ไม่สามารถรีเซ็ตเป็นค่าเริ่มต้นได้เป็นเวลา 72 ชั่วโมง - นอกจากนี้ คุณยังอาจต้องการอนุญาตให้ผู้ดูแลระบบไอทีอย่างน้อย 1 คนปลดล็อกอุปกรณ์ได้หลังจาก
การรีเซ็ตเป็นค่าเริ่มต้น ให้ผู้ดูแลระบบไอทีแต่ละคนเข้าสู่ระบบบัญชี Google และ
ทำตามขั้นตอนที่ 1 และแชร์
userId
ของพวกเขากับคุณด้วย เพื่อให้คุณสามารถเพิ่มรายการเหล่านี้ได้userIds
ไปยังรายการในขั้นตอนถัดไป - DPC ตั้งค่าการจำกัดแอปที่เหมาะสมโดยใช้
setFactoryResetProtectionPolicy()
เพื่อตั้งค่ารายการuserId
ที่ การจัดสรรอุปกรณ์ที่รีเซ็ตเป็นค่าเริ่มต้น - 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 จะเก็บคีย์ที่ตรวจสอบสิทธิ์ผู้ใช้ไว้ หลังจากรีเซ็ตรหัสผ่าน
คุณควรใช้การรีเซ็ตรหัสผ่านที่ปลอดภัยหากบิลด์ 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 ที่ทำงานในโหมดเจ้าของโปรไฟล์อาจกำหนดให้ผู้ใช้ระบุความปลอดภัยได้ สำหรับแอปที่ทำงานในโปรไฟล์งาน ระบบจะแสดงระบบความปลอดภัย เมื่อผู้ใช้พยายามเปิดแอปงาน หากผู้ใช้ดำเนินการสำเร็จ ดำเนินการตามมาตรการรักษาความปลอดภัยจนเสร็จสมบูรณ์ ระบบจะปลดล็อกโปรไฟล์งาน เพื่อถอดรหัสได้หากจำเป็น
วิธีการทำงานของคำถามเพื่อความปลอดภัยของโปรไฟล์งาน
- หาก DPC ส่ง Intent
ACTION_SET_NEW_PASSWORD
ระบบจะแจ้งเตือน กำหนดมาตรการรักษาความปลอดภัยได้ - DPC ยังสามารถส่ง
ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
ต้องการแจ้งให้ผู้ใช้ตั้งค่าการล็อกอุปกรณ์
DPC สามารถกำหนดนโยบายรหัสผ่านสำหรับการพิสูจน์การทำงานแตกต่างจาก
นโยบายสำหรับรหัสผ่านอื่นๆ ของอุปกรณ์ เช่น ความยาวขั้นต่ำสำหรับองค์ประกอบ
การตอบสนองของระบบทดสอบของอุปกรณ์อาจแตกต่างจากความยาวที่กำหนดไว้สำหรับ
รหัสผ่าน DPC กำหนดนโยบายชาเลนจ์โดยใช้
DevicePolicyManager
เมธอด เช่น setPasswordQuality()
และ
setPasswordMinimumLength()
ข้อควรพิจารณา
- DPC สามารถรีเซ็ตรหัสผ่านของโปรไฟล์งานได้ แต่ไม่สามารถรีเซ็ตรหัสผ่าน
อุปกรณ์ (ส่วนตัว) หากผู้ใช้เลือกที่จะตั้งค่ารหัสผ่านที่ทำงานและรหัสผ่านส่วนตัว
เหมือนกัน
resetPassword()
ในโปรไฟล์งานจะทำให้ รหัสผ่าน เพื่อรีเซ็ตในโปรไฟล์งานเท่านั้น ซึ่งจะไม่เหมือนกัน สำหรับหน้าจอล็อกของอุปกรณ์ - DPC สามารถปรับแต่งหน้าจอข้อมูลรับรองสำหรับความท้าทายในการทำงานโดยใช้
setOrganizationColor()
และsetOrganizationName()
- ผู้ดูแลระบบอุปกรณ์ไม่สามารถใช้
resetPassword()
เพื่อล้างหรือเปลี่ยนรหัสผ่าน ที่ตั้งไว้แล้ว ผู้ดูแลระบบอุปกรณ์จะยังคงตั้งค่ารหัสผ่านได้ แต่จะทำได้เพียง เมื่ออุปกรณ์ไม่มีรหัสผ่าน, PIN หรือรูปแบบ
ดูข้อมูลเพิ่มเติมได้ที่ getParentProfileInstance()
และข้อมูลอ้างอิง
ภายใต้ DevicePolicyManager