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.