Özel uygulama izni tanımlama

Bu dokümanda, uygulama geliştiricilerinin güvenlik özelliklerini kullanarak kendi izinlerini tanımlamalarını sağlar. Ölçüt özel izinler tanımlandığında bir uygulama, kaynaklarını ve özelliklerini paylaşabilir Google Analytics 4'te çalışır. İzinler hakkında daha fazla bilgi için izinlere genel bakış başlıklı makaleye bakın.

Arka plan

Android, ayrıcalıkla ayrılmış bir işletim sistemidir ve uygulama ayrı bir sistem kimliğiyle çalışır (Linux kullanıcı kimliği ve grubu kimliği). Sistemin bölümleri de farklı kimliklere ayrılır. Bu sayede Linux, uygulamaları birbirinden ve sistemden ayırır.

Uygulamalar, izinler tanımlayarak işlevlerini diğer uygulamalara sunabilir izin verilenler listesine eklenir. Ayrıca her bir ekip üyesinin imzalanan diğer uygulamaların kullanımına otomatik olarak sunulur. aynı sertifikaya sahip olursunuz.

Uygulama imzalama

Tüm APK'ların sertifika ile imzalanması gerekir geliştiricisi tarafından tutulan bir kullanıcı olabilir. Sertifika, bir sertifika yetkilisi tarafından imzalanması gerekir. İzin verilebilir. normal olarak kabul edilen, Android uygulamalarının kendinden imzalı sertifikalar kullanması için geçerlidir. Amacı uygulama yazarlarını ayırt etmek için kullanılır. Bu şekilde sistem, uygulamaların imza düzeyinde erişim izni verip izin verebilir ve bir uygulamanın sunulan istek için gereken izinleri verebilir veya aynı Linux kimliğine sahip olmalıdır.

Cihaz üretim zamanından sonra imza izinleri verin

Android 12'den (API düzeyi 31) itibaren knownCerts özelliği için imza düzeyinde izinler, bilinen imzalama bilgilerinin özetlerine göz atabilmenizi sağlar. beyandaki sertifikalar gerekir.

knownCerts özelliğini tanımlayıp knownSigner işaretini kullanabilirsiniz. uygulamanızın protectionLevel ilişkilendirmek kullanabilirsiniz. Ardından sistem istekte bulunan uygulamanın arasında yer alan özetlerden biriyle eşleşen özet akışı knownCerts özelliğindeki izinle açıklandı.

knownSigner işareti, cihazların ve uygulamaların şunlar için imza izinleri vermesini sağlar: cihaz üretimi sırasında uygulamaları imzalamak zorunda kalmadan diğer uygulamaları ve sevkiyat.

Kullanıcı kimlikleri ve dosya erişimi

Android, yükleme sırasında her pakete ayrı bir Linux kullanıcı kimliği verir. İlgili içeriği oluşturmak için kullanılan Kimlik, paketin bu öğedeki ömrü boyunca sabit kalır. olanak tanır. Farklı bir cihazda, aynı paket farklı bir UID: Önemli olan, her paketin belirli bir olanak tanır.

Çünkü güvenlik yaptırımı yoksa hiçbir iki paketin kodu da normalde bu farklı Linux kullanıcıları olarak çalıştırılmaları gerekeceğinden aynı işlemde kullanılabilir.

Bir uygulamanın depoladığı tüm veriler o uygulamanın kullanıcısına atanır kimliğidir ve normalde diğer paketler tarafından erişilemez.

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

İzinleri tanımlama ve zorunlu kılma

Kendi izinlerinizi uygulamak için öncelikle bunları Bir veya daha fazla kullanarak AndroidManifest.xml <permission> öğeleri.

Adlandırma kuralı

Sistem, birden fazla paketin bildirimde bulunmasına izin vermiyor tüm paketlerin hepsi aynı sertifikaya sahip olursunuz. Bir paket bir izin beyan ederse sistem de Kullanıcının aynı izin adına sahip başka paketler yüklemesine izin ver. bu paketler ilk paketle aynı sertifikayla imzalanır.

İzinlerin ön ekini bir uygulamanın paket adıyla birlikte eklemenizi öneririz. ters alan adı stilinde adlandırma ve ardından .permission. iznin temsil ettiği yeteneğin açıklaması üst SNAKE_CASE. Örneğin, com.example.myapp.permission.ENGAGE_HYPERSPACE

Bu önerinin uygulanması, adlandırma çakışmalarını önler ve reklamların özel iznin sahibini ve amacını tanımlama

Örnek

Örneğin, başka hangi uygulamaların bir uygulama başlatabileceğini kontrol etmesi gereken bir uygulama etkinliğinden tanesi bu işlem için aşağıdaki şekilde 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 gereklidir ve sisteme veya izin gerektiren uygulamalar konusunda kullanıcılara bilgi vermek bağlantılı belgelerde açıklandığı gibi izne sahip olmalısınız.

android:permissionGroup özelliğinin isteğe bağlıdır ve yalnızca sistemin görüntüleme izinlerini vermesine yardımcı olmak için kullanılır. kullanıcıya gösterir. Çoğu durumda bunu standart bir sisteme ayarlarsınız. android.Manifest.permission_group grubunda listelenir. ancak aşağıdaki bölümde açıklandığı şekilde grubu kendiniz tanımlayabilirsiniz. Mevcut bir grubu kullanmanızı öneririz, çünkü bu daha basit bir kullanıcıya gösterilen izin kullanıcı arayüzü.

Etiket için hem etiket hem de açıklama izni gerekir. Bunlar, kullanıcının İzinlerin listesini görüntülüyorlar (android:label) tek bir izinle ilgili ayrıntılar (android:description). Etiket kısadır; projenin en önemli parçasını açıklayan birkaç kelime açık bir şekilde korunduğundan emin olun. Açıklama izin sahibinin neler yapmasına olanak tanıdığını açıklayan birkaç cümle. Bizim kuralı, ilk cümlenin açıklamaya yerleştiği iki cümlelik hem de ikinci cümle kullanıcıyı bu tür şeyler hakkında uyarır. bu durum ters gidebilecek niteliktedir.

Şunun için bir etiket ve açıklama örneği: CALL_PHONE. izin:

<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, android:permissionGroup özelliğini kullanabilirsiniz. kullanıcıya izin verilmelidir. Çoğu durumda bunu standart bir sistem grubu (listelenmiş) android.Manifest.permission_group), Ancak kendi grubunuzu <permission-group>.

<permission-group> öğesi bir grup için etiket tanımlar izinlerin her ikisi de manifest dosyasında <permission> öğeleri ve başka yerlerde beyan edilenler. Bu yalnızca izinlerin nasıl kullanılabileceğini etkiler. kullanıcıya sunulduğunda gruplandırılır. İlgili içeriği oluşturmak için kullanılan <permission-group>. öğesi, gruba ait izinleri belirtmez, ancak bu gruba bir ad verir.

Gruba bir izin vermek için, <permission>. öğenin permissionGroup özelliğini gönderin.

İlgili içeriği oluşturmak için kullanılan <permission-tree>. öğesi, girin.

Özel izin önerileri

Uygulamalarınız için özel izinler tanımlayabilir ve özel izinler isteyebilirsiniz <uses-permission> öğelerini tanımlayarak diğer uygulamalardan isteyin. Bununla birlikte, bunun gerekli olup olmadığını dikkatlice değerlendirin.

  • İşlevlerin sunulduğu bir uygulama paketi tasarlıyorsanız bir başkasında, uygulamaları her izin yalnızca tanımlanmış olacak şekilde bir kez. Uygulamaların hepsi aynı şekilde imzalanmamışsa bunu yapmanız gerekir sertifikası. Uygulamaların tümü aynı sertifikayla imzalanmış olsa bile her izni yalnızca bir kez tanımlamak en iyi uygulamadır.
  • Bu işlev yalnızca aynı sağlayan uygulama olarak kabul ederseniz, özel hedefler tanımlamak yerine izin kontrollerini kullanabilirsiniz. Uygulamalarınızdan biri istekte bulunduğunda kullanıyorsanız, ikinci uygulama her iki uygulamanın da imzalandığını doğrulayabilir aynı sertifikaya sahip olması gerekir.

Özel bir izin gerekiyorsa yalnızca bunu yapan kullanıcı tarafından onaylanması, örneğin, güvenli işlemler arası iletişimler uygularken aynı geliştiriciye ait iki uygulama arasında geçiş yapmaktır. Varsa imza izinleri hakkında daha fazla bilgi edinin. İmza izinleri kullanıcı için şeffaftır ve kullanıcı tarafından onaylanmasını önler izin verir. Bu durum kullanıcıların kafasını karıştırabilir.

Şununla ilgili haberleri 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 tartışma.