Ağ güvenliği yapılandırması

Ağ Güvenlik Yapılandırması özelliği, uygulamanızın ağ güvenliği ayarlarını uygulama kodunda değişiklik yapmadan güvenli ve açıklayıcı bir yapılandırma dosyasında özelleştirmenize olanak tanır. Bu ayarlar belirli alanlar ve belirli bir uygulama için yapılandırılabilir. Bu özelliğin temel özellikleri şunlardır:

  • Özel güven ankrajları: Bir uygulamanın güvenli bağlantıları için hangi Sertifika Yetkililerine (CA) güvenileceğini özelleştirin. Örneğin, belirli kendi kendine imzalanan sertifikalara güvenme veya uygulamanın güvendiği herkese açık CA grubunu kısıtlama.
  • Yalnızca hata ayıklama için geçersiz kılma: Yüklü tabana ek risk oluşturmadan bir uygulamadaki güvenli bağlantılarda güvenli bir şekilde hata ayıklama
  • Açık metin trafiğini devre dışı bırakma: Uygulamaları, açık metin (şifrelenmemiş) trafiğin yanlışlıkla kullanılmasından koruyun.
  • Sertifika şeffaflığını etkinleştirme: Uygulamanın güvenli bağlantılarını, kanıtlanabilir şekilde günlüğe kaydedilmiş sertifikalar kullanacak şekilde kısıtlayın.
  • Sertifika sabitleme: Bir uygulamanın belirli sertifikalarla güvenli bağlantısını kısıtlayın.

Ağ Güvenliği Yapılandırması dosyası ekleme

Ağ Güvenlik Yapılandırması özelliği, uygulamanızın ayarlarını belirttiğiniz bir XML dosyası kullanır. Bu dosyayı işaretlemek için uygulamanızın manifest dosyasına bir giriş eklemeniz gerekir. Bir manifest'ten alınan aşağıdaki kod snippet'inde bu girişin nasıl oluşturulacağı gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

Güvenilir CA'ları özelleştirme

Uygulamanızın, platformun varsayılan CA'ları yerine özel bir CA grubuna güvenmesini isteyebilirsiniz. Bunun en yaygın nedenleri şunlardır:

  • Kendi kendine imzalanmış veya şirket içinde yayınlanan bir CA gibi özel bir CA'ya sahip bir ana makineye bağlanma
  • CA grubunu, önceden yüklenmiş tüm CA'lar yerine yalnızca güvendiğiniz CA'larla sınırlandırma
  • Sisteme dahil edilmeyen ek CA'lara güvenme.

Varsayılan olarak, tüm uygulamalardan gelen güvenli bağlantılar (TLS ve HTTPS gibi protokoller kullanılarak) önceden yüklenmiş sistem CA'larına güvenir. Android 6.0 (API düzeyi 23) ve daha eski sürümleri hedefleyen uygulamalar da varsayılan olarak kullanıcı tarafından eklenen CA mağazasına güvenir. Uygulamanızın bağlantılarını base-config (uygulama genelinde özelleştirme için) veya domain-config (alan başına özelleştirme için) kullanarak özelleştirebilirsiniz.

Özel bir CA yapılandırın

Kendinden imzalı SSL sertifikası kullanan bir barındırıcıya veya SSL sertifikası, şirketinizin dahili CA'sı gibi güvendiğiniz herkese açık olmayan bir CA tarafından verilen bir barındırıcıya bağlanmak isteyebilirsiniz. Aşağıdaki kod snippet'inde, uygulamanızı res/xml/network_security_config.xml için özel bir CA ile nasıl yapılandıracağınız gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

Kendinden imzalı veya herkese açık olmayan CA sertifikasını PEM veya DER biçiminde res/raw/my_ca'e ekleyin.

Güvenilir CA grubunu sınırlama

Uygulamanızın, sistem tarafından güvenilen tüm CA'lara güvenmesini istemiyorsanız bunun yerine güvenilecek daha az sayıda CA belirtebilirsiniz. Bu, uygulamayı diğer CA'lardan herhangi biri tarafından verilen sahte sertifikalara karşı korur.

Güvenilir CA grubunu sınırlayan yapılandırma, belirli bir alan için özel bir CA'ya güvenmeye benzer. Tek fark, kaynakta birden fazla CA sağlanmasıdır. Aşağıdaki kod alıntısında, uygulamanızın güvenilir sertifika yetkilisi grubunun res/xml/network_security_config.xml içinde nasıl sınırlanacağı gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

Güvenilir CA'ları PEM veya DER biçiminde res/raw/trusted_roots dosyasına ekleyin. PEM biçimini kullanıyorsanız dosyanın yalnızca PEM verileri içermesi ve ek metin içermemesi gerektiğini unutmayın. Bir yerine birden fazla <certificates> öğesi de sağlayabilirsiniz.

Ek CA'lara güvenme

Uygulamanızın, sistem tarafından güvenilmeyen ek CA'lara güvenmesini isteyebilirsiniz (ör. sistem henüz CA'yı içermiyorsa veya CA, Android sistemine dahil edilme şartlarını karşılamıyorsa). Aşağıdaki alıntıya benzer bir kod kullanarak res/xml/network_security_config.xml içinde bir yapılandırma için birden çok sertifika kaynağı belirtebilirsiniz.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

Hata ayıklama için CA'ları yapılandırma

HTTPS üzerinden bağlanan bir uygulamada hata ayıklama yaparken, üretim sunucunuzun SSL sertifikasına sahip olmayan yerel bir geliştirme sunucusuna bağlanmak isteyebilirsiniz. Bu özelliği uygulamanızın kodunda herhangi bir değişiklik yapmadan desteklemek için debug-overrides kullanarak yalnızca hata ayıklama amaçlı CA'ları belirtebilirsiniz. Bu CA'lar, android:debuggable true olduğunda yalnızca güvenilirdir. IDE'ler ve derleme araçları, normalde bu işareti sürüm dışı derlemeler için otomatik olarak ayarlar.

Uygulama mağazaları, güvenlik önlemi olarak hata ayıklama yapılabilir olarak işaretlenen uygulamaları kabul etmediğinden bu kod, normal koşullu koddan daha güvenlidir.

Aşağıdaki alıntıda, res/xml/network_security_config.xml içinde yalnızca hata ayıklama amaçlı CA'ların nasıl belirtileceği gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

Sertifika şeffaflığını etkinleştirme

Sertifika Şeffaflığı (CT, RFC 9162), dijital sertifikaların güvenliğini artırmak için tasarlanmış bir internet standardıdır. CA'ların, düzenlenen tüm sertifikaları kaydeden herkese açık bir günlüke göndermesini zorunlu kılar. Bu sayede, sertifika verme sürecinde şeffaflık ve sorumluluk artar.

Tüm sertifikalarla ilgili doğrulanabilir bir kayıt tutarak CT, kötü niyetli kişilerin sertifika taklit etmesini veya CA'ların yanlışlıkla sertifika vermesini önemli ölçüde zorlaştırır. Bu sayede kullanıcılar, ortadaki adam saldırılarına ve diğer güvenlik tehditlerine karşı korunabilir. Daha fazla bilgi için resmi Certificate Transparency web sitesine bakın.

Sertifikalar, CT günlüğüne kaydedilip kaydedilmediklerinden bağımsız olarak varsayılan olarak kabul edilir. Uygulamanızın yalnızca CT günlüklerine kaydedilmiş sertifikalara sahip hedeflere bağlanmasını sağlamak için bu özelliği <base-config> veya <domain-config>'te etkinleştirebilirsiniz.

Açık metin trafiğini devre dışı bırakma

Not: Bu bölümdeki yönergeler yalnızca Android 8.1 (API düzeyi 27) veya daha eski sürümleri hedefleyen uygulamalar için geçerlidir. Android 9'dan (API düzeyi 28) itibaren açık metin desteği varsayılan olarak devre dışıdır.

Uygulamanızın yalnızca güvenli bağlantılar kullanarak hedeflere bağlanmasını istiyorsanız bu hedeflere yönelik açık metin desteğini (HTTPS yerine şifrelenmemiş HTTP protokolü kullanılarak) devre dışı bırakabilirsiniz. Bu seçenek, arka uç sunucular gibi harici kaynaklar tarafından sağlanan URL'lerdeki değişiklikler nedeniyle uygulamalarda yanlışlıkla gerilemelerin yaşanmasını önlemeye yardımcı olur. Daha fazla bilgi için NetworkSecurityPolicy.isCleartextTrafficPermitted() sayfasına bakın.

Örneğin, uygulamanızın, hassas trafiği düşman ağlardan korumak için secure.example.com ile olan bağlantıların her zaman HTTPS üzerinden yapılmasını sağlamasını isteyebilirsiniz.

Aşağıdaki alıntıda, res/xml/network_security_config.xml'te açık metnin nasıl devre dışı bırakılacağı gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

Sertifikaları sabitleme

Normalde bir uygulama, önceden yüklenmiş tüm CA'lara güvenir. Bu CA'lardan herhangi biri sahte sertifika yayınlarsa uygulama, yol üzerindeki bir saldırgan tarafından saldırıya uğrama riski altında olur. Bazı uygulamalar, güvendikleri CA'ların grubunu sınırlayarak veya sertifika sabitleyerek kabul ettikleri sertifika grubunu sınırlamayı seçer.

Sertifika sabitleme, ortak anahtarın karmasına göre (X.509 sertifikasının SubjectPublicKeyInfo) bir dizi sertifika sağlanarak yapılır. Bu durumda, sertifika zinciri yalnızca sabitlenmiş ortak anahtarlardan en az birini içeriyorsa geçerlidir.

Sertifika sabitleme özelliğini kullanırken her zaman bir yedek anahtar eklemeniz gerektiğini unutmayın. Böylece, yeni anahtarlara geçmek veya CA'ları değiştirmek zorunda kalırsanız (bir CA sertifikasına veya bu CA'nın aracısına sabitleme yaparken) uygulamanızın bağlantısı etkilenmez. Aksi takdirde, bağlantıyı yeniden kurmak için uygulamaya bir güncelleme göndermeniz gerekir.

Ayrıca, sabitleme işleminin gerçekleştirilmeyeceği bir süre sonu ayarlayabilirsiniz. Bu, güncellenmemiş uygulamalarda bağlantı sorunlarının önlenmesine yardımcı olur. Ancak sabitlemelere son kullanma tarihi ayarlamak, saldırganların sabitlenmiş sertifikalarınızı atlamasına neden olabilir.

Aşağıdaki alıntıda, res/xml/network_security_config.xml'te sertifikaların nasıl sabitleneceği gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

Yapılandırma devralma davranışı

Belirli bir yapılandırmada ayarlanmayan değerler devralınır. Bu davranış, yapılandırma dosyasını okunabilir durumda tutarken daha karmaşık yapılandırmalara olanak tanır.

Örneğin, bir domain-config içinde ayarlanmayan değerler, iç içe yerleştirilmişse üst domain-config'ten, yerleştirilmemişse base-config'ten alınır. base-config içinde ayarlanmayan değerler, platformun varsayılan değerlerini kullanır.

Örneğin, example.com alt alan adlarına yapılan tüm bağlantıların özel bir CA grubu kullanması gereken bir durumu düşünün. Ayrıca, secure.example.com alanına bağlanırken hariç olmak üzere bu alanlara şifresiz metin trafiğine izin verilir. secure.example.com yapılandırmasını example.com yapılandırmasının içine yerleştirerek trust-anchors'nin kopyalanmasına gerek kalmaz.

Aşağıdaki alıntıda, bu iç içe yerleştirmenin res/xml/network_security_config.xml'te nasıl görüneceği gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

Yapılandırma dosyası biçimi

Ağ Güvenliği Yapılandırması özelliği XML dosya biçimini kullanır. Dosyanın genel yapısı aşağıdaki kod örneğinde gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>

Aşağıdaki bölümlerde dosya biçiminin söz dizimi ve diğer ayrıntıları açıklanmaktadır.

<network-security-config>

Şunları içerebilir:
<base-config>
arasından 0 veya 1 <domain-config>
arasından herhangi bir sayı <debug-overrides> arasından 0 veya 1

<base-config>

söz dizimi:
<base-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</base-config>
Şunları içerebilir:
<trust-anchors> <certificateTransparency>
description:
Hedefi domain-config kapsamında olmayan tüm bağlantılar tarafından kullanılan varsayılan yapılandırma.

Ayarlanmamış tüm değerler için platformun varsayılan değerleri kullanılır.

Android 9 (API düzeyi 28) ve sonraki sürümleri hedefleyen uygulamaların varsayılan yapılandırması aşağıdaki gibidir:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

Android 7.0 (API düzeyi 24) ile Android 8.1 (API düzeyi 27) arasındaki sürümleri hedefleyen uygulamaların varsayılan yapılandırması aşağıdaki gibidir:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

Android 6.0 (API düzeyi 23) ve önceki sürümleri hedefleyen uygulamaların varsayılan yapılandırması aşağıdaki gibidir:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<domain-config>

söz dizimi:
<domain-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</domain-config>
Şunları içerebilir:
1 veya daha fazla <domain>
0 veya 1 <certificateTransparency>
0 veya 1 <trust-anchors>
0 veya 1 <pin-set>
İsterseniz iç içe yerleştirilmiş <domain-config>
description:
domain öğeleri tarafından tanımlandığı şekilde, belirli hedeflere yapılan bağlantılar için kullanılan yapılandırma.

Bir hedefi birden fazla domain-config öğesi kapsıyorsa en ayrıntılı (en uzun) eşleşen alan kuralı içeren yapılandırmanın kullanıldığını unutmayın.

<alanadı>

söz dizimi:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
özellikleri:
includeSubdomains
"true" ise bu alan kuralı, alan ve alt alan adlarının alt alan adları da dahil olmak üzere tüm alt alan adlarıyla eşleşir. Aksi takdirde kural yalnızca tam eşlemeler için geçerli olur.

<certificateTransparency>

söz dizimi:
<certificateTransparency enabled=["true" | "false"]/>
description:
true ise uygulama, sertifikaları doğrulamak için Sertifika Şeffaflığı günlüklerini kullanır. Bir uygulama kendi sertifikasını (veya kullanıcı mağazasını) kullandığında, sertifikanın herkese açık olmaması ve dolayısıyla sertifika şeffaflığı kullanılarak doğrulanamaması muhtemeldir. Varsayılan olarak bu durumlarda doğrulama devre dışıdır. Alan yapılandırmasında <certificateTransparency enabled="true"/> kullanılarak doğrulama zorlanmaya devam edebilir. Her <domain-config> için değerlendirme şu sırayla yapılır:
  1. certificateTransparency etkinse doğrulamayı etkinleştirin.
  2. Herhangi bir <trust-anchors> "user" ise veya satır içiyse (ör. "@raw/cert.pem") doğrulamayı devre dışı bırakın.
  3. Aksi takdirde devralınan yapılandırmayı kullanın.

<debug-overrides>

söz dizimi:
<debug-overrides>
    ...
</debug-overrides>
Şunları içerebilir:
0 veya 1 <trust-anchors>
description:
android:debuggable "true" olduğunda uygulanacak geçersiz kılmalar. Bu durum genellikle IDE'ler ve derleme araçları tarafından oluşturulan yayın dışı derlemeler için geçerlidir. debug-overrides içinde belirtilen güven bağlantıları diğer tüm yapılandırmalara eklenir ve sunucunun sertifika zinciri bu yalnızca hata ayıklama amaçlı güven bağlantılarından birini kullandığında sertifika sabitleme işlemi gerçekleştirilmez. android:debuggable "false" ise bu bölüm tamamen yoksayılır.

<trust-anchors>

söz dizimi:
<trust-anchors>
...
</trust-anchors>
Şunları içerebilir:
<certificates> sayısı kadar
description:
Güvenli bağlantılar için güven ankrajları grubu.

<certificates>

söz dizimi:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
description:
trust-anchors öğeleri için X.509 sertifika grubu.
özellikleri:
src
CA sertifikalarının kaynağı. Her sertifika aşağıdakilerden biri olabilir:
  • X.509 sertifikaları içeren bir dosyayı işaret eden ham kaynak kimliği. Sertifikalar DER veya PEM biçiminde kodlanmalıdır. PEM sertifikaları söz konusu olduğunda, dosya yorumlar gibi PEM dışı ek veriler içermemelidir.
  • Önceden yüklenmiş sistem CA sertifikaları için "system"
  • Kullanıcı tarafından eklenen CA sertifikaları için "user"
overridePins

Bu kaynaktaki CA'ların sertifika sabitlemeyi atlayıp atlamayacağını belirtir. "true" ise bu kaynaktaki CA'lardan biri tarafından imzalanan sertifika zincirlerinde sabitleme yapılmaz. Bu, CA'larda hata ayıklama veya uygulamanızın güvenli trafiğinde ortadaki adam saldırılarını test etme için yararlı olabilir.

debug-overrides öğesinde belirtilmediği sürece varsayılan değer "false"'tir. Aksi takdirde varsayılan değer "true"'dir.

<pin-set>

söz dizimi:
<pin-set expiration="date">
...
</pin-set>
Şunları içerebilir:
<pin> sayısı kadar
description:
Ortak anahtar pimleri. Güvenli bir bağlantının güvenilir olması için güven zincirindeki ortak anahtarlardan biri iğne grubunda olmalıdır. Sabitlemelerin biçimi için <pin> bölümüne bakın.
özellikleri:
expiration
Sabitlemelerin süresinin dolacağını ve sabitlemenin devre dışı kalacağını belirten, yyyy-MM-dd biçimindeki tarih. Özellik ayarlanmamışsa PIN'lerin süresi dolmaz.

Süre sonu, kullanıcının uygulama güncellemelerini devre dışı bırakması gibi durumlarda, PIN ayarlarında güncelleme almayan uygulamalarda bağlantı sorunlarının önlenmesine yardımcı olur.

<pin>

söz dizimi:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
özellikleri:
digest
PIN'i oluşturmak için kullanılan özet algoritması. Şu anda yalnızca "SHA-256" desteklenmektedir.

Ek kaynaklar

Ağ Güvenliği Yapılandırması hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Codelab uygulamaları