Özel uygulama izni tanımlama

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, her uygulamanın ayrı bir sistem kimliğiyle (Linux kullanıcı kimliği ve grup kimliği) çalıştığı, ayrıcalıkların ayrıldığı bir işletim sistemidir. 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üzeyi izni için uygulamanızın protectionLevel özelliğinde knownSigner işaretini kullanabilirsiniz. Ardından, sistem, mevcut imzalayan da dahil olmak üzere, istekte bulunan uygulamanın imzalama soyundaki 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, 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 aynı ada sahip bir izni birden fazla paketin bildirmesine izin vermez. Bir paket izin bildirirse 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 iznin 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 şekilde 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 hakkında kullanıcıları nasıl bilgilendireceğini veya hangi uygulamaların izni tutabileceğini (bağlantılı dokümanda açıklandığı gibi) belirtir.

android:permissionGroup özelliği isteğe bağlıdır ve yalnızca sistemin kullanıcılara izinleri 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 olabilecek sorunlar 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 bir yerde tanımlanan 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 uygulanırken 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 için kafa karıştırıcı olabilir.

Ş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.