11.13. Eşleştirme ve bağlama

Buraya kadar anlatılan her şey baytları telsiz üzerinden açık bir şekilde taşır. Aynı odada BLE özellikli bir dizüstü bilgisayarı olan herkes, reklam (advertising) kanallarını dinleyebilir, açık bir bağlantının atlama (hopping) dizisini takip edebilir ve gerçekleşen her okuma, yazma ve bildirimi (notification) okuyabilir. Çoğu genel sensör verisi için (pil seviyesi, ortam sıcaklığı) bu sorun değildir. İki uç noktanın gizli tutmak istediği herhangi bir şey için – bir röleyi devreye sokan bir kontrol yazmacı, bir parola, geniş çapta yayınlanmaması gereken bir ölçüm – bağlantının şifrelenmesi gerekir ve ideal olarak kameranın kiminle konuştuğunu bilmesi gerekir.

BLE her ikisini de eşleştirme (pairing) ve bağlama (bonding) yoluyla sağlar.

11.13.1. Eşleştirme, bağlama, şifreleme

Birbiriyle yakından ilişkili üç kavram:

  • Şifreleme, nihai hedeftir. Bağlantı bir kez şifrelendiğinde, veri kanallarındaki her paket yalnızca iki uç nokta tarafından çözülebilir; bir dinleyici yalnızca gürültü görür.

  • Eşleştirme (pairing), iki uç noktanın şifrelemenin kullandığı anahtarlar üzerinde anlaşmak için çalıştırdığı prosedürdür. Bağlantı katmanının şifreleme motoruna beslediği paylaşılan anahtar materyalini üreten tek seferlik bir alışveriştir.

  • Bağlama (bonding), eşleştirme tamamlandıktan sonra anahtarları kalıcı belleğe kalıcı olarak kaydetme tercihidir; böylece aynı iki cihaz arasındaki bir sonraki bağlantı eşleştirmeyi atlar ve doğrudan şifrelemeye geçer.

Sade bir dille: eşleştirme “kendinizi tanıtın”dır; bağlama “bu tanışmayı hatırla”dır; şifreleme ise “bundan sonra gizlice konuş”tur.

"Central" ve "Peripheral" olarak etiketlenmiş iki sütun. Üst tarafa yakın, "BLE connection open (unencrypted)" olarak etiketlenmiş kesik bir çizgi. Altında üç ok: central'dan peripheral'a "pairing request", her iki yönde "key exchange", ileri yönde "pairing complete". Altında "link encrypted" olarak etiketlenmiş ikinci bir kesik çizgi. İki kalın çift yönlü ok "encrypted GATT traffic" taşır. Yanda, "bonding" olarak etiketlenmiş isteğe bağlı bir "store keys to flash" kutusu.

Açık bir BLE bağlantısının üzerine kurulan eşleştirme akışı. Anahtar alışverişi tamamlandığında, bağlantı katmanı sonraki her paketi şifreler. Bağlama, anahtarları flash belleğe yazmanın ek adımıdır.

11.13.2. LE Secure Connections

BLE tarafından kullanılan modern anahtar alışverişi, Elliptic Curve Diffie-Hellman üzerine kurulu LE Secure Connections‘dır. Her iki taraf da geçici bir anahtar çifti üretir, genel yarılarını değiştirir ve sonucu kendi özel anahtarlarıyla birleştirerek aynı paylaşılan gizli değere ulaşır – bir dinleyicinin, alışverişin tam bir kaydına sahip olsa bile hesaplayamayacağı bir gizli değer.

Daha eski LE Legacy yöntemi daha az güvenlidir (tam alışverişe sahip bir dinleyici genellikle anahtarı kurtarabilir) ve yalnızca eski çevre birimleriyle geriye dönük uyumluluk için vardır. aioble varsayılanı modern yöntemdir (le_secure=True); bunu koruyun.

11.13.3. Eşleştirmeyi başlatma

Bir central, zaten açık olan bir bağlantı üzerinde aioble.DeviceConnection.pair() çağırarak eşleşir:

async with await device.connect() as connection:
    await connection.pair(bond=True, le_secure=True, mitm=False)
    # ... GATT work, now over an encrypted link ...

pair döndükten sonra, bağlantıdaki encrypted, authenticated, bonded ve key_size öznitelikleri neyin müzakere edildiğini yansıtır.

En kullanışlı dört anahtar kelime argümanı:

  • bond=True – ortaya çıkan anahtarları flash belleğe kaydeder; böylece aynı iki cihaz arasındaki bir sonraki bağlantı eşleştirme el sıkışmasını atlar. Varsayılan True.

  • le_secure=True – LE Secure Connections kullanır. Varsayılan True. Açık bırakın.

  • mitm=Falseortadaki adam (man-in-the-middle) korumasının gerekli olup olmayacağı. Bunun için bant dışı bir kanal gerekir (bir tarafta görüntülenen ve diğer tarafta onaylanan sayısal bir kod, girilen bir parola anahtarı, …); böylece kullanıcı, eşleştirme el sıkışmasındaki iki cihazın gerçekten düşündükleri cihazlar olduğunu doğrulayabilir. Varsayılan olarak False‘tur (MITM koruması yok – pasif bir dinleyici bağlantıyı okuyamaz, ancak bağlantıları aktif olarak yönlendiren bir saldırgan kendini araya eşleştirebilir). Hassas her şey için True olarak ayarlayın, ancak bunun çevre biriminin gerçekten bir IO yeteneğini desteklemesini gerektirdiğinin farkında olun.

  • io=3 – cihazın iddia ettiği IO yeteneği. Bluetooth spesifikasyonu beş tane tanımlar: 0 yalnızca ekran, 1 ekran + evet/hayır, 2 yalnızca klavye, 3 giriş yok çıkış yok, 4 klavye + ekran. Arayüzü olmayan bir kamera tipik olarak 3 bildirir; kameranın kendisinde bir ekran varsa uygulama sayısal onayı görüntüleyip 1 kullanabilir. İki tarafın IO yeteneklerinin birleşimi, gerçek MITM korumasının elde edilebilir olup olmadığına karar verir.

Çevre birimleri pair çağrısını kendileri yapmaz – central’ın başlattığı şeye yanıt verirler. Belirli bir karakteristik için şifrelemenin gerekli olup olmaması, GATT veritabanında nasıl bildirildiğine ilişkin bir özelliktir; şifreleme gerektiren erişim bitleri düşük seviyeli bluetooth API’sinin bir parçasıdır ve şu anda aioble karakteristik yapıcısı üzerinden açığa çıkarılmaz.

11.13.4. Bağlama – ve anahtarların yaşadığı yer

bond=True olduğunda, aioble anahtarları yerel dosya sistemindeki bir JSON dosyasına yazar. Varsayılan dosya adı ble_secrets.json‘dur ve geçerli çalışma dizinine göreceli olarak yazılır. Yeni önyüklenmiş bir kamerada _boot.py zaten o dizini seçmiştir: bir kart takılıysa /sdcard, aksi takdirde /flash – böylece dosya /sdcard/ble_secrets.json veya /flash/ble_secrets.json konumuna gelir. Dosya, bağlı eşin bir sonraki yeniden bağlanışında bağlantıyı yeniden şifrelemek için gereken girdileri tutar; bunlar arasında eşin kimlik adresi de bulunur.

Akılda tutulması gereken bir asimetri: kaydetme anahtarlar değiştikçe otomatik olarak gerçekleşir, ancak bir sonraki önyüklemede dosyanın yüklenmesi gerçekleşmez. Daha önce bağlanmış eşlerin tanınması için başlangıçta (herhangi bir eşleştirme veya reklam işleminden önce) bir kez aioble.security.load_secrets() çağırın:

import aioble
aioble.security.load_secrets()        # default path: ble_secrets.json

Bundan sonra, bağlı bir eş bir sonraki kez göründüğünde, aioble saklanan anahtarları yeniden kullanır ve bağlantı, başka bir el sıkışma olmadan şifrelenmiş hale gelir.

Anahtarları flash bellekte saklamanın iki pratik sonucu:

  • Bir cihazı unutma. Tüm bağlı eşleri unutmak için ble_secrets.json dosyasını silin (veya ilgili girdiyi kaldırın), ardından sıfırdan yeniden eşleştirin.

  • Fiziksel erişim anahtarları sızdırır. Kameranın dosya sistemine erişimi olan herkes JSON’u okuyabilir. Bu, TLS anahtarlarıyla ağ tarafında ortaya çıkan kısıtlamanın aynı türüdür (İşlemler: anahtarlar, sona erme ve sorun giderme): cihaz başına anahtarlar kullanın, saklanan herhangi bir anahtarı kurtarılabilir olarak değerlendirin ve anahtarın gizli kalmasına değil, iptal etme yeteneğine (burada, central tarafında bağı kaldırma) güvenin.

11.13.5. Şifrelemenin garanti ettikleri – ve etmedikleri

Önce-eşleştir-sonra-şifrele bağlantısı, güç sırasına göre şunları verir:

  • Gizlilik. Her zaman. Bir dinleyici baytları okuyamaz.

  • Bütünlük. Her zaman. Değiştirilmiş paketler bağlantı katmanının kimlik doğrulamalı şifreleme kontrolünden geçemez ve düşürülür.

  • Kimlik doğrulama. Yalnızca mitm=True ve uygun bir IO ile. Bu olmadan, orijinal eşleştirme alışverişini ele geçiren bir ortadaki adam kendini araya yerleştirmiş olabilir; MITM koruması olmadan iki tarafın bunu bilmesinin hiçbir yolu yoktur.

Çoğu kamera kullanım senaryosu için – bir telefonun kamerayla bir kez eşleşip daha sonra tekrar bağlanması – mitm=False genellikle yeterlidir, çünkü orijinal eşleştirme kontrollü bir ortamda gerçekleşir (kullanıcı her iki cihazı da aynı odada tutar). Eşleşmiş bir cihazın kamerayla ilk kez uzun bir mesafeden veya güvenilmeyen bir aracı üzerinden karşılaşabileceği uygulamalar için MITM doğru ayardır.

11.13.6. Eşleştirmenin yanlış cevap olduğu durumlar

Eşleştirmenin gerçek bir maliyeti vardır: ilk bağlantıda birkaç saniyelik alışveriş, bağlanan her cihaz için kalıcı flash bellek kullanımı ve bir şeyler ters giderse “bağı unut” kurtarma senaryosu. Gerçekten genel veriler için – bir beacon olarak yayınlanan ortam sensörü okumaları, adını gösteren bir tabela, okunarak veya yazılarak dünyayı değiştirmeyen herhangi bir şey – doğru cevap hiç şifrelememek değiltir, yakındaki herhangi bir tarayıcının değerleri okumasına izin vermektir.

Diğer her şey için, central’da connection.pair(bond=True), bağlantıyı genel bir kanaldan özel bir kanala dönüştüren tek satırlık eklemedir.