افزایش امنیت با سیاست های مدیریت دستگاه

منسوخ شدن مدیریت دستگاه برخی از خط‌مشی‌های سرپرست در صورت فراخوانی توسط سرپرست دستگاه به‌عنوان منسوخ علامت‌گذاری شده‌اند. برای کسب اطلاعات بیشتر و دیدن گزینه‌های انتقال، به حذف سرپرست دستگاه مراجعه کنید.

از Android 2.2 (سطح API 8)، پلتفرم Android قابلیت های مدیریت دستگاه در سطح سیستم را از طریق Device Administration API ارائه می دهد.

در این درس، نحوه ایجاد یک برنامه کاربردی آگاه از امنیت را خواهید آموخت که با اعمال سیاست های مدیریت دستگاه، دسترسی به محتوای آن را مدیریت می کند. به طور خاص، برنامه را می توان به گونه ای پیکربندی کرد که اطمینان حاصل کند که یک رمز عبور قفل صفحه با قدرت کافی قبل از نمایش محتوای محدود شده برای کاربر تنظیم شده است.

خط مشی خود را تعریف و اعلام کنید

ابتدا باید انواع خط مشی هایی را برای پشتیبانی در سطح عملکردی تعریف کنید. خط‌مشی‌ها ممکن است قدرت رمز عبور قفل صفحه، زمان انقضا، رمزگذاری و غیره را پوشش دهند.

شما باید مجموعه خط مشی انتخاب شده را که توسط برنامه اجرا می شود، در فایل res/xml/device_admin.xml اعلام کنید. مانیفست Android نیز باید به مجموعه خط مشی اعلام شده ارجاع دهد.

هر خط مشی اعلام شده با تعدادی از روش های خط مشی دستگاه مرتبط در DevicePolicyManager مطابقت دارد (تعریف حداقل طول رمز عبور و حداقل تعداد نویسه های بزرگ دو مثال است). اگر یک برنامه سعی کند متدهایی را فراخوانی کند که خط مشی متناظر آنها در XML اعلان نشده است، منجر به یک SecurityException در زمان اجرا می شود. اگر برنامه قصد مدیریت انواع دیگر خط مشی ها را داشته باشد، مجوزهای دیگری مانند force-lock در دسترس هستند. همانطور که بعدا خواهید دید، به عنوان بخشی از فرآیند فعال سازی مدیر دستگاه، لیست سیاست های اعلام شده در صفحه سیستم به کاربر ارائه می شود.

قطعه زیر خط‌مشی محدودیت رمز عبور را در res/xml/device_admin.xml اعلام می‌کند:

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

اعلام خط‌مشی XML که در مانیفست Android ارجاع شده است:

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

یک گیرنده مدیریت دستگاه ایجاد کنید

یک گیرنده پخش مدیریت دستگاه ایجاد کنید، که از رویدادهای مربوط به خط‌مشی‌هایی که اعلام کرده‌اید مطلع می‌شود. یک برنامه کاربردی می تواند به طور انتخابی روش های پاسخ به تماس را لغو کند.

در برنامه نمونه، Device Admin، هنگامی که مدیر دستگاه توسط کاربر غیرفعال می شود، خط مشی پیکربندی شده از اولویت مشترک پاک می شود. شما باید پیاده سازی منطق کسب و کار مرتبط با مورد استفاده شما را در نظر بگیرید. به عنوان مثال، برنامه ممکن است با اجرای ترکیبی از حذف داده های حساس روی دستگاه، غیرفعال کردن همگام سازی از راه دور، هشدار دادن به مدیر و غیره، اقداماتی را برای کاهش خطرات امنیتی انجام دهد.

برای اینکه گیرنده پخش کار کند، حتماً آن را در مانیفست اندروید ثبت کنید، همانطور که در قطعه بالا نشان داده شده است.

کاتلین

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()
        }
    }
}

جاوا

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();
    }
}

مدیر دستگاه را فعال کنید

قبل از اعمال هر گونه خط مشی، کاربر باید به صورت دستی برنامه را به عنوان سرپرست دستگاه فعال کند. قطعه زیر نحوه فعال کردن فعالیت تنظیمات را نشان می دهد که در آن کاربر می تواند برنامه شما را فعال کند. تمرین خوبی است که متن توضیحی را درج کنید تا با مشخص کردن EXTRA_ADD_EXPLANATION اضافی در هدف، به کاربران نشان داده شود که چرا برنامه به عنوان سرپرست دستگاه درخواست می کند.

شکل 1. صفحه فعال سازی کاربر که در آن می توانید شرحی از خط مشی های دستگاه خود ارائه دهید.

کاتلین

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

جاوا

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);
}

اگر کاربر «فعال کردن» را انتخاب کند، برنامه به یک سرپرست دستگاه تبدیل می‌شود و می‌تواند پیکربندی و اجرای خط‌مشی را آغاز کند.

برنامه همچنین باید برای رسیدگی به موقعیت‌های معکوس آماده شود که کاربر با زدن دکمه لغو، کلید برگشت یا کلید Home، فرآیند فعال‌سازی را رها می‌کند. بنابراین، onResume() در Policy Set Up Activity باید منطقی داشته باشد تا شرایط را دوباره ارزیابی کند و در صورت نیاز گزینه Device Administrator Activation را به کاربر ارائه دهد.

کنترل کننده سیاست دستگاه را اجرا کنید

پس از اینکه مدیر دستگاه با موفقیت فعال شد، برنامه سپس Device Policy Manager را با خط مشی درخواستی پیکربندی می کند. به خاطر داشته باشید که با هر نسخه، سیاست های جدیدی به اندروید اضافه می شود. در صورت استفاده از خط‌مشی‌های جدید در حالی که از نسخه‌های قدیمی‌تر پلتفرم پشتیبانی می‌کنید، بهتر است نسخه را در برنامه خود بررسی کنید. برای مثال، خط‌مشی حداقل حروف بزرگ رمز عبور فقط با سطح API 11 (لانه زنبوری) و بالاتر در دسترس است. کد زیر نشان می دهد که چگونه می توانید نسخه را در زمان اجرا بررسی کنید.

کاتلین

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

جاوا

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);
}

در این مرحله، برنامه قادر به اجرای سیاست است. در حالی که برنامه به رمز عبور واقعی قفل صفحه استفاده شده دسترسی ندارد، از طریق Device Policy Manager API می تواند تعیین کند که آیا رمز عبور موجود با خط مشی مورد نیاز مطابقت دارد یا خیر. اگر مشخص شود که رمز عبور قفل صفحه موجود کافی نیست، API مدیریت دستگاه به طور خودکار اقدام اصلاحی انجام نمی دهد. این مسئولیت برنامه است که صریحاً صفحه تغییر رمز عبور سیستم را در برنامه تنظیمات راه اندازی کند. به عنوان مثال:

کاتلین

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

جاوا

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

به طور معمول، کاربر می تواند یکی از مکانیسم های قفل موجود، مانند هیچ، الگو، پین (عددی)، یا رمز عبور (الفبایی) را انتخاب کند. هنگامی که یک خط مشی رمز عبور پیکربندی می شود، انواع رمزهای عبور ضعیف تر از موارد تعریف شده در خط مشی غیرفعال می شوند. به عنوان مثال، اگر کیفیت رمز عبور "عددی" پیکربندی شده باشد، کاربر می تواند فقط رمز عبور PIN (عددی) یا رمز عبور (الفبایی) را انتخاب کند.

هنگامی که دستگاه به درستی با تنظیم رمز عبور قفل صفحه نمایش مناسب ایمن شد، برنامه اجازه دسترسی به محتوای ایمن را می دهد.

کاتلین

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

جاوا

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));
}