Bu belgede, uygulama geliştiricilerin kendi izinlerini tanımlamak için Android'in sağladığı güvenlik özelliklerini nasıl kullanabileceği açıklanmaktadır. Özel izinler tanımlayarak bir uygulama, kaynaklarını ve özelliklerini diğer uygulamalarla paylaşabilir. İzinler hakkında daha fazla bilgi için izinlere genel bakış başlıklı makaleyi inceleyin.
Arka plan
Android, ayrıcalıkları ayrılmış bir işletim sistemidir. Bu sistemde her uygulama ayrı bir sistem kimliğiyle (Linux kullanıcı kimliği ve grup kimliği) çalışır. Sistemin bazı bölümleri de ayrı kimliklere ayrılır. Böylece Linux, uygulamaları birbirinden ve sistemden izole eder.
Uygulamalar, diğer uygulamaların isteyebileceği izinleri tanımlayarak işlevlerini diğer uygulamalara sunabilir. Ayrıca, aynı sertifikayla imzalanan diğer uygulamalara otomatik olarak sunulan izinleri de tanımlayabilirler.
Uygulama imzalama
Tüm APK'lar, geliştiricilerinin özel anahtarını elinde bulundurduğu bir sertifikayla imzalanmalıdır. Sertifikanın bir sertifika yetkilisi tarafından imzalanması gerekmez. Android uygulamalarının kendinden imzalı sertifikalar kullanması kabul edilebilir ve yaygın bir durumdur. Android'deki sertifikaların amacı, uygulama yazarlarını ayırt etmektir. Bu, sistemin uygulamalara imza düzeyinde izinler için erişim izni vermesine veya erişimi reddetmesine ve bir uygulamanın başka bir uygulamayla aynı Linux kimliğinin verilmesi isteğini kabul etmesine veya reddetmesine olanak tanır.
Cihaz üretim zamanından sonra imza izinleri verme
Android 12'den (API düzeyi 31) itibaren, imza düzeyi izinleri için knownCerts özelliği, bildirim sırasında bilinen imzalama sertifikalarının özetlerine başvurmanıza olanak tanır.
knownCerts özelliğini beyan edebilir ve belirli bir imza düzeyindeki izin için uygulamanızın protectionLevel özelliğinde knownSigner işaretini kullanabilirsiniz. Ardından, sistem, istekte bulunan uygulamanın imza soyundaki mevcut imzalayan da dahil olmak üzere herhangi bir imzalayan, knownCerts özelliğinde izinle birlikte beyan edilen özetlerden biriyle eşleşirse bu izni istekte bulunan uygulamaya verir.
knownSigner işareti, cihazların ve uygulamaların, cihaz üretimi ve gönderimi sırasında uygulamaları imzalamak zorunda kalmadan diğer uygulamalara imza izinleri vermesine olanak tanır.
Kullanıcı kimlikleri ve dosya erişimi
Android, yükleme sırasında her pakete farklı bir Linux kullanıcı kimliği verir. Kimlik, paketin söz konusu cihazdaki kullanım ömrü boyunca sabit kalır. Aynı paket, farklı bir cihazda farklı bir UID'ye sahip olabilir. Önemli olan, her paketin belirli bir cihazda farklı bir UID'ye sahip olmasıdır.
Güvenlik zorunluluğu işlem düzeyinde gerçekleştiğinden, iki paketin kodu normalde aynı işlemde çalışamaz. Bunun nedeni, farklı Linux kullanıcıları olarak çalışması gerekmesidir.
Bir uygulama tarafından depolanan tüm verilere, söz konusu uygulamanın kullanıcı kimliği atanır ve bu verilere normalde diğer paketler erişemez.
Android'in güvenlik modeli hakkında daha fazla bilgi için Android Güvenliğine Genel Bakış başlıklı makaleyi inceleyin.
İzinleri tanımlama ve zorunlu kılma
Kendi izinlerinizi zorunlu kılmak için öncelikle bunları AndroidManifest.xml içinde bir veya daha fazla
<permission> öğesi kullanarak bildirmeniz gerekir.
Adlandırma kuralı
Sistem, tüm paketler aynı sertifikayla imzalanmadığı sürece birden fazla paketin aynı ada sahip bir izin bildirmesine izin vermez. Bir paket izin bildiriyorsa sistem, bu paketler ilk paketle aynı sertifikayla imzalanmadığı sürece kullanıcının aynı izin adına sahip diğer paketleri yüklemesine de izin vermez.
İzinlere, ters alan adı stili adlandırma kullanılarak uygulamanın paket adıyla önek eklemenizi, ardından .permission. ve büyük harflerle SNAKE_CASE biçiminde iznin temsil ettiği özelliğin açıklamasını eklemenizi öneririz. Örneğin,
com.example.myapp.permission.ENGAGE_HYPERSPACE.
Bu öneriye uyarak ad çakışmalarını önleyebilir ve özel izinlerin sahibini ve amacını net bir şekilde belirleyebilirsiniz.
Örnek
Örneğin, etkinliklerinden birini hangi uygulamaların başlatabileceğini kontrol etmesi gereken bir uygulama, bu işlem için izni aşağıdaki gibi bildirebilir:
<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>
protectionLevel özelliği zorunludur ve sistemin, izin gerektiren uygulamalar veya hangi uygulamaların izni tutabileceği konusunda kullanıcıları nasıl bilgilendireceğini belirtir. Bu bilgiler, bağlantılı dokümanda açıklanmıştır.
android:permissionGroup özelliği isteğe bağlıdır ve yalnızca sistemin izinleri kullanıcıya göstermesine yardımcı olmak için kullanılır. Çoğu durumda bunu standart bir sistem grubu (android.Manifest.permission_group bölümünde listelenmiştir) olarak ayarlarsınız. Ancak aşağıdaki bölümde açıklandığı gibi grubu kendiniz de tanımlayabilirsiniz.
Kullanıcıya gösterilen izin kullanıcı arayüzünü basitleştirdiği için mevcut bir grubu kullanmanızı öneririz.
İzin için hem etiket hem de açıklama sağlamanız gerekir. Bunlar, kullanıcının izin listesini (android:label) veya tek bir iznin ayrıntılarını (android:description) görüntülerken görebileceği dize kaynaklarıdır. Etiket kısadır: İznin koruduğu temel işlevselliği açıklayan birkaç kelime. Açıklama, iznin sahibine neler yapma olanağı verdiğini açıklayan birkaç cümleden oluşur. Bizim kuralımız, iki cümlelik bir açıklamadır. İlk cümlede izin açıklanır, ikinci cümlede ise bir uygulamaya izin verilmesi durumunda neler olabileceği konusunda kullanıcı uyarılır.
Aşağıda, CALL_PHONE
izni için etiket ve açıklama örneği verilmiştir:
<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>
İzin grubu oluşturma
Önceki bölümde gösterildiği gibi, sistemin kullanıcılara izinleri açıklamasını sağlamak için android:permissionGroup özelliğini kullanabilirsiniz. Çoğu durumda bunu standart bir sistem grubu olarak ayarlarsınız (android.Manifest.permission_group içinde listelenir), ancak <permission-group> ile kendi grubunuzu da tanımlayabilirsiniz.
<permission-group> öğesi, bir izin grubu için bir etiket tanımlar. Bu etiket, hem manifestte <permission> öğeleriyle hem de başka yerlerde belirtilen izinleri içerir. Bu durum yalnızca izinlerin kullanıcıya sunulurken nasıl gruplandırıldığını etkiler. <permission-group>
öğesi, gruba ait izinleri belirtmez ancak gruba bir ad verir.
Grup adını <permission>
elementinin
permissionGroup
özelliğine atayarak gruba izin yerleştirebilirsiniz.
<permission-tree>
öğesi, kodda tanımlanan bir izin grubu için ad alanı bildirir.
Özel izin önerileri
Uygulamalarınız için özel izinler tanımlayabilir ve <uses-permission> öğelerini tanımlayarak diğer uygulamalardan özel izinler isteyebilirsiniz.
Ancak, bunu yapmanın gerekli olup olmadığını dikkatlice değerlendirin.
- Birbirine işlevsellik sunan bir uygulama paketi tasarlıyorsanız uygulamaları her iznin yalnızca bir kez tanımlanacağı şekilde tasarlamaya çalışın. Uygulamaların tümü aynı sertifikayla imzalanmamışsa bunu yapmanız gerekir. Uygulamaların tümü aynı sertifikayla imzalanmış olsa bile her izni yalnızca bir kez tanımlamak en iyi uygulamadır.
- İşlev yalnızca sağlayıcı uygulamayla aynı imzayla imzalanmış uygulamalarda kullanılabiliyorsa imza kontrollerini kullanarak özel izinler tanımlamaktan kaçınabilirsiniz. Uygulamalarınızdan biri diğerinden istekte bulunduğunda ikinci uygulama, isteği yerine getirmeden önce her iki uygulamanın da aynı sertifikayla imzalandığını doğrulayabilir.
Özel izin gerekliyse yalnızca izin kontrolünü gerçekleştiren uygulamayla aynı geliştirici tarafından imzalanan uygulamaların bu izne erişmesi gerekip gerekmediğini değerlendirin. Örneğin, aynı geliştiricinin iki uygulaması arasında güvenli süreçler arası iletişim uygularken bu durum geçerlidir. Bu durumda imza izinlerini kullanmanızı öneririz. İmza izinleri kullanıcı için şeffaftır ve kullanıcı tarafından onaylanan izinleri önler. Bu izinler kullanıcıların kafasını karıştırabilir.
Şu konular hakkında bilgi edinmeye devam edin:
<uses-permission>- Uygulamanızın gerekli sistem izinlerini bildiren manifest etiketi için API referansı.
Şunlar da ilginizi çekebilir:
- Android Güvenliğine Genel Bakış
- Android platformunun güvenlik modeli hakkında ayrıntılı bir tartışma.