Mogłoby się wydawać że wdrażanie dodatkowych zabezpieczeń sieciowych wewnątrz sieci za firewallem, nie ma już dużego sensu, przecież sieć jest chroniona, a hosty zaufane. Nic bardziej mylnego. Dobrze zabezpieczona sieć, a tym bardziej przemysłowa, powinna być budowana zgodnie z ideą „defense in depth”, czyli ochrony w głąb. Dlaczego? Ponieważ nigdy nie ma 100% pewności że do naszej sieci nie ma dostępu ktoś niepowołany.
Poziom zabezpieczeń może też ulec degradacji za czasem. Przykładem są luki typu 0-day w firmware (oprogramowanie układowe) są trudne do szybkiego załatania we wszystkich urządzeniach jeśli nie został w nich zaimplementowany mechanizm autoupdate, ponieważ wymagają aby operatorzy dotkniętych urządzeń śledzili na bieżąco ich producentów i byli w stanie szybko uaktualnić oprogramowanie. Przeszłość uczy, że duża ilość incydentów była możliwa dzięki lukom w oprogramowaniu lub protokołach. Np. ransomeware Wannacry korzystał z luki w protokole Microsoft Server Message Block SMB 1.0, pozwalającej na zdalne wykonanie kodu na komputerze ofiary.
Jak w takim razie budować maksymalnie bezpieczne sieci przemysłowe? Przede wszystkim należy edukować się w tematyce cyber bezpieczeństwa, zapoznać ze standardami, obecnie rekomendowanym dla systemów przemysłowych jest IEC 62443. Warto też wdrażać wspomnianą ideę „defense in depth”, czyli stosować kilka poziomów zabezpieczeń, nawet wewnątrz sieci, podobnie jak niegdyś przy budowie fortyfikacji i twierdz.
We wpisie tym przedstawię konfiguracje narzędzia iptables na komputerze UC-2112. W drugiej części opiszę jak zbudować podobną ochronę na routerze i IDS/IPS (Intrusion Detection System / Intrusion Prevention System).
Zabezpieczenie sterownika PLC za pomocą komputera przemysłowego z Linuksem (iptables)
Adresacja IP
W tym akapicie opiszę w jaki sposób można dodać dodatkowy stopień zabezpieczenia do sterownika PLC/HMI za pomocą małego komputera przemysłowego z narzędziem iptables. Aby to zaprezentować użyję komputera UC-2112 i sterownika PLC Unistream US7-B5-R38. Na początek należy zaplanować jaka będzie adresacja IP sterownika i komputera. Poniżej grafika:
Następnie należy zalogować się do UC-2112 przez SSH za pomocą Putty:
Powinniśmy zobaczyć logo producenta, teraz wystarczy wpisać sudo -s oraz wpisać domyślne hasło aby zdobyć prawa roota.
moxa@Moxa:~$ sudo -s [sudo] password for moxa: root@Moxa:/home/moxa#
Na początek należy dostosować adres IP interfejsów, tak aby jeden z nich mógł komunikować się z siecią zakładową a drugi z zabezpieczanym urządzeniem. Wystarczy edytować plik /etc/network/interfaces, np. za pomocą wbudowanego edytora nano:
root@Moxa:/home/moxa# nano /etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto eth0 eth1 lo iface lo inet loopback iface eth0 inet static address 192.168.3.221 network 192.168.3.0 netmask 255.255.255.0 broadcast 192.168.3.255 gateway 192.168.3.1 iface eth1 inet static address 192.168.127.10 network 192.168.127.0 netmask 255.255.255.0 broadcast 192.168.127.255
Aby zapisać wystarczy użyć kombinacji Ctrl + X. Aby załadować nowe ustawienia sieciowe należy wpisać:
service networking restart
Czasami wymagany jest też restart systemu aby nowy adres był poprawnie przypisany. Wystarczy wpisać polecenie reboot.
Następnie za pomocą komendy ip a sprawdzamy czy adresacja jest zgodna z naszym planem:
root@Moxa:/home/moxa# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:90:e8:XX:YY:ZZ brd ff:ff:ff:ff:ff:ff inet 192.168.3.221/24 brd 192.168.3.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::290:e8ff:fe6d:522b/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:90:e8:XX:YY:ZZ brd ff:ff:ff:ff:ff:ff inet 192.168.127.10/24 brd 192.168.127.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::290:e8ff:fe6d:522c/64 scope link valid_lft forever preferred_lft forever
Konfiguracja IPtables - przekierowanie portów
Aby w ogóle zacząć pracę z IPtables warto powiedzieć 2 słowa czym ono jest. To zaawansowane narzędzie do filtrowania i manipulacji pakietami na podstawie wielu parametrów, takich jak adres IP, adres MAC porty TCP/UDP i wiele innych. Ma więc funkcje typowe dla firewall, ale również posiada możliwości zaawansowanego routera.
Na początek należy zacząć od sprawdzenia czy są przekazywane pakiety pomiędzy interfejsami Eth0 i Eth1 UC-2112. Można to sprawdzić za pomocą poniższej komendy:
root@Moxa:/home/moxa# cat /proc/sys/net/ipv4/ip_forward 0 #Aby włączyć przekazywanie pakietów IPv4 wystarczy wpisać: root@Moxa:/home/moxa# echo 1 > /proc/sys/net/ipv4/ip_forward
Po każdym uruchomieniu zmienna ta wraca do domyślnej wartości dlatego można to łatwo zautomatyzować prostym skryptem uruchamianym na starcie, ale o tym później. Aby sprawdzić czy aktualnie mamy aktywne jakieś reguły iptables wystarczy wpisać:
root@Moxa:/home/moxa# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
Jak widać na razie jest tu pusto, co za chwile się zmieni.
Nasz sterownik wspiera protokół Modbus TCP jako slave, a także ma wbudowany serwer VNC, umożliwiający zobaczenie tego co się aktualnie na nim wyświetla. Porty TCP na których one pracują to odpowiednio 502 i 5900. Należy dodać 3 reguły iptables aby umożliwić połączenie do sterownika przez komputer UC-2100 „przeźroczyście”, więc:
iptables -t nat -I PREROUTING -p tcp --dport 502 -j DNAT --to-destination 192.168.127.100:502 iptables -t nat -I PREROUTING -p tcp --dport 5900 -j DNAT --to-destination 192.168.127.100:5900 iptables -t nat -A POSTROUTING -o eth1 -d 192.168.127.100 -j SNAT --to-source 192.168.127.10
Pierwsza reguła to przekierowanie portu 502 (Modbus TCP) sterownika, na port 502 UC-2112, czyli jest to popularny na routerach konsumenckich „Port Forwarding”. Druga reguła ma takie same znaczenie z tym że jest dla portu 5900, czyli VNC. Po wpisaniu tych reguł są już one od razu aktywne, co można łatwo sprawdzić łącząc się na tych portach do UC-2112 od strony „sieci zakładowej”, czyli na interfejsie Eth0, poniżej zrzuty ekranu:
Jak widać na powyższym zrzucie ekranu udało się nawiązać połączenie z poziomu komputera PC za pomocą protokołu Modbus TCP.
Konfiguracja IPtables - filtrowanie MAC
I teraz dochodzimy do sedna, czyli do reguł filtrujących ruch do sterownika. Obecnie każde urządzenie w sieci zakładowej jest w stanie połączyć się z tym sterownikiem na tych portach, ale wystarczy dodać kilka reguł aby umożliwić komunikację tylko wybranym hostom:
iptables -A FORWARD -i eth0 -m mac --mac-source XX:XX:XX:XX:6F:E2 -j ACCEPT iptables -A FORWARD -i eth0 -j DROP
Pierwsza reguła oznacza że dla pakietów przechodzących przez UC-2112 (FORWARD), akceptowany jest pakiet o adresie źródłowym XX:XX:XX:XX:6F:E2, który jest adresem MAC komputera PC. Druga reguła odrzuca wszystkie pakiety które przechodzą przez switcha. Reguły te są przetwarzane po kolei co w efekcie oznacza że cały ruch do sterownika jest odrzucany, chyba że jest to komputer PC o powyższym adresie MAC. Teraz wystarczy sprawdzić czy reguły rzeczywiście działają:
Wynik skanowania portów UC-2112 przez laptopa, którego adres MAC jest wykluczony w iptables
Sukces. Po wpisaniu powyższych reguł dostęp do sterownika poosiada tylko komputer o adresie z końcówką „:6F:E2”. Jednak nie jest to zbyt wygodne rozwiązanie, biorąc pod uwagę że trzeba po każdym uruchomieniu UC-2112 wpisywać od nowa wszystkie wymienione komendy, ponieważ iptables nie zapisuje reguł na dysku. Można łatwo to zautomatyzować za pomocą pliku /etc/rc.local, wystarczy wkleić do niego wszystkie użyte wcześniej reguły iptables:
#!/bin/bash #Przekierowanie portów echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -I PREROUTING -p tcp --dport 502 -j DNAT --to-destination 192.168.127.100:502 iptables -t nat -I PREROUTING -p tcp --dport 5900 -j DNAT --to-destination 192.168.127.100:5900 iptables -t nat -A POSTROUTING -o eth1 -d 192.168.127.100 -j SNAT --to-source 192.168.127.10 #Filtrowanie na bazie adresu MAC: iptables -A FORWARD -i eth0 -m mac --mac-source XX:XX:XX:XX:6F:E2 -j ACCEPT iptables -A FORWARD -i eth0 -j DROP exit 0
Aby sprawdzić czy te reguły rzeczywiście zostaną dopisane po restarcie wystarczy zrestartować komputer za pomocą reboot i sprawdzić czy reguły są aktywne za pomocą iptables -S.
Zawsze też rekomendujemy zmianę domyślnego hasła w każdym urządzeniu Moxy, poprawia to bezpieczeństwo. Na komputerze UC-2112 można to zrobić za pomocą komendy passwd:
root@Moxa:/home/moxa# passwd moxa Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@Moxa:/home/moxa#
Podsumowanie
Tym sposobem dotarliśmy do końca tego wpisu. Iptables to dość złożone narzędzie, ale pozwala na bardzo dużą kontrolę i manipulację pakietami. Opisywany wariant nie jest bardzo skomplikowanym, zawiera tylko 5 reguł, zyskuje się w ten sposób dodatkowy stopień ochrony. Jestem świadomy że adres MAC komputera można zmienić niemal tak samo łatwo jak adres IP, ale zawsze jest to dodatkowa poprzeczka do przeskoczenia.
Jeśli jednak sposób ten wydaje Ci się zbyt skomplikowany, firma Moxa ma też w ofercie routery i urządzenia IPD/IDS (Intrusion prevention System / Intrusion Detection System). W drugiej części tego wpisu opiszę konfigurację takiej aplikacji właśnie w oparciu o takie urządzenia. Do zobaczenia i zapraszam do śledzenia bloga!
Źródła:
https://pl.wikipedia.org/wiki/Iptables
Skontaktuj się ze specjalistą Elmark
Masz pytania? Potrzebujesz porady? Zadzwoń lub napisz do nas!