loader
Foto

Virtuális PLC megvalósítása - IT és OT protokollok telepítése

Az ipari rendszereknél különböző PLC-kkel találkozunk. Különböző gyártók szinte összes PLC-je fellelhető az iparban, a gyártósorokon, az összeszerelő üzemekben, stb. Ugyanakkor a főbb kommunikációs protokollok ugyanazok, és persze a specifikus gyártói kommunikációs megoldások is megtalálhatók a hálózati forgalomban. Ha a hálózati forgalmat szeretnénk vizsgálni, ha az ipari kommunikációs megoldásokat szeretnénk megismerni, akkor azért felesleges PLC-ket vásárolni súlyos összegekért. Ebben a cikkben egy virtuális PLC-t készítünk el, amelyben a főbb kommunikációs protokollok megtalálhatók. Akár az IT, akár az OT protokollok.

Indítsuk el az Ubuntu Desktop virtuális gépet úgy, hogy legyen hálózati kapcsolata (pl.: NAT), mert különböző telepítéseket kell elvégezni a virtuális gépen. A cikkben az Ubuntu 22.04 Desktop verzió került felhasználásra. Ez a virtuális gép előállítható "iso" file-ból, de akár innen is letölthető.
Fontosnak tartjuk megjegyezni azt, hogy a "virtuális PLC" alatt azt értjük, hogy olyan kommunikációs megoldásokkal, protokollokkal látjuk el az Ubuntu Desktop virtuális gépünket, mintha egy PLC (pl.: Siemens S7-1200 1212) lenne.

Először a főbb IT protokollok kerülnek telepítésre. A távoli bejelentkezés miatt szükséges a "Telnet", illetve az "SSH" telepítése, illetve előfordulhat az, hogy log file-okat, firmware-eket kell fel-/letölteni, ezért szükséges még az FTP-t is installálni. Ma már az olcsóbb PLC-k is rendelkezhetnek webszerverrel, ezért egy webkiszolgáló használatát is lehetővé tesszük a virtuális PLC-n.
A telepítésnél használni fogjuk a "git"-et, ezért a telepítés ezzel kezdődik. Adjuk ki a következő utasítást.

sudo apt install git

A "git" telepítésének a folyamata a következő ábrán látható.

kep
1. ábra   A "git" telepítésének a folyamata
 

Ezután telepítsük az első IT protokollt, az FTP-t. Adjuk ki az FTP telepítéséhez a következő utasítást.

sudo apt install vsftpd

kep
2. ábra   Az FTP telepítésének a folyamata
 

Noha a "telnet" protokoll már erősen elavult, az ipari rendszerekben a mai napig még megtalálhatók. Ezért telepítsük a "telnet"-et is, adjuk ki a következő utasítást.

sudo apt install telnetd

kep
3. ábra   A "telnet" telepítésének a folyamata
 

Most az SSH-t telepíük, amely már titkosított protokoll. Az SSH telepíéséhez adjuk ki a következő utasítást.

sudo apt install openssh-server

kep
4. ábra   Az SSH telepítésének a folyamata
 

Végül telepítsünk egy webes kiszolgálót, az "nginx"-et (de akár az Apache is lehet). 

sudo apt install nginx

Ellenőrizzük le most, hogy a most telepített protokollok elérhetők-e távolról. Indítsuk el a Kali Linux virtuális gépet úgy, hogy egy hálózatban legyen a két virtuális gép. Ezután a Kali Linux terminálablakában futtassunk egy port scant. Egyik legelterjedtebb port scan az nmap, használjuk mi is ezt az alkalmazást. Végezzünk teljes port scant (-p-).

sudo nmap -p- IP cím

A "-p-" kapcsolóval minden egyes TCP port állapota vizsgálatra kerül.

kep
5. ábra   Port scan elvégzése az "nmap" alkalmazással
 

Látható az 5. ábrán, hogy az összes olyan IT protokoll telepítésre került, amely egy "átlagos" PLC-ben megtalálható. Például a Siemens S7-1200-as PLC-k tartalmaznak (függ a firmware-től) olyan webszervert, amely a 443-as porton érhető el. Az Nginx-nél alkalmazható a 443-as port is, ennek a beállításával ebben a cikkben nem foglalkozunk.

Folytassuk most a telepítéseket, a következő részben a különböző főbb OT protokollok kerülnek sorra. Az "S7" Siemens protokoll emulálására szükség lesz a "Snap7"-re. A Snap7 legújabb verziója "z7" file-ként tölthető le, a kicsomagoláshoz szükséges lesz a "p7zip" telepítésére (illetve javasolt még az "Midnight Commander" telepítése is).

sudo apt install p7zip

A Midnight Commander telepítéséhez a következő utasítás kiadása szükséges.

sudo apt install mc

kep
6. ábra   A "z7" telepítésének a folyamata
 

Szükséges alkalmaznunk a Pythont is, mert például a Modbus használatánál ez kötelező lesz, illetve a Python csomagok telepítésénél a "pip" elengedhetetlen, ezzel menedzselhetők a különböző Python csomagok. Ezért a további telepítés ezzel folytatódik.

sudo apt install python3-pip

kep
7. ábra   A "python3-pip" telepítésének a folyamata
 

A "twisted" (hálózati megoldások, illetve a pymodbus miatt kell) telepítéséhez a következő utasítást adjuk ki.

sudo apt install twisted

kep
8. ábra   A "twisted" telepítésének a folyamata
 

Célszerű telepíteni a "testresources"-t is (pymodbus miatt), adjuk ki ehhez a következő parancsot.

sudo apt install testresources

kep
9. ábra   A "testresources" telepítésének a folyamata
 

Telepítsük a "pytest" csomagot is (a cpppo csomag miatt kell).

sudo apt install pytest

kep
10. ábra   A "pytest" telepítésének a folyamata
 

Ahhoz, hogy az Ethernet/IP-t is használni tudjuk a virtuális PLC-n, szükséges telepíteni a "cpppo" Python csomagot is. Adjuk ki a következő utasítást.

sudo apt install cpppo

kep
11. ábra   A "cpppo" telepítésének a folyamata
 

Most már a "pymodbus" csomag telepítése van hátra. Ennek a segítségével az iparban elterjedt, szinte mindenhol használt Modbus/TCP protokoll emulálható. Készíthetünk saját alkalmazást is Python nyelven, de akár a Github-on is találunk szerver/kliens alkalmazásokat, amelyek a fent említett kommunikációs megoldást használják.
Adjuk ki a következő utasítást, hogy a későbbiekben a Modbus/TCP-t használni tudjuk.

pip3 install pymodbus

kep
12. ábra   A "pymodbus" telepítésének a folyamata
 

Ahhoz, hogy a Siemens protokoll elérhető legyen a virtuális PLC-n, le kell töltenünk a snap7 tömörített file-t, majd a kicsomagolás után a következő lépések végrehajtása is szükséges.

A telepítéshez szükséges file-ok itt érhetők el:

https://sourceforge.net/projects/snap7/files/

 

A "z7" tömörített file letöltési linkje a következő:

https://sourceforge.net/projects/snap7/files/1.4.2/snap7-full-1.4.2.7z/download

Töltsük le ezt a file-t, és csomagoljuk ki a főkönyvtárba, majd listázzuk ki a "build/unix" könyvtár tartalmát. Ehhez a következő utasítások kiadása szükséges.

cd build/unix
ls -l

kep
13. ábra   A "build/unix"  könyvtár tartalma
 

Fordítsuk le azt az "*.mk" file-t, amelyet az általunk használt architektúrán használni fogunk. Az Ubuntu VM-en a következő utasítást kell alkalmazni.

make -f x86_64_linux.mk

A kiválasztott file fordítási folyamata látható a 14. ábrán.

kep
14. ábra   A "x86_64_linux.mk" file fordítása
 

A következő utasítások kiadása szükséges.

cd ../bin/x86_64-linux
sudo cp libsnap7.so /usr/lib
sudo ldconfig

kep
15. ábra   A letöltött snap7 file  fordításának a folyamata
 

Végül még a "snap7" telepítése kell, ehhez adjuk ki a következő utasítást.

sudo pip3 install python-snap7

kep
16. ábra   A "snap7" telepítésének a folyamata
 

Próbáljuk most ki a snap7-et, amely a Siemens S7 protokolljáért "felel". Létrehozunk most egy S7 protokollt alkalmazóó szervert a virtuális gépen. Ahhoz, hogy a Python nyelven elérjük a hálózati interfészt, szükséges a root jogosultság, ezért a Python-t így indítsuk el:

sudo python3

Használni fogjuk a "snap7" csomagot.

import snap7

Ezután hozzunk létre egy snap7-es szervert.

s7s = snap7.server.Server()

Létrehozzuk a kérdéses szolgáltatást.

s7s.create()

Elindítjuk a 102-es porton megtalálható, a Siemens S7-es protokollját alkalmazó szervert.

s7s.start()

A "get_status()" függvénnyel az előbb létrehozott szerver állapota kérdezhető le (ez egyébként elhagyható, a szerver állapota ellenőrizhető port scannel is).

s7s.get_status()

kep
17. ábra   Az S7 Siemens kommunikációs protokoll már működik az Ubuntu virtuális gépen
 

Indítsuk el egy másik terminálablakban az Ethernet/IP szolgáltatást is, adjuk ki a következő utasítást.

python3 -m cpppo.server.einp -v

Az Ethernet/IP szolgáltatás már elérhetó a virtuális PLC-n (18. ábra).

kep
18. ábra   Az Ethernet/IP szolgáltatás elindítása a virtuális PLC-n
 

Futtassunk a Kali Linux VM alatt elérhető nmap alkalmazással egy újabb port scant.

sudo nmap -p- IP cím

Látható a 19. ábrán, hogy a port scan felfedezett két új nyitott TCP portot, a 102-esen található S7-et, illetve a 44818-on lévő Ethernet/IP-t.

kep
19. ábra   A port scan eredménye. két ipari protokoll is elérhető már a  virtuális PLC-n
 

Végül, indítsuk el a Modbus szervert is. Fontos, hogy ehhez egy Python nyelven írt alkalmazás szükséges, amely a következő cikkünkben kerül ismertetésre.

sudo python3 server2.py

kep
20. ábra   A virtuális PLC-n fut a Modbus/TCP szerver
 

Ha most egy újabb port scant hajtunk végre a Kali Linux VM-en, akkor már látható lesz az 502-es TCP port is (21. ábra). 

kep
21. ábra   Újabb port scan eredménye a Kali Linux terminálablakán
 

Végül telepítsük az OPC UA implementálását tartalmazó csomagot. Ehhez upgrade-eljük az "ipython" csomagot (ez a lépés egyébként kihagyható).

pip3 install --upgrade pip ipython

kep
22. ábra   Az "ipython" csomag frissítése
 

Most telepítsük az "opcua" csomagot.

pip3 install opcua

kep
23. ábra   Az "opcua" csomag telepítése
 

Alkalmazzuk most a telepített "opcua" csomagot, root jogosultsággal indítsuk el a Pythont. 

sudo python3

Most importáljuk be az "opcua" csomagot.

import opcua

Hozzuk létre a szervert.

serverOPCUA = opcua.server.server.Server()

Indítsuk el az OPC UA szervert.

serverOPCUA.start()

Az OPC UA szerver elindult a 4840-es TCP porton. Az "opcua" csomag alkalmazásánál nincs arra lehetőség, hogy lekérdezzük a szerver állapotát.

kep
24. ábra   A virtuális PLC-n fut a Modbus/TCP szerver
 

Indítsunk újra egy port scant a Kali Linux virtuális gépen. Megjegyezzük, hogy a többi ipari protokollt megvalósító szolgáltatás leállításra került.

sudo nmap -p- IP cím

kep
24. ábra   A port scan eredménye, látható a 4840-es TCP port állapota. az OPC UA szerver működik
 

Megjegyezzük azt, hogy a felhasznált Ubuntu 22.04-es virtuáis gépen nem alkalmaztuk a tűzfalat. Ha használnánk tűzfalat, akkor az adott TCP portokat engedélyezni kell, hogy a távolról az adott portokon lévő szolgáltatások használhatók legyenek.

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .

Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .