Jak zabezpieczyć urządzenia przemysłowe #1 - iptables

10.08.2020 How to / Komunikacja przemysłowa, Cyberbezpieczeństwo przemysłowe
Dodatkowe zabezpieczenie urządzeń przemysłowych
Wizerunek autora
Piotr Gocłowski Były pracownik Elmark Automatyka S.A.
Producent: MOXA
  • Zakłady przemysłowe

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

https://www.moxa.com/en/

 

Skontaktuj się ze specjalistą Elmark

Masz pytania? Potrzebujesz porady? Zadzwoń lub napisz do nas!