보안

이 가이드의 기능은 다음과 같은 보안 관리 기능을 설명합니다. 기기 정책 컨트롤러 (DPC) 앱에서 구현해야 합니다. 이 문서 포함된 코드 샘플로 Test DPC 앱을 다음과 같이 사용할 수도 있습니다. Android 엔터프라이즈 기능의 샘플 코드 소스입니다.

DPC 앱은 개인 기기의 프로필 소유자 모드 또는 기기 소유자에서 실행할 수 있습니다. 완전 관리형 기기에서 사용할 수 있습니다 다음 표에는 사용할 수 있는 기능이 나와 있습니다. DPC가 프로필 소유자 모드 또는 기기 소유자 모드로 실행되는 경우:

기능 프로필 소유자 기기 소유자
앱에 대한 액세스 차단
알 수 없는 소스의 앱 차단하기
Google Play에서 계정 제한하기
엔터프라이즈 초기화 보호 사용 설정
엔터프라이즈 프로세스 로그 및 원격 버그 신고 모니터링
클라이언트 인증서에 대한 액세스 권한 부여 및 삭제하기
보안 비밀번호 재설정
직장 프로필 보안 인증 질문

앱에 대한 액세스 차단

직원이 게임을 플레이하거나 시청하지 못하도록 차단하려는 조직 하루 중 특정 시간대에 Android 기기로 YouTube를 시청함 DPC는 앱에 대한 액세스를 일시적으로 비활성화할 수 있습니다.

앱에 대한 액세스를 사용 중지하려면 기기 소유자 또는 프로필 소유자 모드로 실행되는 DPC setPackagesSuspended()를 구성하면 선택한 앱이 마치 사용 중지되어 있습니다 (Google 런처가 앱을 회색으로 표시). 사용자가 앱을 탭하면 앱이 정지되었다는 시스템 대화상자가 표시됩니다.

앱이 정지된 동안에는 활동을 시작할 수 없으며 억제됩니다. 정지된 패키지가 개요에 표시되지 않음 화면, 대화 상자 (토스트 메시지 및 스낵바 포함)를 표시할 수 없고 오디오를 재생하거나 기기를 진동시킬 수 없습니다.

런처는 isPackageSuspended() 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다. 앱 구성 방법에 관한 자세한 내용 정지에 관한 자세한 내용은 setPackagesSuspended를 참고하세요.

알 수 없는 소스의 앱 차단

Google Play (또는 기타 신뢰할 수 있는 앱 스토어)에서 설치하지 않은 앱은 알 수 없는 출처의 앱이라고 표시됩니다. 위험도가 높은 기기 및 데이터 알 수 있습니다.

누군가 알 수 없는 소스의 앱을 설치하지 못하도록 하려면 완전 관리형 기기와 직장 프로필을 통해 DISALLOW_INSTALL_UNKNOWN_SOURCES 사용자 제한입니다.

직장 프로필 기기 전체 제한

직장 프로필 관리자가 DISALLOW_INSTALL_UNKNOWN_SOURCES를 추가하면 제한은 직장 프로필에만 적용됩니다. 하지만 작업 관리자는 프로필의 관리 구성을 지원합니다. 기기 전체 제한은 다음과 같습니다. 설치된 Google Play 앱이 다음과 같은 경우 Android 8.0 이상에서 사용할 수 있습니다. 버전 80812500 이상

Google Play에서만 앱 설치를 제한하려면 다음 단계를 따르세요.

  1. Google Play 패키지의 관리 구성 번들 설정 com.android.vending
  2. 번들에서 verify_apps:device_wide_unknown_source_block 키.
  3. ENSURE_VERIFY_APPS 사용자 제한을 추가합니다.

다음 예는 Google Play에서 이 API를 지원하는지 확인하는 방법을 보여줍니다. 값을 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)

자바

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 디버그 브리지 (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)

자바

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가 계정의 이메일 주소를 알게 되는 즉시 단일 관리 계정으로 전송됩니다. 빈 문자열은 사용자가 Google Play에서 계정을 사용하지 못하게 합니다.

엔터프라이즈 초기화 보호 사용 설정

조직은 엔터프라이즈 초기화 보호를 사용하여 Google 계정은 초기화된 기기를 프로비저닝할 수 있습니다.

소비자 초기화 보호는 기기 도용을 방지하기 위해 설계되었습니다. 전 무단 초기화 이후 누구나 기기를 프로비저닝하도록 허용 (예: 인증하려는 경우 설정 마법사에서 사용자가 어떤 기기에 대해서든 이전에 기기의 개인 프로필에 있던 Google 계정

엔터프라이즈 환경에서 초기화는 기기 관리 및 직원의 기기에 대한 액세스 권한을 관리합니다. 그러나 조직이 직원의 계정 사용자 인증 정보를 모름, 초기화 보호 장치로 인해 조직이 다른 사람에게 기기를 발급하는 기능이 차단될 수 있습니다. 있습니다.

초기화 후 프로비저닝 제어

기기 소유자 모드로 실행하는 경우 DPC는 setFactoryResetProtectionPolicy()로 전환할 계정을 제어 기기를 프로비저닝할 권한이 있어야 합니다. 이 구성이 null(으)로 설정되거나 빈 목록으로 설정되면 프로비저닝하도록 승인된 계정 기기의 개인 프로필에 있는 계정은 있습니다.

DPC는 완전 관리형 있습니다.

  1. IT 관리자는 People API의 people.get 메서드를 사용할 수 있습니다. 특수 값 me를 사용합니다. 그러면 userId 로그인하세요. userID는 다음 디렉터리의 resourceName 키에 반환됩니다. 정수 문자열로 표시된 people/[userId] 형식입니다. 새로 만든 계정은 72시간 동안 초기화 목적으로 사용할 수 없습니다.
  2. 또한 기기를 잠금 해제한 후 한 명 이상의 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)

자바

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)

자바

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)

자바

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를 사용하여 키를 설정할 수 있음 관리되는 disableFactoryResetProtectionAdmintruecom.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)

자바

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 디버그 브리지 (adb) 활동, 화면 잠금 해제 등입니다. 프로세스 로그에는 사용자 동의가 필요하지 않습니다.

로깅을 사용 설정 또는 사용 중지하기 위해 DPC는 setSecurityLoggingEnabled()를 호출합니다.

새 로그 배치를 사용할 수 있는 경우 DeviceAdminReceiveronSecurityLogsAvailable() 콜백입니다. 로그를 가져오기 위해 콜백 수신) DPC는 retrieveSecurityLogs()를 호출합니다.

DPC는 retrievePreRebootSecurityLogs()를 호출하여 보안을 가져올 수도 있습니다. 이전 재부팅 주기에서 생성된 로그를 확인합니다. 이 값은 마지막 기기 재부팅 및 이전 재부팅 지원하지 않는 기기 retrieveSecurityLogs()null를 반환합니다. 앱이 retrievePreRebootSecurityLogs()retrieveSecurityLogs()을(를) 사용하려면 다음을 수행하세요. 중복 항목이 있는지 확인합니다.
참고: 이 기능은 기기의 사용자 또는 연결된 사용자. 이 기능은 사용할 수 없습니다. 개인 기기의 경우 기기 전체 활동이 기록되기 때문입니다.

이 설정은 사후 보안 이벤트 감사에 유용할 수 있습니다. 다음과 같은 작업을 수행합니다.

  • 앱이 새로 시작될 때마다 이를 통해 감염된 앱에서 시작된 멀웨어입니다.
  • 기기에서 잠금 해제 시도가 실패했습니다. 이를 통해 잠금 해제 시도가 여러 번 실패했습니다.
  • 사용자 연결 시 잠재적으로 위험한 adb 명령어 USB 케이블을 사용하여 컴퓨터로 전송할 수 있습니다.

로그를 읽는 방법에 관한 자세한 내용은 SecurityLog를 참고하세요.

개발하고 테스트하는 동안 시스템에서 DPC에 제공되는 기존 보안 로그가 완전히 사용 설정될 때까지 기다릴 필요가 없습니다. 있습니다. Android 9.0 (API 수준 28) 이상에서 다음을 실행합니다. 터미널에서 Android 디버그 브리지 (adb) 명령어를 실행합니다.

adb shell dpm force-security-logs

시스템에서 도구 사용 빈도를 제한하고 사용자가 터미널 출력에서 의도적으로 속도를 늦추는 것입니다. 사용 가능한 로그가 있는 경우 DPC는 onSecurityLogsAvailable() 콜백을 수신합니다.

원격으로 버그 신고 요청

기기 소유자 모드로 실행되는 DPC는 사용자를 위해 버그 신고를 원격으로 요청할 수 있습니다. 한 명의 사용자 또는 연결된 사용자만 있는 기기 버그 신고는 버그 신고를 요청한 바로 그 순간의 기기 활동을 지원하지만, Logcat의 빈도에 따라 이전 몇 시간 동안의 활동을 포함합니다. 있습니다.

버그 신고를 원격으로 요청하기 위해 DPC는 requestBugreport()를 호출합니다.

클라이언트 인증서에 대한 액세스 권한 부여 및 삭제

프로필 소유자 또는 기기 소유자 모드로 실행되는 DPC가 서드 파티 앱에 권한을 부여하는 경우 인증서 관리 기능, 앱이 자체 인증서에 대한 액세스 권한을 인증서에 대한 사용자 개입 없이 안전하게 작동합니다. Cloud SDK를 설치하려면 인증서가 필요한 경우 installKeyPair()를 사용합니다.

구성할 매개변수는 installKeyPair()를 참고하세요. 이 기능 는 인증서 관리를 위해 기존 API와 함께 작동합니다.

배포 시나리오

installKeyPair() 메서드를 사용하지 않는 경우:

  • 사용자는 매번 인증서 이름을 탭하고 허용을 탭해야 합니다. 인증서에 대한 액세스 권한을 부여하려고 합니다.
  • 사용자에게 인증서를 설치할 때 메시지가 표시되며 있습니다.

installKeyPair() 메서드를 사용합니다.

  • 사용자는 액세스 권한을 부여할 때마다 허용을 탭할 필요가 없습니다. 있습니다.
  • 사용자는 인증서 이름을 바꿀 수 없습니다.
  • 관리자는 허용해서는 안 됩니다.

클라이언트 인증서 삭제

클라이언트 인증서에 액세스 권한을 부여한 후 원격으로 클라이언트를 삭제합니다. installKeyPair()를 통해 설치된 인증서, 호출 removeKeyPair()

기기 소유자 모드 또는 프로필 소유자 모드로 실행되거나 위임된 DPC 인증서 설치 프로그램은 removeKeyPair()를 호출할 수 있습니다. 이렇게 하면 비공개 키 별칭으로 설치된 인증서 및 비공개 키 쌍입니다.

배포 시나리오

조직이 더 안전한 형태의 클라이언트로 마이그레이션하는 경우 이 기능을 사용하세요. 있습니다. 관리자가 새 인증서를 배포하면 시간이 많이 걸리는 경우 관리자가 지원 중단된 새 인증서를 제공합니다.

보안 비밀번호 재설정

DPC는 사전 등록된 보안 토큰입니다. 기기 소유자 및 프로필 소유자가 안전하게 통화할 수 있음 기기 및 직장 프로필의 비밀번호를 변경하기 위한 비밀번호 재설정 API 각각 1개의 값으로 사용합니다. 보안 비밀번호 재설정은 resetPassword()를 다음과 같은 개선사항이 있습니다.

  • DPC에서는 사용자가 기기 또는 프로필을 잠금 해제하기 전에 비밀번호를 재설정할 수 있습니다. 를 사용하여 기기에서 재부팅한 후 파일 기반 암호화.
  • Android 키 저장소에는 사용자 인증 키가 보관됨 비밀번호를 재설정합니다.

DPC 빌드가 Android 8.0 (API)을 타겟팅하는 경우 보안 비밀번호 재설정을 사용해야 합니다. 수준 26) 이상이 필요합니다. resetPassword()를 호출하면 다음과 같은 오류가 발생합니다. Android 8.0 이상을 타겟팅하는 DPC에서 SecurityException를 사용하므로 DPC를 업데이트해야 합니다.

토큰 설정 및 활성화

비밀번호를 재설정하기 전에 DPC에서 토큰을 설정하고 활성화해야 합니다. 왜냐하면 DPC가 토큰을 바로 사용하지 못할 수도 있으므로 이를 IT 관리자가 사용해야 할 수도 있습니다.

비밀번호 재설정 토큰은 암호적으로 강력한 임의 값이며 최소 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)
}

자바

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
}

자바

// 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 ...
}

자바

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.
}

자바

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