Mehr Sicherheit mit Richtlinien zur Geräteverwaltung

Einstellung der Geräteverwaltung. Einige Administratorrichtlinien wurden beim Aufruf durch einen Geräteadministrator als verworfen markiert. Weitere Informationen und die Migrationsoptionen finden Sie unter Einstellung von Geräteverwaltung.

Seit Android 2.2 (API-Ebene 8) bietet die Android-Plattform über die Device Administration APIs Geräteverwaltungsfunktionen auf Systemebene.

In dieser Lektion erfahren Sie, wie Sie eine sicherheitsbewusste Anwendung erstellen, die den Zugriff auf die Inhalte durch Erzwingen von Richtlinien zur Geräteverwaltung verwaltet. Insbesondere kann die App so konfiguriert werden, dass ein Passwort für die Displaysperre mit ausreichender Stärke eingerichtet wird, bevor dem Nutzer eingeschränkte Inhalte angezeigt werden.

Richtlinie definieren und deklarieren

Zuerst müssen Sie die Richtlinientypen definieren, die auf Funktionsebene unterstützt werden sollen. Die Richtlinien umfassen beispielsweise die Passwortstärke für die Displaysperre, das Ablaufdatum, die Verschlüsselung usw.

Sie müssen die ausgewählte Richtliniengruppe, die von der Anwendung erzwungen wird, in der Datei res/xml/device_admin.xml deklarieren. Das Android-Manifest sollte auch auf den deklarierten Richtliniensatz verweisen.

Jede deklarierte Richtlinie entspricht einer Reihe von zugehörigen Geräterichtlinienmethoden in DevicePolicyManager. Die Definition der Mindestlänge des Passworts und der Mindestanzahl von Großbuchstaben sind Beispiele. Wenn eine Anwendung versucht, Methoden aufzurufen, deren entsprechende Richtlinie nicht in der XML-Datei deklariert ist, führt dies während der Laufzeit zu einem SecurityException. Andere Berechtigungen wie force-lock sind verfügbar, wenn die Anwendung andere Arten von Richtlinien verwalten möchte. Wie Sie später sehen werden, wird dem Nutzer im Rahmen des Aktivierungsprozesses des Geräteadministrators auf einem Systembildschirm die Liste der deklarierten Richtlinien angezeigt.

Mit dem folgenden Snippet wird die Richtlinie für Passwortlimits in res/xml/device_admin.xml deklariert:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
    </uses-policies>
</device-admin>

XML-Erklärung der Richtlinie, auf die im Android-Manifest verwiesen wird:

<receiver android:name=".Policy$PolicyAdmin"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

Empfänger für die Geräteverwaltung erstellen

Erstellen Sie einen Device Administration-Broadcast-Empfänger, der über Ereignisse im Zusammenhang mit den zu unterstützenden Richtlinien benachrichtigt wird. Eine Anwendung kann Callback-Methoden selektiv überschreiben.

Wenn der Geräteadministrator in der Beispielanwendung "Device Admin" vom Nutzer deaktiviert wird, wird die konfigurierte Richtlinie aus der gemeinsamen Einstellung entfernt. Sie sollten eine Geschäftslogik implementieren, die für Ihren Anwendungsfall relevant ist. Beispielsweise kann die Anwendung Maßnahmen ergreifen, um das Sicherheitsrisiko zu mindern, indem eine Kombination aus dem Löschen sensibler Daten auf dem Gerät, der Deaktivierung der Remote-Synchronisierung, dem Benachrichtigen eines Administrators usw. implementiert wird.

Damit der Empfänger funktioniert, müssen Sie ihn wie im Snippet oben dargestellt im Android-Manifest registrieren.

Kotlin

class PolicyAdmin : DeviceAdminReceiver() {

    override fun onDisabled(context: Context, intent: Intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent)
        context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply {
            clear()
            apply()
        }
    }
}

Java

public static class PolicyAdmin extends DeviceAdminReceiver {

    @Override
    public void onDisabled(Context context, Intent intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent);
        SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
        prefs.edit().clear().commit();
    }
}

Geräteadministrator aktivieren

Bevor Richtlinien erzwungen werden, muss der Nutzer die Anwendung manuell als Geräteadministrator aktivieren. Das folgende Snippet zeigt, wie die Aktivität für Einstellungen ausgelöst wird, mit der der Nutzer Ihre Anwendung aktivieren kann. Es empfiehlt sich, den erklärenden Text einzufügen, um Nutzer hervorzuheben, warum die Anwendung die Rolle eines Geräteadministrators anfordert. Dazu geben Sie im Intent zusätzliche EXTRA_ADD_EXPLANATION an.

Abbildung 1: Der Nutzeraktivierungsbildschirm, auf dem Sie eine Beschreibung Ihrer Geräterichtlinien eingeben können.

Kotlin

if (!policy.isAdminActive()) {

    val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)

    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_DEVICE_ADMIN,
            policy.getPolicyAdmin()
    )

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_ADD_EXPLANATION,
            resources.getString(R.string.device_admin_activation_message)
    )

    startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN)
}

Java

if (!policy.isAdminActive()) {

    Intent activateDeviceAdminIntent =
        new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        policy.getPolicyAdmin());

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_ADD_EXPLANATION,
        getResources().getString(R.string.device_admin_activation_message));

    startActivityForResult(activateDeviceAdminIntent,
        REQ_ACTIVATE_DEVICE_ADMIN);
}

Wenn der Nutzer „Aktivieren“ auswählt, wird die Anwendung zu einem Geräteadministrator und kann mit der Konfiguration und Durchsetzung der Richtlinie beginnen.

Die Anwendung muss auch auf Rückschritte vorbereitet sein, wenn der Nutzer den Aktivierungsprozess durch Drücken der Schaltfläche „Abbrechen“, der Zurück- oder Startbildschirmtaste abbricht. Daher muss onResume() in der Einrichtungsaktivität der Richtlinie eine Logik enthalten, mit der die Bedingung neu bewertet und dem Nutzer bei Bedarf die Option zur Aktivierung des Geräteadministrators angezeigt werden kann.

Device Policy Controller implementieren

Nachdem der Geräteadministrator aktiviert wurde, konfiguriert die App den Geräterichtlinienmanager mit der angeforderten Richtlinie. Beachten Sie, dass Android mit jedem Release neue Richtlinien hinzugefügt werden. Wenn Sie neue Richtlinien verwenden, aber ältere Versionen der Plattform unterstützen, empfiehlt es sich, Versionsprüfungen in Ihrer Anwendung durchzuführen. Beispielsweise ist die Richtlinie „Passwort-Minimum“ nur bei API-Level 11 (Honeycomb) und höher verfügbar. Der folgende Code zeigt, wie Sie die Version zur Laufzeit prüfen können.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var policyAdmin: ComponentName

dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
policyAdmin = ComponentName(context, PolicyAdmin::class.java)

dpm.apply {
    setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality])
    setPasswordMinimumLength(policyAdmin, passwordLength)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase)
    }
}

Java

DevicePolicyManager dpm = (DevicePolicyManager)
        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class);

dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]);
dpm.setPasswordMinimumLength(policyAdmin, passwordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase);
}

Jetzt kann die Anwendung die Richtlinie erzwingen. Die App hat zwar keinen Zugriff auf das tatsächlich verwendete Passwort für die Displaysperre, kann aber über die Device Policy Manager API feststellen, ob das vorhandene Passwort der erforderlichen Richtlinie entspricht. Wenn das vorhandene Passwort für die Displaysperre nicht ausreicht, ergreift die Geräteverwaltungs-API nicht automatisch Korrekturmaßnahmen. Es liegt in der Verantwortung der App, den Bildschirm zur Änderung des Systempassworts in der App "Einstellungen" zu starten. Beispiel:

Kotlin

if (!dpm.isActivePasswordSufficient) {
    // Triggers password change screen in Settings.
    Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
        startActivity(intent)
    }
}

Java

if (!dpm.isActivePasswordSufficient()) {
    ...
    // Triggers password change screen in Settings.
    Intent intent =
        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
    startActivity(intent);
}

Normalerweise kann der Nutzer einen der verfügbaren Sperrmechanismen auswählen, z. B. Kein, Muster, PIN (numerisch) oder Passwort (alphanumerisch). Wenn eine Passwortrichtlinie konfiguriert ist, werden die schwächeren Passworttypen als in der Richtlinie definierte deaktiviert. Wenn beispielsweise die Passwortqualität „Numerisch“ konfiguriert ist, kann der Nutzer entweder die PIN (numerisch) oder nur das Passwort (alphanumerisch) Passwort auswählen.

Sobald das Gerät durch das Einrichten eines geeigneten Passworts für die Displaysperre ordnungsgemäß gesichert ist, erlaubt die Anwendung den Zugriff auf die gesicherten Inhalte.

Kotlin

when {
    !dpm.isAdminActive(policyAdmin) -> {
        // Activates device administrator.
        ...
    }
    !dpm.isActivePasswordSufficient -> {
        // Launches password set-up screen in Settings.
        ...
    }
    else -> {
        // Grants access to secure content.
        ...
        startActivity(Intent(context, SecureActivity::class.java))
    }
}

Java

if (!dpm.isAdminActive(..)) {
    // Activates device administrator.
    ...
} else if (!dpm.isActivePasswordSufficient()) {
    // Launches password set-up screen in Settings.
    ...
} else {
    // Grants access to secure content.
    ...
    startActivity(new Intent(context, SecureActivity.class));
}