Firebase App Check

Ceyda Koç Özlü
IBTech
Published in
6 min readApr 28, 2022

--

Merhaba,

Bu yazımda sizlere backend kaynaklarını kötüye kullanımdan koruyan bir güvenlik özelliği olarak tanıtılan Firebase App Check’i anlatmaya çalışacağım.

Firebase Authentication ve App Check

Bilindiği gibi bir uygulama geliştirilirken güvenlik en çok zorlanılan konulardan biridir. Thread sayısı, request sayısı gibi parametreler arttıkça; kullanıcıları, kullanıcıların verilerini ve kaynaklara erişimi korumak gittikçe daha önemli bir hale gelmektedir.

Kullanıcıları ve kullanıcıların verilerini korumak için Firebase Authentication güvenlik kurallarıyla beraber mevcutta kullanılabilir durumdadır. Firebase Authentication uygulamanın kullanıcısının kimliğini doğrulamaya yararken, Firebase güvenlik kuralları da kimin erişmeye çalıştığına bağlı olarak verilere erişimi yönetmeye olanak tanır.

Kimlik doğrulama için bu şekilde Firebase Authentication kullanılabilirken kaynaklara erişim konusunda da bir güvenlik özelliğine ihtiyaç duyulmaktadır. Bu noktada yalnızca güvenilir uygulamalarımızın backend kaynaklarına erişebilmesi istenir. Tam da burada, uygulama ve kaynak güvenliğini geliştirmeye yönelik yeni bir platform olan Firebase App Check devreye girer.

App Check’e Neden İhtiyaç Duyarız?

App Check’in nasıl yardımcı olabileceğini daha iyi anlamak için tanıtımında da verilen bir örnek üzerinden gidelim.

Android geliştiricisi tarafından kullanıcıların medya içeriği yükledikleri ve depoladıkları bir medya paylaşım uygulamasının geliştirilmiş olduğunu varsayalım.

Kullanıcıların yalnızca kendi içeriklerine veya arkadaşlarının paylaştığı içeriklere erişebildiğinden emin olmak için uygulamanın backend’i Firebase Authentication ile entegre edilmiş. Uygulama Play Store’a yüklendikten sonra ise oldukça büyüdüğü, çok fazla insan tarafından kullanıldığı gözlenmiş. Bir gün ise backend trafiğinde olağan dışı büyük bir artış fark edilmiş. Araştırmalar sonucunda bu trafiğin uygulamadan gelmediği, uygulamanın kimlik bilgilerinin çalındığı ve bunların doğrudan backend’e erişmek için kullanıldığı ortaya çıkmış.

Böyle bir senaryoda mevcutta yapılabilecek birkaç şey vardır:

  • Bunlardan biri saldırganın artık backend’e erişimi olmayacak şekilde uygulamanın kimlik bilgisi rotasyonunu yapmak olabilir.
  • Başka bir seçenek ise uygulamanın API Key’ine kısıtlamalar eklemek olabilir.
  • Bu yaklaşımların her ikisinin de aslında hala sınırlamaları vardır. Öte yandan, Android geliştiricisinin uygulamadan geldiği doğrulanamayan trafiği direkt reddetmesi daha iyi bir çözüm olabilir.

Bahsedilen son çözüm yani uygulamadan geldiği doğrulanamayan trafiğin reddedilmesi durumu App Check’in devreye girdiği bir kullanım örneğidir. Bu koruma App Check kullanılarak kolayca uygulamaya eklenebilir.

App Check Tam Olarak Nedir ve Nasıl Çalışır?

App Check trafiğin uygulamamızdan geldiğini doğrulayarak hizmetlerimize erişimi korur. Bunu da iki önemli şeyi yaparak sağlar:

  1. Uygulama Onayı: Uygulamamızın geçerli bir cihazda çalıştığının ve bunun gerçekten bizim uygulamamız olduğunun doğrulanma işlemidir. Bunun için onay sağlayıcıları kullanılır.
  2. Kaynak Erişimi: Trafiğin App Check’ten gelen kimlik bilgilerini içermesi ve request’in uygulamamızdan geldiğinin kanıtlanmasıyla kontrol edilir.

App Check’in çalışma akışı şu şekilde işler:

  • Herhangi bir kullanıcı cihazında uygulamamızı açar.
  • Uygulama, bizim uygulamamız olduğunu doğrulamak için yapılandırdığımız onay sağlayıcısı ile iletişim kurar. Onay sağlayıcısı onayladıktan sonra bir App Check token üretilir.
  • Uygulama kaynaklara erişmeye çalışırken üretilen bu token da iletilir.
  • App Check token, App Check servisi tarfından doğrulanarak kaynaklara erişim sağlanır.

App Check’te Desteklenen Onay Sağlayıcıları Nelerdir?

  • Android’de App Check SafetyNet ile entegredir.
  • iOS’ta Uygulama Onayı ve Cihaz Kontrolü ile entegredir.
  • Web için ise isteklerin bir bottan gelmediğini doğrulamak için reCAPTCHA kullanılabilir.
  • Ek olarak, geliştiricinin kendi uygulama doğrulama sağlayıcısını entegre edebileceği özel bir doğrulama entegrasyonu da sunulmuştur. IOT veya masaüstü gibi diğer platformların kapsanması isteniyorsa bu entagrasyon kullanılabilir.

App Check Nasıl Kullanılır?

App Check’i yapılandırırken iki ana adım vardır.

  1. App Registration: Uygulamamızı kaydetmeyi ve SDK’ini yüklemeyi içerir. Uygulama App Check’i kullanmak üzere kaydedildiğinde, Firebase servislerine yapılan isteklerde App Check token’larını almaya ve eklemeye başlamasına olanak tanır.
  2. Enforcement: Uygulama için App Check enforcement açıldığında ise geçerli bir token içermeyen isteklerin reddedilmesi sağlanmış olur. Enforcement modu ayarlandığında o ürün için App Check koruması tamamen etkinleştirilmiş olur ve API’ye yapılan tüm isteklerin mutlaka geçerli bir token içermesi gerekir.

App Check’i kullanmak için uygulama kaydedilmek istenirse Firebase konsolunda “Proje Ayarları”na tıklanır.

Proje ayarları sayfasında “App Check” sekmesi bulunmaktadır. Burada projedeki tüm uygulamalar ve App Check kayıt durumu görülebilir. Her platform için onay sağlayıcılarının doğru bir şekilde yapılandırılması için de bazı bilgilerin girilmesi gerekmektedir. Örneğin Android için SHA-256 sertifikasına ihtiyaç duyar.

Ekranda aşağıya doğru inildiğinde ise kullanılan kaynaklar için trafiği gösteren bir grafik yer almaktadır. Aşağıda bulunan “Enforce” butonuna tıklandığında geçerli bir App Check token bulundurmayan istekler API’den cevap alamaz.

Uygulamayı Firebase konsolunda yapılandırdıktan sonra ise sıra uygulamaya kodu eklemeye gelir. App Check’in eklenmesi için gerekli adımlar Firebase’in dökümantasyonunda her bir ortam için ayrıntılı bir şekilde yer almaktadır. Aşağıda Android’e entegre edilmesinin örneğine yer verilmiştir.

  • Android’e entegre edilmesi için ilk olarak app-level Gradle dosyasına App Check kütüphanesinin eklenmesi gerekir.
  • Kütüphane eklendikten sonra ise aşağıdaki kod parçası kullanılarak entegrasyon tamamlanır.

Bu entegrasyonlar tamamlandıktan sonra ise Firebase konsolunda App Check trafiği izlenmeye başlanabilir.

App Check Trafiğinin İzlenmesi

Yukarıda önceden yapılandırılmış App Check’e sahip bir Firebase projesi örneği yer almaktadır.

App Check istek metrikleri olarak:

  • Cloud Storage’a gelen doğrulanmış isteklerin (Verified requests),
  • Eski bir istemciden gelen doğrulanmamış isteklerin (Unverified: likely outdated client requests),
  • Bilinmeyen bir kaynaktan gelen doğrulanmamış isteklerin (Unverified: unknown origin requests),
  • Son olarak da kötü niyetli doğrulanmamış isteklerin (Unverified: malicious requests) yüzdeleri görülmektedir.

Bu metrikler çok önemlidir çünkü ürün enforce edilmeden önce mutlaka bu metriklerin dikkate alınması gerekir. Burada yer alan ilk metrik olan doğrulanmış istekler geçerli bir uygulamadan geçerli bir token ile gelen istekleri oluşturur. Kritik olarak, eğer ürün enforce edilirse, izin verilecek tek istek türü bu isteklerdir. Yani bu örnek için tüm isteklerin sadece %50'sini oluşturmaktadır.

İkincisi ise doğrulanmamış ve büyük olasılıkla güncel olmayan isteklerdir. Bu istekler muhtemelen uygulamamızdan gelir ancak bu istekleri gönderen kullanıcılar eski bir sürümü kullanmaktadırlar. Bu örnek için bakıldığında oldukça yüksek bir kullanıcı oranının eski bir sürümü kullandığı görülmektedir. Dolayısıyla, eğer proje enforce edilirse bu kullanıcıların hiçbiri isteklerine cevap alamayacaktır. Böyle bir örnek için önce kullanıcıları güncel sürümü kullanmaları için teşvik etmek; sonrasında projeyi enforce etmek oldukça önemlidir.

Bir sonraki kategori ise bilinmeyen kaynaktan gelen isteklerdir. Bu isteklerde eklenmiş bir App Check token bulunmaz, yani büyük olasılıkla bu trafik uygulamamızdan gelmemektedir.

Son kategori ise doğrulanmamış kötü niyetli isteklerdir. Bu isteklere eklenmiş geçersiz bir App Check token bulunur. Bu da bu isteklerin güvenilir uygulamalarımız dışından geldikleri anlamına gelmektedir.

Eğer son iki kategoriden gelen isteklerin büyük bir yüzdesi varsa, App Check enforcement’ı açmak bu trafiği durdurmaya yardımcı olabilir. Yine de enforce edildiğinde doğrulanmamış yani ilk kategoriye ait olmayan tüm trafik reddedileceği için dikkatli olunmalıdır. Bunun için de App Check uygulanmadan önce muhtemelen güncel olmayan kategoriden gelen trafik iyi analiz edilmelidir.

Öte yandan, eğer ki yeni bir uygulama geliştiriliyorsa, eski bir client olmayacağı için geliştirmenin başından itibaren enforce edilmesi önerilmektedir.

Peki ya emülatör kullanıyorsak?

Emülatörler maalesef SafetyNet onayından geçemezler. Bu nedenle bu tarz ortamlarda debug App Check provider kullanılmalıdır.

App Check hakkında öğrendiklerimi aktarmaya çalıştığım bu yazım umarım faydalı olmuştur. Keyifli okumalar dilerim :)

--

--