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.