Bagaimana saya bisa menggunakan 2FA dalam jaringan MQTT?

12

Bagaimana saya bisa menggunakan 2FA (otentikasi dua faktor) ketika saya menghubungkan perangkat baru ke broker, jika itu mungkin?

Karena tampaknya lebih mudah, faktor kedua dapat menjadi solusi perangkat lunak pertama tetapi saya akan menyambut ide tentang cara memperkenalkan token keras (mungkin RFID).

Masuk akal jika perangkat hanya mengotentikasi pada koneksi pertama dan server akan mengingat klien "lama".

Idenya mungkin tidak biasa atau tidak cocok - jika itu adalah ide yang buruk, tolong beri saya alasannya.

Bence Kaulics
sumber
Bisakah Anda memberi tahu kami bagaimana menurut Anda suatu perangkat dapat melakukan 2FA karena itu adalah satu perangkat?
Goufalite
@Goufalite Misalnya ketika saya memasang perangkat baru, saya harus memberikan kunci secara manual (dengan tag RFID misalnya) yang akan digunakan selama otentikasi. Sedangkan untuk perangkat lunak 2FA, saya tidak tahu apakah suatu layanan dapat diatur di rumah saya dari mana perangkat baru dapat meminta token lunak, sesuatu seperti server kunci pribadi.
Bence Kaulics

Jawaban:

8

Anda memerlukan proxy broker, atau server web ...

Pertama-tama, Anda benar - benar membutuhkan layanan otentikasi di suatu tempat yang terhubung ke broker Anda untuk melakukan 2FA menggunakan topik tertentu ( /auth/RFID, ...). Itu kemudian akan memungkinkan klien untuk mempublikasikan informasi (lihat di bawah).

Masalah pertama yang dapat saya lihat di sini adalah bahwa siapa pun yang berlangganan topik ini dapat membaca informasi dari topik itu, tetapi Anda dapat mengunci topik !

Anda kemudian dapat memberi tahu (memaksa) semua perangkat Anda untuk mempublikasikan informasi /proxy/mytopic. Dengan fitur clientId dari mqtt, layanan auth dapat memeriksa apakah pesan yang dikirim dari topik ini berasal dari perangkat yang diautentikasi yang menggunakan 2FA sebelumnya, dan kemudian menerbitkan pesannya sendiri atas nama perangkat untuk /proxyout/mytopicdengan id perangkat di payload.

Masalahnya sekarang adalah memeriksa perangkat yang dapat menerima pesan jika mereka dikonfirmasi, karena, yah, MQTT adalah semua tentang publikasi massal. Layanan auth perlu memiliki daftar perangkat yang diautentikasi dan memeriksa apakah mereka memenuhi syarat untuk penerimaan. Sekali lagi, enkripsi muatan dan dekripsi sisi perangkat ...

Saya pikir solusi saya sangat berlebihan kemampuan MQTT. Karena itu Anda harus menggunakan soket atau server web ...

Goufalite
sumber
@ tim3in maaf atas keterlambatan respons. Bagaimanapun ini adalah jawaban yang diberikan 2,5 tahun yang lalu ... mungkin banyak hal telah berubah dan ini hanyalah proposal arsitektur umum. Apakah Anda melakukan POC dengan solusi Anda?
Goufalite
Saya sudah merencanakannya. Apakah Anda dapat memeriksanya?
tim3in
7

Spesifikasi MQTT v5 mendatang menambahkan dukungan untuk AUTHpaket kontrol, yang memungkinkan otentikasi tantangan / respons. Karena MQTT v5 dukungan yang belum selesai mungkin masih berubah, tetapi tampaknya masuk akal untuk menganggap bahwa AUTH akan tetap dalam beberapa bentuk atau lainnya dan bahwa 2FA dapat ditambahkan dengan menggunakannya.

Anda dapat melihat draft kerja spec saat ini di halaman dokumen komite OASIS MQTT .

ralight
sumber
5

Sesuai spesifikasi, pesan hubungkan opsional dapat memberikan nama pengguna dan kata sandi. Ini divalidasi terhadap ACL yang disimpan di suatu tempat di broker. Jadi, itu adalah faktor otentikasi pertama yang bisa Anda manfaatkan. Pesan CONNACK dari broker akan merespons jika otentikasi melewati.

Untuk menerapkan faktor kedua jika otentikasi, cara terbaik adalah mengirim pesan koneksi kustom dengan faktor lain. Pesan CONNACK dalam kasus ini harus merujuk pada keberhasilan atau kegagalan faktor otentikasi kedua. Oleh karena itu, broker dan klien harus mengimplementasikan pesan khusus melebihi dan di atas spesifikasinya.

cogitoergosum
sumber
4

Untuk mencapai 2FA di jaringan MQTT, saya telah membuat layanan berikut untuk otentikasi yang terhubung ke Broker.

  1. Verifikasi ID
  2. Generator Token
  3. Token Verifier

Ketika klien MQTT terhubung ke broker melalui SSL / TLS, ia pertama kali menerbitkan ID-nya sendiri untuk topik device_id , ID Verifier memverifikasi bahwa itu adalah klien otentik dan kemudian Token Generator dipanggil yang menghasilkan token dan menerbitkan token pada topik yang dikunci device_token .

Perangkat klien mendapatkan token ini dan selanjutnya menerbitkannya ke topik yang diverifikasi_token . Segera setelah topik dipublikasikan pada memverifikasi_token , verifikasi token membandingkan nilai pada topik device_token dan verifikasi_token jika cocok, tambahkan id perangkat ke kumpulan perangkat yang diverifikasi dan biarkan perangkat menerbitkan data. Ini meningkatkan keamanan karena satu-satunya perangkat yang diverifikasi terhubung ke topik untuk menerbitkan data.

Saya juga telah menggunakan opsi konfigurasi MQTT_KEEPALIVE untuk menjaga klien tetap aktif ketika tidak ada data yang dikirim atau diterima untuk menjaga perangkat klien tetap hidup di kumpulan perangkat dan mencegahnya diverifikasi lagi setelah ditambahkan ke kumpulan perangkat. namun untuk tujuan keamanan saya membekukan perangkat ke 2FA setiap 24 jam.

tim3in
sumber
3
Bagaimana cara diamankan bahwa hanya klien yang benar yang mendapatkan token?
Helmar
@Helmar menggunakan unik ClientID dan topik yang terpisah untuk menyimpan tanda untuk setiap klien yang telah ditetapkan pada saat pendaftaran perangkat. Klien sebenarnya berlangganan topik ini. Ketika menerbitkan token untuk diperiksa, ia menambahkan id dengan data token sehingga verifier tahu bahwa klien mana yang telah menerbitkan token ini. clientid dapat dilindungi menggunakan Elemen Aman di sisi perangkat setelah mendaftarkan id yang sama di server dalam database.
tim3in
@Helmar tolong tambahkan komentar Anda pada ini? Saya akan menghargai pandangan semua orang tentang solusi saya.
tim3in
2
ya, tapi apa yang menghentikan saya berlangganan '#' untuk melihat semua tanggapan token
hardillb
@hardillb topik yang memiliki respons token dikunci seperti yang disebutkan Goufalite. Jadi hanya perangkat yang dilindungi yang dapat melihat. Pada tahap registrasi, perangkat terikat ke topik tertentu dan setiap perangkat telah menetapkan topik terpisah untuk respons token.
tim3in