Özel uygulama izni tanımlama

Bu dokümanda, uygulama geliştiricilerin kendi izinlerini tanımlamak için Android'in sağladığı güvenlik özelliklerini nasıl kullanabileceği açıklanmaktadır. Uygulamalar özel izinler tanımlayarak kaynaklarını ve özelliklerini diğer uygulamalarla paylaşabilir. İzinler hakkında daha fazla bilgi edinmek için izinlere genel bakış sayfasına göz atın.

Arka plan

Android, ayrıcalıkla ayrılmış bir işletim sistemidir. Bu işletim sisteminde her uygulama farklı bir sistem kimliğiyle (Linux kullanıcı kimliği ve grup kimliği) çalışır. Sistemin bazı kısımları da farklı kimliklere ayrılır. Bu sayede Linux, uygulamaları birbirinden ve sistemden ayırır.

Uygulamalar, diğer uygulamaların isteyebileceği izinler tanımlayarak işlevlerini diğer uygulamalara sunabilir. Ayrıca, aynı sertifikayla imzalanmış diğer uygulamalara otomatik olarak sunulacak izinler de tanımlayabilirler.

Uygulama imzalama

Tüm APK'lar, özel anahtarı geliştiricisinin elinde bulunduran bir sertifikayla imzalanmalıdır. Sertifikanın bir sertifika yetkilisi tarafından imzalanması gerekmez. Android uygulamalarının kendinden imzalı sertifikalar kullanmasına izin verilir ve tipik bir durumdur. Android'de sertifikaların amacı, uygulama yazarlarını ayırt etmektir. Bu, sistemin uygulamalara imza düzeyindeki izinlere erişim izni vermesine veya bunu reddetmesine ve bir uygulamanın başka bir uygulamayla aynı Linux kimliğine sahip olma isteğini kabul etmesine ya da reddetmesine olanak tanır.

Cihaz üretim zamanından sonra imza izinleri verme

Android 12'den (API düzeyi 31) itibaren, imza düzeyindeki izinler için knownCerts özelliği, bildirim sırasında bilinen imza sertifikalarının özetlerine başvurmanıza olanak tanır.

Belirli bir imza düzeyindeki izin için knownCerts özelliğini beyan edebilir ve uygulamanızın protectionLevel özelliğinde knownSigner işaretini kullanabilirsiniz. Daha sonra sistem, istekte bulunan uygulamanın imzalama sınıfındaki herhangi bir imzalayan (mevcut imzalayan da dahil) knownCerts özelliğinde izin verilen özetlerden biriyle eşleşirse istekte bulunan uygulamaya bu izni verir.

knownSigner işareti, cihazların ve uygulamaların üretim ve sevkiyat sırasında uygulamaları imzalamak zorunda kalmadan diğer uygulamalara imza izinleri vermesine olanak tanır.

Kullanıcı kimlikleri ve dosya erişimi

Yükleme sırasında Android, her pakete ayrı bir Linux kullanıcı kimliği verir. Kimlik, paketin bu cihazda kullanıldığı süre boyunca sabit kalır. Farklı bir cihazda, aynı paketin farklı bir UID'si olabilir. Önemli olan, her paketin belirli bir cihazda farklı bir UID'sinin olmasıdır.

Güvenlik uygulaması işlem düzeyinde gerçekleştiğinden bu iki paketin kodu, farklı Linux kullanıcıları olarak çalışmaları gerektiğinden normalde aynı işlemde çalışamaz.

Bir uygulama tarafından depolanan tüm verilere o uygulamanın kullanıcı kimliği atanır ve normalde diğer paketlere erişilemez.

Android'in güvenlik modeli hakkında daha fazla bilgi için Android Güvenliğine Genel Bakış konusuna bakın.

İzinleri tanımlama ve zorunlu kılma

Kendi izinlerinizi zorunlu kılmak için önce bir veya daha fazla <permission> öğesi kullanarak bunları AndroidManifest.xml öğenizde beyan etmeniz gerekir.

Adlandırma kuralı

Sistem, tüm paketler aynı sertifikayla imzalanmadığı sürece birden fazla paketin aynı ada sahip bir izni beyan etmesine izin vermez. Bir paket bir 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.

İzinlerin önüne önce ters alan stilinde adlandırmayı, ardından .permission. ifadesini ve sonra da iznin temsil ettiği işlevin açıklamasını ekleyerek SNAKE_CASE üst bilgisine uygulamanın paket adını eklemenizi öneririz. Örneğin, com.example.myapp.permission.ENGAGE_HYPERSPACE.

Bu öneriyi uygulamak, adlandırma çakışmalarını önler ve özel iznin sahibi ile amacını net bir şekilde tanımlamaya yardımcı olur.

Örnek

Örneğin, etkinliklerinden birini hangi diğer uygulamaların başlatabileceğini kontrol etmesi gereken bir uygulama, bu işlem için aşağıdaki gibi bir izin beyan edebilir:

<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 sisteme, izin gerektiren uygulamalar hakkında nasıl bilgi vereceğini veya hangi uygulamaların bu izne sahip olabileceği konusunda bağlantıdaki dokümanlarda açıklandığı şekilde bilgi verir.

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, bu grubu standart bir sistem grubu (android.Manifest.permission_group listesinde listelenir) olarak ayarlarsınız. Bununla birlikte, grubu aşağıdaki bölümde açıklandığı gibi 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 bir etiket hem de açıklama sağlamanız gerekir. Bunlar, kullanıcıların izin listesini (android:label) veya tek bir izinle ilgili ayrıntıları (android:description) görüntülerken görebileceği dize kaynaklarıdır. Etiket kısadır: İznin koruduğu temel işlevi açıklayan birkaç kelime. Açıklama, iznin izin sahibinin ne yapmasına izin verdiğini açıklayan birkaç cümleden oluşur. Kurallarımız, ilk cümlede iznin açıklandığı, ikinci cümlenin de bir uygulamaya izin verildiğinde ters gidebilecek şeyler konusunda kullanıcıyı uyardığı iki cümlelik bir açıklamadır.

CALL_PHONE izni için bir etiket ve açıklama örneğini burada bulabilirsiniz:

<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 izinleri kullanıcıya açıklamasına yardımcı olmak için android:permissionGroup özelliğini kullanabilirsiniz. Çoğu durumda, bunu standart bir sistem grubu (android.Manifest.permission_group içinde listelenen) olarak ayarlarsınız ancak <permission-group> ile kendi grubunuzu da tanımlayabilirsiniz.

<permission-group> öğesi, hem manifest'te <permission> öğeleriyle hem de başka bir yerde tanımlanan izin grupları için etiket tanımlar. Bu yalnızca kullanıcıya sunulduğunda izinlerin gruplandırılma şeklini etkiler. <permission-group> öğesi gruba ait olan izinleri belirtmez ancak gruba bir ad verir.

<permission> öğesinin permissionGroup özelliğine grup adını atayarak gruba izin verebilirsiniz.

<permission-tree> öğesi, kodda tanımlanmış bir izin grubu için ad alanı tanımlar.

Özel izin önerileri

<uses-permission> öğeleri tanımlayarak uygulamalarınız için özel izinler tanımlayabilir ve 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 hepsi aynı sertifikayla imzalanmamışsa bunu yapmanız gerekir. Uygulamaların tümü aynı sertifikayla imzalanmış olsa bile en iyi uygulama, her izni yalnızca bir kez tanımlamaktır.
  • İşlevsellik yalnızca sağlayan uygulamayla aynı imzaya sahip olan uygulamalar tarafından kullanılabiliyorsa imza kontrollerini kullanarak özel izinler tanımlamaktan kaçınmanız mümkün olabilir. Uygulamalarınızdan biri, başka bir uygulamanız için istekte bulunduğunda, ikinci uygulama bu isteği yerine getirmeden önce her iki uygulamanın da aynı sertifikayla imzalandığını doğrulayabilir.

Özel izin gerekiyorsa yalnızca izin kontrolünü gerçekleştiren uygulamayla aynı geliştirici tarafından imzalanan uygulamaların erişime ihtiyacı olup olmadığını göz önünde bulundurun (örneğin, aynı geliştiriciye ait iki uygulama arasında güvenli ara işlem iletişimleri uygularken). Bu durumda imza izinlerini kullanmanızı öneririz. İmza izinleri kullanıcı için şeffaftır ve kullanıcıların kafasını karıştırabilecek kullanıcı tarafından onaylanmış izinlerden kaçınır.

Şununla ilgili okumaya devam edin:

<uses-permission>
Uygulamanızın gerekli sistem izinlerini tanımlayan 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 konuşma.