Menentukan Izin Aplikasi Kustom

Dokumen ini menjelaskan bagaimana developer aplikasi dapat menggunakan fitur keamanan yang disediakan oleh Android untuk menetapkan izin mereka sendiri. Dengan menetapkan izin kustom, aplikasi dapat berbagi resource dan kemampuannya dengan aplikasi lain. Untuk informasi selengkapnya tentang izin, lihat Ringkasan Izin.

Latar Belakang

Android adalah sistem operasi yang dipisahkan menurut hak istimewa; setiap aplikasinya berjalan dengan identitas sistem yang berbeda (ID pengguna Linux dan ID grup). Bagian-bagian sistemnya juga dipisahkan ke dalam identitas yang berbeda. Oleh karena itu, Linux mengisolasi aplikasi antara satu dengan yang lain dan dari sistem.

Aplikasi dapat menunjukkan fungsionalitasnya ke aplikasi lain dengan menetapkan izin yang dapat diminta oleh aplikasi lain tersebut. Aplikasi juga dapat menetapkan izin yang tersedia otomatis untuk aplikasi lain yang ditandatangani dengan sertifikat yang sama.

Penandatanganan aplikasi

Semua APK harus ditandatangani dengan sertifikat yang kunci pribadinya dipegang oleh developer. Sertifikat ini mengidentifikasi pembuat aplikasi. Sertifikat tidak perlu ditandatangani oleh certificate authority; aplikasi Android bebas menggunakan sertifikat yang ditandatangani sendiri, dan hal itu sudah umum dilakukan. Tujuan sertifikat di Android adalah untuk membedakan pembuat aplikasi. Hal ini memungkinkan sistem untuk memberikan atau menolak akses aplikasi ke izin tingkat tanda tangan dan untuk memberikan atau menolak permintaan aplikasi agar diberi identitas Linux yang sama seperti aplikasi lain.

ID pengguna dan akses file

Pada waktu penginstalan, Android memberikan ID pengguna Linux yang berbeda kepada setiap paket. Identitas ini tetap sama selama masa pakai paket di perangkat itu. Di perangkat lain, paket yang sama mungkin memiliki UID yang berbeda; yang penting adalah setiap paket memiliki UID yang berbeda di satu perangkat.

Karena penegakan keamanan terjadi pada tingkat proses, kode dari dua paket apa pun biasanya tidak dapat berjalan dalam proses yang sama, karena keduanya harus dijalankan sebagai pengguna Linux yang berbeda. Anda dapat menggunakan atribut sharedUserId dalam tag manifes AndroidManifest.xml dari setiap paket untuk memberinya ID pengguna yang sama. Dengan demikian, untuk tujuan keamanan, kedua paket tersebut akan dianggap sebagai aplikasi yang sama, dengan izin file dan ID pengguna yang sama. Perlu diketahui bahwa, untuk mempertahankan keamanan, hanya dua aplikasi dengan tanda tangan yang sama (dan meminta sharedUserId yang sama) yang akan diberi ID pengguna yang sama.

Data apa pun yang disimpan oleh aplikasi akan diberi ID pengguna aplikasi tersebut, dan biasanya tidak dapat diakses oleh paket lain.

Untuk informasi selengkapnya tentang model keamanan Android, lihat Ringkasan Keamanan Android

Menentukan dan memberlakukan izin

Untuk memberlakukan izin Anda sendiri, Anda harus terlebih dahulu mendeklarasikannya dalam AndroidManifest.xml menggunakan satu atau beberapa elemen <permission>.

Sebagai contoh, aplikasi yang ingin mengontrol siapa yang dapat memulai salah satu aktivitasnya dapat mendeklarasikan izin untuk operasi ini seperti berikut:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >
    
    <permission
      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
      android:label="@string/permlab_deadlyActivity"
      android:description="@string/permdesc_deadlyActivity"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />
    ...
</manifest>

Catatan: Sistem tidak mengizinkan beberapa paket untuk mendeklarasikan izin dengan nama yang sama, kecuali semua paket ditandatangani dengan sertifikat yang sama. Jika sebuah paket mendeklarasikan suatu izin, sistem tidak akan mengizinkan pengguna menginstal paket lain dengan nama izin yang sama, kecuali paket tersebut ditandatangani dengan sertifikat yang sama seperti paket pertama. Untuk menghindari masalah penamaan, sebaiknya gunakan penamaan gaya domain terbalik untuk izin khusus, misalnya com.example.myapp.ENGAGE_HYPERSPACE.

Atribut protectionLevel bersifat wajib, yang memberi tahu sistem tentang bagaimana pengguna akan diberi tahu jika aplikasi membutuhkan izin, atau siapa yang diizinkan untuk memegang izin tersebut, seperti yang dijelaskan dalam dokumentasi tertaut.

Atribut android:permissionGroup bersifat opsional, dan hanya digunakan untuk membantu sistem menampilkan izin kepada pengguna. Biasanya, Anda harus menetapkan atribut ini ke grup sistem standar (tercantum dalam android.Manifest.permission_group), meskipun Anda dapat menentukan grup sendiri. Sebaiknya gunakan grup yang sudah ada karena akan menyederhanakan UI izin yang ditampilkan kepada pengguna.

Anda harus memberikan label dan deskripsi untuk izin tersebut. Label dan deskripsi adalah resource string yang dapat dilihat pengguna saat mereka melihat daftar izin (android:label) atau detail tentang sebuah izin (android:description) . Label harus singkat; hanya berisi beberapa kata yang menjelaskan bagian penting fungsionalitas yang dilindungi olehnya. Deskripsi harus berisi beberapa kalimat yang menjelaskan apa saja yang boleh dilakukan oleh pemegang izin sesuai izin tersebut. Konvensi kami adalah deskripsi yang terdiri dari dua kalimat: kalimat pertama menjelaskan izin tersebut, dan kalimat kedua memperingatkan pengguna tentang konsekuensi yang akan dihadapi jika izin tersebut diberikan ke aplikasi.

Berikut adalah contoh label dan deskripsi untuk izin CALL_PHONE:

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call
    phone numbers without your intervention. Malicious apps may
    cause unexpected calls on your phone bill. Note that this does not
    allow the app to call emergency numbers.</string>

Membuat grup izin

Seperti yang dijelaskan di bagian sebelumnya, Anda dapat menggunakan atribut android:permissionGroup untuk membantu sistem menjelaskan izin kepada pengguna. Biasanya, Anda perlu menetapkannya ke grup sistem standar (tercantum dalam android.Manifest.permission_group), tetapi juga dapat menentukan grup sendiri dengan <permission-group>.

Elemen <permission-group> menentukan label untuk sekumpulan izin, yaitu yang dideklarasikan dalam manifes dengan elemen <permission> serta yang dideklarasikan di tempat lain. Elemen ini hanya memengaruhi bagaimana izin dikelompokkan saat ditampilkan kepada pengguna. Elemen <permission-group> tidak menetapkan izin yang dimiliki grup, tetapi akan memberikan nama bagi grup tersebut.

Anda dapat menempatkan izin dalam grup dengan menetapkan nama grup ke atribut permissionGroup pada elemen <permission>.

Elemen <permission-tree> mendeklarasikan ruang nama untuk grup izin yang ditentukan dalam kode.

Rekomendasi izin kustom

Aplikasi dapat menentukan izin kustomnya sendiri dan meminta izin kustom dari aplikasi lain dengan menentukan elemen <uses-permission>. Namun, Anda harus menilai dengan cermat apakah aplikasi Anda perlu melakukannya.

  • Jika Anda mendesain rangkaian aplikasi yang menunjukkan fungsionalitasnya antara satu dengan yang lain, cobalah desain agar setiap izin hanya ditentukan sekali. Anda harus melakukan hal tersebut jika aplikasi tidak semuanya ditandatangani dengan sertifikat yang sama. Meskipun semua aplikasi ditandatangani dengan sertifikat yang sama, sebaiknya tentukan setiap izin satu kali saja.
  • Jika fungsionalitas tersebut hanya tersedia untuk aplikasi yang ditandatangani dengan tanda tangan yang sama seperti aplikasi penyedia, Anda mungkin dapat menghindari penetapan izin kustom dengan pemeriksaan tanda tangan. Saat salah satu aplikasi Anda mengajukan permintaan untuk aplikasi lainnya, aplikasi kedua dapat memverifikasi bahwa kedua aplikasi tersebut ditandatangani dengan sertifikat yang sama sebelum mematuhi permintaan tersebut.

Lanjutkan membaca tentang:

<uses-permission>
Referensi API untuk tag manifes yang mendeklarasikan izin sistem yang diperlukan aplikasi Anda.

Mungkin Anda juga tertarik pada:

Ringkasan Keamanan Android
Diskusi mendetail tentang model keamanan platform Android.