MQTT – Moquitto w praktyce – kontrola dostępu

Do puki nasz broker znajduje się wewnątrz domowej sieci nie grozi nam, że ktoś nie odpowiedni może subskrybować, lub publikować coś w naszych tematach, ale kiedy serwer będzie dostępny na zewnątrz sieci to przydało by się jakieś zabezpieczenie. Nie było by dobrze gdyby ktoś nie uprawniony mógł by kontrolować światło w naszym domu, albo co gorsza go otworzyć. Na wypadek takich sytuacji broker Mosquitto posiada system zabezpieczeń, gdzie bez odpowiedniego loginu i hasła się z nim nie połączymy.

Krok 1: Konfiguracja serwera (plik mosquitto.conf)

Pierwszym etapem będzie zmiana konfiguracji brokera Mosquitto tak, aby nie pozwalał na połączenie anonimowym użytkownikom. W tym celu musimy zmodyfikować zawartość pliku mosquitto.conf . Jeden ze sposobów podaję poniżej:

sudo nano /etc/mosquitto/mosquitto.conf

a następnie dodać na końcu pliku linię:

allow_anonymous false
password_file /etc/mosquitto/password_m

Zapisujemy plik (ctrl + o) i zamykamy edytor (ctrl + x).
Pierwsza linia zabrania łączenia się z anonimowymi użytkownikami, a druga określa w jakim pliku będą się znajdować loginy i hasła użytkowników.

Krok 2: Utworzenie pliku danymi do logowania (plik mosquitto_m)

W poprzednim kroku określiliśmy gdzie znajduje się plik z danymi do logowana, teraz go stworzymy. Jego struktura jest bardzo prosta. Każda linia to informacje o osobnym użytkowniku, a dane zapisuje się w formacie login:hasło . Aby stworzyć plik wykonujemy polecenie:

sudo nano /etc/mosquitto/password_m

i wpisujemy do pliku linię z hasłem i loginem. W moim przypadku wygląda ona tak:

pawel:haslo

Zapisujemy plik (ctrl + o) i zamykamy edytor (ctrl + x).
Ponieważ broker Mosquitto akceptuje tylko zakodowane hasła, to musimy użyć specjalnie do tego celu przygotowanego programu mosquitto_passwd . Uruchamiamy go poleceniem:

sudo mosquitto_passwd -U /etc/mosquitto/password_m

możemy podejrzeć nasze zakodowane hasło przy pomocy polecenia:

cat /etc/mosquitto/password_m

Będzie miał on formę:

pawel:$6$QGf6jML4Nzv+rfrN$u3q/Nz7NhsM1uDA6EmsR9ETDVZO3Bh7I8KC4Iu7pQ5fRrEyYFGZrrguNHWxgRW5CcULlOYJX2l9NLzD4cTHArQ==

Szyfrowanie hasła jest bardzo przydatne, teraz kiedy ktoś będzie miał dostęp do naszego komputera i podejrzy plik password_m to niczego poza loginem nie pozna, ponieważ niezaszyfrowana forma hasła jest tylko w naszej pamięci biologicznej (mózgu).

Krok 3: Reset brokera

Na koniec musimy zrestartować broker, aby podczas uruchamiania załadował nowe ustawienia. Służy do tego polecenie:

/etc/init.d/mosquitto restart

Testy działania

Do tak przygotowanego brokera już żaden anonimowy użytkownik się nie podłączy. Teraz za każdym razem gdy wywołujemy polecenia mosquitto_sub i mosquitto_pub to musimy podawać nasze dane do logowania. Służą do tego argumenty -u login, oraz -P hasło.
Dla przykładu otwórzmy dwa okna terminala. W pierwszym wywołajmy polecenie:

mosquitto_sub -u pawel -P haslo -t myTopic

a w drugim:

mosquitto_pub -u pawel -P haslo -t myTopic -m "message"

Poniższy zrzut z ekranu przedstawia działanie:

Teraz dla sprawdzenia ustawionej przez nas zapory spróbujemy opublikować wiadomość jako użytkownik anonimowy, bez podawania jakichkolwiek danych:

mosquitto_pub -t myTopic -m "message"

W efekcie dostaniemy informacje, że nasze połączenie nie jest autoryzowane i zostało odrzucone:

Logi serwera

Warto też zajrzeć do logów generowanych przez serwer Mosquitto. Można tego dokonać wywołując polecenie:

cat /var/log/mosquitto/mosquitto.log

po jego wykonaniu zobaczymy listę akcji które działy się na serwerze. Ciekawa może być linia:

1532967289: Socket error on client <unknown>, disconnecting.

Dzięki temu wiemy, że ktoś anonimowy próbował się zalogować ale odbił się od naszego muru obronnego.

Podsumowanie

Po wykonaniu takiego zabezpieczenia będziemy mogli spokojnie udostępnić nasz broker dla sieci zewnętrznej bez obaw, że ktoś będzie mógł się nam włamać do domowego systemu sterowania. Bez odpowiednich danych niczego nie dokona.

Skomentuj jako pierwszy w "MQTT – Moquitto w praktyce – kontrola dostępu"

Skomentuj

Twój adres e-mail nie będzie publikowany.


*


Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.