MQTT (Message Queuing Telemetry Transport)
İnternette yaygın olarak kullanılan makinalar arası (M2M) mesaj tabanlı bir protokoldür. Lightweight oluşu ve düşük kaynak tüketmesiyle Internet of Things(IoT) ekosisteminde benimsenmiştir. Birçok IoT bulut platformu akıllı nesnelerden veri gönderip almak için MQTT protokolünü desteklemektedir. Güvenlik olarak SSL / TLS desteklemektedir. Broker üzerinden haberleşme temeline dayanmaktadır.
MQTT asenkron protokoldür, bu da mesajı beklerken clientı engellemediği anlamına gelir. Mesaj yayıncıları ve mesaj alıcılar arasında eşzamansız olarak veri taşınmaktadır. MQTT protokolünün bir başka özelliği, istemcinin (abone) ve yayıncının aynı anda bağlı olmasını gerektirmemesidir. Örnek olarak; MQTT protokolü, zaman zaman bant genişliği kısıtlamaları veya güvenilir olmayan bağlantılar nedeniyle farklı düzeylerde gecikme yaşayan kablosuz ağlar için iyi bir seçimdir. Abone olan bir müşteriden bir aracıya olan bağlantı koparsa, aracı iletileri yeniden arabelleğe alır ve tekrar çevrimiçi olduğunda aboneye gönderir. Yayıncı istemciden aracıya olan bağlantının haber verilmeden kesilmesi durumunda, aracı bağlantıyı kapatabilir ve abonelere yayıncının talimatlarını içeren önbelleğe alınmış bir mesaj gönderebilir.
MQTT brokerın asıl görevi, clientlara (abonelere) mesajlar göndermektir. Yani yayıncıdan mesajlar alır ve bu mesajları abonelere gönderir. Böylece haberleşme trafiğini kontrol eden bir yönetici pozisyonundadır. Mesaj gönderirken, MQTT broker mesajı alacak olan clientları filtrelemek için konuyu(topic) kullanır. Konu bir dizedir ve konu seviyeleri yaratan konuları birleştirmek mümkündür.

Yukarıdaki görselde sıcaklık verileri (PUBLISH) haberleşme trafiğini kontrol eden yöneticiye (BROKER) gönderilir. BROKER bu verileri abone (SUBSCRIBE) online olduğu anda iletir.
Ubuntu üzerinde MQTT Mosquitto Broker kullanrak ilk denemeleri yapabilirsiniz. Özellikle IoT uygulamalarında sıkça kullanılır.
İnternet üzerindeki çeşitli BROKER‘lara belli konularda abone olabilirsiniz. Örnek olarak Akıllı Telefonunuzdan Uygulama Mağazasına girerek MQTT Client ‘ı indirip yaşadığınız bölgedeki hava durumu için MQTT Broker ‘a abone olabilirsiniz.
Konu dizeleri, özel bir sınırlayıcı karakter olan eğik çizgi (/) kullanılarak doğal bir konu ağacı oluşturur. Bir client, özel joker karakterleri kullanarak konu ağacındaki tüm dallara abone olabilir ve abonelikten çıkabilir. İki joker karakter vardır: tek seviyeli bir joker karakter, artı karakteri (+); ve çok düzeyli bir joker karakter, karma karakter (#). Dolar karakteri ($) olan özel bir konu karakteri, bir konuyu herhangi bir kök joker karakter aboneliğinden hariç tutar. Tipik olarak $, sunucuya özgü veya sistem mesajlarını taşımak için kullanılır.
MQTT QoS Nedir?
QoS, bir mesajın göndereni ile mesajın alıcısı arasındaki bir anlaşmayı ifade eder. QoS, belirli bir mesaja atıfta bulunarak teslimat garantisini tanımlayacaktır. QoS, MQTT’de temel bir özellik olarak hareket ederek istemciye üç hizmet seviyesi arasında seçim yapma olanağı sağlar.
Üç farklı QoS seviyesi, içeriğin MQTT protokolü tarafından nasıl yönetildiğini belirler. Daha yüksek QoS seviyeleri daha güvenilir olmasına rağmen, daha fazla gecikme ve bant genişliği gereksinimine sahiptirler, bu nedenle abone olan istemciler almak istedikleri en yüksek QoS seviyesini belirleyebilirler.
FTP (File Transfer Protocol)
Türkçe karşılığı Dosya Transfer Protokolü’dür. İnternete bağlı iki bilgisayar arasında dosya transferini sağlayan bir protokol ve bu işleme hizmet eden uygulamaya verilen isimdir. Örneğin bir web sitende yer alması istenen dosyalar sunuculara FTP üzerinden aktarılabilir. FTP ilk geliştirilen internet protokollerinden biridir. Bir başka bilgisayardan bir başka bilgisayara dosya aktarımı yapılırken, o bilgisayar ile etkileşimi aynı anda bağlantı kurulur. Protokol ile sağlanan bir dizi komutlar yardımıyla iki bilgisayar arasında dosya alma/gönderme işlemleri yapılır.
Bu listede bulunanlara ihtiyaç duyar:
- Bağlanacağımız bilgisayarın internet adresi,
- Bağlanacağımız bilgisayarda dosyalara ulaşmak istediğimiz hesapla ilgili kullanıcı numarası, varsa şifresi,
- İnternet erişimi olan, üzerinde FTP yazılımı bulunan bilgisayar
- Bağlanacağımız bilgisayarda, FTP protokol komutlarını yorumlayacak çalışır durumda bir FTP servis programı yani FTP sitesi gereklidir.

Genel kullanımı ftp <ftp yapılacak makinanın adresi> şeklindedir. Bundan sonra, ilgili bilgisayara bağlanıldığında, kullanıcı numarası ve parola sorulur. Daha sonra da, o kullanıcının makinasına bağlanmış olunur. Bu şekilde, etkileşimli bir ortamda, bazı komutlar verilerek iki makina arasında dosya işlemleri, ayrıca bağlanılan makinada bazı temel dosya/disk işlemleri yapılabilir.
Linux teminalde dizininde hareket etmek için kullanılan (cd, pwd, dir, ls vs) komutları zaten biliyorsunuzdur.
get: Dosya alma komutudur. Kullanımı; get <dosya – adı>(<alındıktan sonraki adı>)
alındıktan sonraki adı aynıda kalabilir.
mget: Birden fazla dosya alma komutudur. Örn: mget *.zip mget a*.*
put: Dosya gönderme komutudur. Kullanımı; put<dosya- adı> (<göndereceğimiz-yerdeki- adı>
mput: Birden çok dosyayı gönderme komutudur.
ascii: Dosya aktarımlarında aktarım modu olarak ASCII kullanılacağını belirtir.
binary: Dosya aktarımlarında Binary modun kullanılacağını belirtmek için kullanılır. Yani:
- arşiv dosyaları (zip,arj,z,zoo v.b gibi),
- çalıştırılabilir programlar(. exe,com gibi),
- resim formatlı programlar, (gif,jpeg,wb gibi),
FTP ile alınmadan/yada gönderilmeden önce bu komut kullanılır.
delete: FTP yapılan bir yerde istenilen dosyayı silme komutudur. Kullanımı; delete<dosya – adı > şeklindedir.
İki bilgisayar arasında dosya paylaşımı ya da oluşturulan web sitesi içeriğini, web sitenize yükleyebilmek için bazı programlar mevcuttur. Bu işlemler için tercih edilen en popüler FTP programı ise FilleZilla’dır.
Filezilla: Hemen hemen bütün işletim sistemleri ile uyumlu bir şekilde çalışan bu uygulama açık kaynak kodlu bir uygulama. Buna ek olarak ücretsiz kullanım imkanı da var. Filezilla ilk FTP uygulamalarından bir tanesi olması dolayısıyla uzun zamandır kullanılan ve sürekli gelişen bir yazılım oluyor. Uygulamaya, Filezilla’ya ait internet sitesi üzerinden hiçbir bedel ödemeden sahip olabilirsiniz.
MQTT ve ROS
ROS ve MQTT arasında çift yönlü köprü oluşturmak için mqtt_bridge paketini kullanabilirsiniz. mqtt_bridge, ROS mesajını kullanır.

Ek Bilgiler
Mosquitto (open source) açık kaynak MQTT Broker yazılımıdır. Paho mqtt Python programlama dili için Mosquitto tarafından oluşturulmuş kütüphanedir.
OWASP Top Ten güvenlik konusunda bir otoritedir. IOT konusunda yayınladığı zaafiyetler vardır.
IOT fiziksel nesnelerin oluşturduğu bir ağdır.
MQTT ve CoAP “ip” temelli haberleşir. Ayrıca Avrupa’da M2M operatörleri çıkmıştır.
Kendi sunucunuzu alarak web servislerini yazarak IOT sisteminizi oluşturabilirsiniz. Ayrıca Microsoft Azure, amazon Web Services, Google Cloud Platform gibi alternatifler mevcuttur.

Yeni Zorluklar
- Cihaz-Kullanıcı eşleştirmeleri : Cihaz sadece sahibi ile haberleşmeli
- Cihaz yetkilendirme, doğrulama
- Cihaz Güvenliği : Port vs. arayüzlerden erişim kısıtlanmalı
- Cihaz-Bulut Haberleşme Güvenliği
- Cihaz Yazılım Güncelleme : Uzaktan güncellemeye imkan tanımalı ve güncellemenin kendisine ait olduğunu teyit etmeli


MQTT Güvenliği
TLS 1.2 ve 1.3 şu anda güvenli kabul ediliyor. Transport Layer Security kısaltmasıdır ve aynı SSL’de olduğu gibi veri gizliliği sağlar. TLS/DTLS en son versiyona sahip olmalıdır. Burada yapılması gerekenler:
- Sunucu için Trusted CA SSL Sertifika
- SSL sertifikayı doğrulayacak olan Root(Kök) Sertifika IoT cihaza implement edilmesi
- Trust manager implement edilmesi

Türkçesi “Güvenli Giriş Katmanı” olan SSL, Netscape tarafından geliştirilmiş bir güvenlik protokolüdür. Alıcı ve verici arasında bilgi transferi yaparken gizliliğinizi korur. Gönderilen verilerin doğru IP adresinde deşifre edilmesini sağlayan kriptolama protokolü, güvenli bir şekilde haberleşmenize yardımcı olur. Bir anahtar ve istemciye sahip olan SSL’ler, sertifika sistemiyle çalışır.
Private key ve public key olarak isimlendirilen anahtarlar ile kodlanan sertifikaları sitenize doğru bir şekilde eklemeniz gerekir. Düzgün yüklenmeyen sistemler, “err_ssl_protocol_error” ve “err_ssl_version_or_cipher_mismatch” gibi birçok SSL hatası ile karşılaşmanıza neden olabilir. Kredi kartı numaraları gibi kişisel bilgilerinizi koruyabilme imkânı sunan güvenlik protokolü, iletilen verilerin tarih ve zamanını da teyit eder.
SSL sertifikası kurulduktan sonra private key web sitenizin sunucusunda kalır, public key ise bağlantı kurulan kişilere gönderilir. Ziyaretçiler sitenize girdiği zaman public key’i kullanır ve veriyi güvenli bir şekilde karşı tarafa gönderir. Alıcı taraf şifreyi çözmek için private key’i kullanır ve bilginin doğru yere ulaştığını teyit eder.
Brokerların SSL / TLS istemci tarafı sertifikalarıyla istemci kimlik doğrulamasını desteklemesi geleneksel hale gelmiştir. MQTT protokolü, kısıtlı kaynak ve IoT cihazları için bir protokol olmayı amaçladığından, SSL / TLS her zaman iyi bir seçenek olmayabilir ve bazı durumlarda istenmeyebilir. Bu tür durumlarda, kimlik doğrulama, istemci tarafından sunucuya gönderilen CONNECT / CONNACK paket dizisinin bir parçası olarak açık metin kullanıcı adı ve şifre olarak sunulur. Ayrıca bazı brokerler, özellikle internette yayınlanan açık brokerler anonim aygıtları kabul etmektedir. Bu gibi durumlarda, kullanıcı adı ve şifre boş bırakılmalıdır.
MQTT Client’in Doğrulanması sürecinde öne çıkan başlıklar :
- Username/Pasword
- SSL Client Sertifikası
- Mutual Authentication

Ayrıca Authentication server kullanmak iyi bir alternatif olabilir. Burada token login bilgilerinin imzalanması sonucu oluşan bir yapıdır. Token süreli olabilir. Örneğin 1 saat, 1 yıl vs. süreye sahip olabilir. Kullanıcının yapmak istediği işlemler hep bir servise bağlıdır. Örneğin, cep telefonunuzdaki bir uygulamayı kullandığınızda, uygulama internete bağlanır ve verileri bir sunucuya gönderir. Ardından sunucu bu verileri alır, yorumlar, gerekli eylemleri gerçekleştirir ve telefonunuza geri gönderir. Sonrasında uygulama bu verileri yorumlar ve istediğiniz bilgiyi okunabilir bir şekilde size sunar. İşte API budur. Bunların hepsi API aracılığıyla olur. Send Comment API komutları broker’a iletir.
API servislerini test etmek için Postman(Linux) uygulamasını kullanabiliriz.
Genel bir Iot mimarisi aşağıda gösterilmektedir.

Yazılım Güncelleme Güvenliği
Hash bir bilginin gölgesi demektir. “Secure Hash Algorithm” olan SHA, NSA tarafından geliştirilen bir kriptografik özetleme fonksiyonudur. Verileri belli bir boyuta sığdıran ve şifreleyen matematiksel değişkenlerden oluşur. Bu algoritmada kriptolanan bilgiler daha sonra tekrardan çözümlenebilir, orijinal haline getirilebilir. Pek çok veriyi güvenli bir şekilde karşı tarafa ulaştırabilmenizi sağlar.
SHA-0, 1, 2 ve 3 olarak dörde ayrılan Secure Hashing Algoritması, farklı kriptolama fonksiyonlarına sahiptir. Belirli güvenlik açıkları dikkate alınarak geliştirilen algoritmalar, birçok alanda kullanılır. SHA 256, 384, 512 gibi çeşitli bit uzunluklarına sahip olan protokoller, özellikle e-imza ve POS cihazı gibi bankacılık uygulamalarında tercih edilir.
SHA yazılım ile kodlanan bilgiler, anlamsız karakterler kümesi halinde görünür. Bu algoritmalarla şifrelenen veriler, aynı altyapıya sahip olan decoder aracılığıyla çözülür. Örneğin Secure Hashing Algoritması 256 ile kodlanan bir veri, o protokol için geliştirilen SHA 256 decoder ile birlikte eski haline getirilebilir. Ayrıca online ortamda bulunan çözücüleri kullanarak da şifreli bilgilerinizi çözebilirsiniz.
Bu protokoller tek yönlü bir yapıya sahiptir. Şifrelenen bilgiden, asıl veri elde edilemez. Kod üzerinde herhangi oynama yapıldığı zaman çıktıda büyük değişikliğe sebep olur. Bu algoritmalarda kriptolama bloğu ne kadar uzunsa o kadar güvenilirdir.
Kaynaklar:
- BTK Akademi IOT Eğitimi
- http://www.hostinger.web.tr
- http://www.vargonen.com
- https://mqtt.org/
- https://www.isnet.net.tr
- http://www.steves-internet-guide.com/mqtt/

