Menentukan izin aplikasi kustom

Dokumen ini menjelaskan cara developer aplikasi 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 menggunakan sertifikat yang sama.

Penandatanganan aplikasi

Semua APK harusditandatangani menggunakan sertifikat yang kunci pribadinya dipegang oleh developer. Sertifikat tidak perlu ditandatangani oleh certificate authority. Umumnya, aplikasi Android memang diizinkan untuk menggunakan sertifikat yang ditandatangani sendiri. Tujuan sertifikat di Android adalah untuk membedakan pembuat aplikasi. Dengan demikian, sistem dapat 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.

Memberikan izin tanda tangan setelah waktu pembuatan perangkat

Mulai Android 12 (level API 31), knownCerts atribut untuk izin tingkat tanda tangan memungkinkan Anda merujuk ke ringkasan sertifikat penandatanganan yang diketahui pada waktu deklarasi.

Anda dapat mendeklarasikan atribut knownCerts dan menggunakan tanda knownSigner di atribut protectionLevel aplikasi Anda untuk izin tingkat tanda tangan tertentu. Kemudian, sistem akan memberikan izin ke aplikasi yang meminta jika ada penanda tangan dalam urutan penandatanganan aplikasi yang meminta, termasuk penanda tangan saat ini yang sesuai dengan salah satu ringkasan yang dideklarasikan dengan izin dalam atribut knownCerts.

Tanda knownSigner memungkinkan perangkat dan aplikasi memberikan izin tanda tangan ke aplikasi lain tanpa harus menandatangani aplikasi tersebut pada saat pembuatan dan pengiriman perangkat.

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 setiap paket memiliki UID yang berbeda di satu perangkat.

Karena penegakan keamanan terjadi di 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.

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

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

Konvensi penamaan

Sistem tidak mengizinkan beberapa paket untuk mendeklarasikan izin dengan nama yang sama, kecuali semua paket ditandatangani menggunakan sertifikat yang sama. Jika sebuah paket mendeklarasikan suatu izin, sistem juga tidak akan mengizinkan pengguna menginstal paket lain dengan nama izin yang sama, kecuali jika paket tersebut ditandatangani menggunakan sertifikat yang sama seperti paket pertama.

Sebaiknya berikan awalan izin dengan nama paket aplikasi, menggunakan penamaan gaya domain terbalik, diikuti dengan .permission., lalu deskripsi kemampuan yang diwakili izin tersebut, dalam huruf kapital SNAKE_CASE. Misalnya, com.example.myapp.permission.ENGAGE_HYPERSPACE.

Dengan mengikuti rekomendasi ini, Anda dapat menghindari konflik penamaan serta mengidentifikasi dengan jelas pemilik dan maksud izin kustom.

Contoh

Misalnya, aplikasi yang perlu mengontrol aplikasi lain mana yang dapat memulai salah satu aktivitasnya bisa mendeklarasikan izin untuk operasi ini sebagai 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>

Atribut protectionLevel diperlukan dan memberi tahu sistem cara memberi tahu pengguna tentang aplikasi yang memerlukan izin atau aplikasi apa yang dapat memiliki izin, seperti yang dijelaskan dalam dokumentasi tertaut.

Atribut android:permissionGroup bersifat opsional, dan hanya digunakan untuk membantu sistem menampilkan izin kepada pengguna. Biasanya, Anda perlu menetapkannya ke grup sistem standar (tercantum dalam android.Manifest.permission_group), meskipun Anda dapat menentukan grup sendiri, seperti dijelaskan dalam bagian berikut. Sebaiknya gunakan grup yang sudah ada karena akan menyederhanakan izin UI 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 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 non-emergency
phone numbers without your intervention. Malicious apps may cause unexpected
calls on your phone bill.</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 Anda 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 cara pengelompokkan izin 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

Anda dapat menentukan izin kustom untuk aplikasi Anda dan meminta izin kustom dari aplikasi lain dengan menentukan elemen <uses-permission>. Namun, pertimbangkan dengan cermat apakah hal tersebut perlu dilakukan atau tidak.

  • 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 menggunakan sertifikat yang sama. Meskipun semua aplikasi ditandatangani menggunakan sertifikat yang sama, sebaiknya tentukan setiap izin satu kali saja.
  • Jika fungsionalitas tersebut hanya tersedia untuk aplikasi yang ditandatangani menggunakan 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.

Jika izin kustom diperlukan, pertimbangkan apakah hanya aplikasi yang ditandatangani oleh developer yang sama dengan aplikasi yang melakukan pemeriksaan izin yang perlu mengaksesnya, misalnya saat menerapkan komunikasi antar-proses yang aman antara dua aplikasi dari developer yang sama. Jika ya, sebaiknya gunakan izin tanda tangan. Izin tanda tangan bersifat transparan bagi pengguna, dan hindari izin yang dikonfirmasi oleh pengguna, yang dapat membingungkan pengguna.

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.